From c8d4df1355aa7ce3c9aaf1464d517feb5a2218cc Mon Sep 17 00:00:00 2001 From: arch1t3cht Date: Tue, 23 Aug 2022 16:11:23 +0200 Subject: [PATCH] Add option to sort subtitles by text --- src/ass_file.cpp | 6 ++++ src/ass_file.h | 4 +++ src/command/grid.cpp | 52 ++++++++++++++++++++++++++++++ src/libresrc/default_menu.json | 4 +++ src/libresrc/osx/default_menu.json | 4 +++ 5 files changed, 70 insertions(+) diff --git a/src/ass_file.cpp b/src/ass_file.cpp index bd06c562e..6fbc0a01c 100644 --- a/src/ass_file.cpp +++ b/src/ass_file.cpp @@ -200,6 +200,12 @@ bool AssFile::CompEffect(AssDialogue const& lft, AssDialogue const& rgt) { bool AssFile::CompLayer(AssDialogue const& lft, AssDialogue const& rgt) { return lft.Layer < rgt.Layer; } +bool AssFile::CompText(AssDialogue const& lft, AssDialogue const& rgt) { + return lft.Text < rgt.Text; +} +bool AssFile::CompTextStripped(AssDialogue const& lft, AssDialogue const& rgt) { + return lft.GetStrippedText() < rgt.GetStrippedText(); +} void AssFile::Sort(CompFunc comp, std::set const& limit) { Sort(Events, comp, limit); diff --git a/src/ass_file.h b/src/ass_file.h index db848cd1e..df09d462a 100644 --- a/src/ass_file.h +++ b/src/ass_file.h @@ -194,6 +194,10 @@ public: static bool CompEffect(AssDialogue const& lft, AssDialogue const& rgt); /// Compare based on layer static bool CompLayer(AssDialogue const& lft, AssDialogue const& rgt); + /// Compare based on text + static bool CompText(AssDialogue const& lft, AssDialogue const& rgt); + /// Compare based on stripped text + static bool CompTextStripped(AssDialogue const& lft, AssDialogue const& rgt); /// @brief Sort the dialogue lines in this file /// @param comp Comparison function to use. Defaults to sorting by start time. diff --git a/src/command/grid.cpp b/src/command/grid.cpp index d0a9d165b..04d177970 100644 --- a/src/command/grid.cpp +++ b/src/command/grid.cpp @@ -248,6 +248,54 @@ struct grid_sort_style_selected final : public validate_sel_multiple { } }; +struct grid_sort_text final : public Command { + CMD_NAME("grid/sort/text") + STR_MENU("Te&xt") + STR_DISP("Text") + STR_HELP("Sort all subtitles by their text, including styling tags") + + void operator()(agi::Context *c) override { + c->ass->Sort(AssFile::CompText); + c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER); + } +}; + +struct grid_sort_text_selected final : public validate_sel_multiple { + CMD_NAME("grid/sort/text/selected") + STR_MENU("Te&xt") + STR_DISP("Text") + STR_HELP("Sort selected subtitles by their text, including styling tags") + + void operator()(agi::Context *c) override { + c->ass->Sort(AssFile::CompText, c->selectionController->GetSelectedSet()); + c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER); + } +}; + +struct grid_sort_text_stripped final : public Command { + CMD_NAME("grid/sort/text_stripped") + STR_MENU("Stri&pped Text") + STR_DISP("Stripped Text") + STR_HELP("Sort all subtitles by their stripped text") + + void operator()(agi::Context *c) override { + c->ass->Sort(AssFile::CompTextStripped); + c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER); + } +}; + +struct grid_sort_text_stripped_selected final : public validate_sel_multiple { + CMD_NAME("grid/sort/text_stripped/selected") + STR_MENU("Stri&pped Text") + STR_DISP("Stripped Text") + STR_HELP("Sort selected subtitles by their stripped text") + + void operator()(agi::Context *c) override { + c->ass->Sort(AssFile::CompTextStripped, c->selectionController->GetSelectedSet()); + c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER); + } +}; + struct grid_tag_cycle_hiding final : public Command { CMD_NAME("grid/tag/cycle_hiding") CMD_ICON(toggle_tag_hiding) @@ -411,12 +459,16 @@ namespace cmd { reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); + reg(agi::make_unique()); + reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); + reg(agi::make_unique()); + reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); reg(agi::make_unique()); diff --git a/src/libresrc/default_menu.json b/src/libresrc/default_menu.json index 36f9c5d22..91ab1348d 100644 --- a/src/libresrc/default_menu.json +++ b/src/libresrc/default_menu.json @@ -109,6 +109,8 @@ { "command" : "grid/sort/style" }, { "command" : "grid/sort/actor" }, { "command" : "grid/sort/effect" }, + { "command" : "grid/sort/text" }, + { "command" : "grid/sort/text_stripped" }, { "command" : "grid/sort/layer" } ], "main/subtitle/sort selected lines" : [ @@ -117,6 +119,8 @@ { "command" : "grid/sort/style/selected" }, { "command" : "grid/sort/actor/selected" }, { "command" : "grid/sort/effect/selected" }, + { "command" : "grid/sort/text/selected" }, + { "command" : "grid/sort/text_stripped/selected" }, { "command" : "grid/sort/layer/selected" } ], "main/timing" : [ diff --git a/src/libresrc/osx/default_menu.json b/src/libresrc/osx/default_menu.json index a05e0f411..d1e039ffa 100644 --- a/src/libresrc/osx/default_menu.json +++ b/src/libresrc/osx/default_menu.json @@ -111,6 +111,8 @@ { "command" : "grid/sort/style" }, { "command" : "grid/sort/actor" }, { "command" : "grid/sort/effect" }, + { "command" : "grid/sort/text" }, + { "command" : "grid/sort/text_stripped" }, { "command" : "grid/sort/layer" } ], "main/subtitle/sort selected lines" : [ @@ -119,6 +121,8 @@ { "command" : "grid/sort/style/selected" }, { "command" : "grid/sort/actor/selected" }, { "command" : "grid/sort/effect/selected" }, + { "command" : "grid/sort/text/selected" }, + { "command" : "grid/sort/text_stripped/selected" }, { "command" : "grid/sort/layer/selected" } ], "main/timing" : [