Add commands and menu entries to sort only the selected lines. Closes #1457.

Originally committed to SVN as r6542.
This commit is contained in:
Thomas Goyne 2012-03-07 22:41:12 +00:00
parent c84c9fe6b8
commit a0b4da90f7
4 changed files with 102 additions and 8 deletions

View file

@ -730,8 +730,8 @@ bool AssFile::CompEffect(const AssDialogue* lft, const AssDialogue* rgt) {
return lft->Effect < rgt->Effect; return lft->Effect < rgt->Effect;
} }
void AssFile::Sort(CompFunc comp) { void AssFile::Sort(CompFunc comp, std::set<AssDialogue*> const& limit) {
Sort(Line, comp); Sort(Line, comp, limit);
} }
namespace { namespace {
struct AssEntryComp : public std::binary_function<const AssEntry*, const AssEntry*, bool> { struct AssEntryComp : public std::binary_function<const AssEntry*, const AssEntry*, bool> {
@ -740,15 +740,20 @@ namespace {
return comp(static_cast<const AssDialogue*>(a), static_cast<const AssDialogue*>(b)); return comp(static_cast<const AssDialogue*>(a), static_cast<const AssDialogue*>(b));
} }
}; };
inline bool is_dialogue(AssEntry *e, std::set<AssDialogue*> const& limit) {
AssDialogue *d = dynamic_cast<AssDialogue*>(e);
return d && (limit.empty() || limit.count(d));
}
} }
void AssFile::Sort(std::list<AssEntry*> &lst, CompFunc comp) { void AssFile::Sort(std::list<AssEntry*> &lst, CompFunc comp, std::set<AssDialogue*> const& limit) {
AssEntryComp compE; AssEntryComp compE;
compE.comp = comp; compE.comp = comp;
// Sort each block of AssDialogues separately, leaving everything else untouched // Sort each block of AssDialogues separately, leaving everything else untouched
for (entryIter begin = lst.begin(); begin != lst.end(); ++begin) { for (entryIter begin = lst.begin(); begin != lst.end(); ++begin) {
if (!dynamic_cast<AssDialogue*>(*begin)) continue; if (!is_dialogue(*begin, limit)) continue;
entryIter end = begin; entryIter end = begin;
while (end != lst.end() && dynamic_cast<AssDialogue*>(*end)) ++end; while (end != lst.end() && is_dialogue(*end, limit)) ++end;
// used instead of std::list::sort for partial list sorting // used instead of std::list::sort for partial list sorting
std::list<AssEntry*> tmp; std::list<AssEntry*> tmp;

View file

@ -40,6 +40,7 @@
#ifndef AGI_PRE #ifndef AGI_PRE
#include <fstream> #include <fstream>
#include <list> #include <list>
#include <set>
#include <vector> #include <vector>
#include <wx/arrstr.h> #include <wx/arrstr.h>
@ -241,10 +242,12 @@ public:
/// @brief Sort the dialogue lines in this file /// @brief Sort the dialogue lines in this file
/// @param comp Comparison function to use. Defaults to sorting by start time. /// @param comp Comparison function to use. Defaults to sorting by start time.
void Sort(CompFunc comp = CompStart); /// @param limit If non-empty, only lines in this set are sorted
void Sort(CompFunc comp = CompStart, std::set<AssDialogue*> const& limit = std::set<AssDialogue*>());
/// @brief Sort the dialogue lines in the given list /// @brief Sort the dialogue lines in the given list
/// @param comp Comparison function to use. Defaults to sorting by start time. /// @param comp Comparison function to use. Defaults to sorting by start time.
static void Sort(std::list<AssEntry*>& lst, CompFunc comp = CompStart); /// @param limit If non-empty, only lines in this set are sorted
static void Sort(std::list<AssEntry*>& lst, CompFunc comp = CompStart, std::set<AssDialogue*> const& limit = std::set<AssDialogue*>());
/// @brief Sort the dialogue lines in the given list /// @brief Sort the dialogue lines in the given list
/// @param comp Comparison function to use. Defaults to sorting by start time. /// @param comp Comparison function to use. Defaults to sorting by start time.
static void Sort(std::list<AssDialogue*>& lst, CompFunc comp = CompStart); static void Sort(std::list<AssDialogue*>& lst, CompFunc comp = CompStart);

View file

@ -114,6 +114,27 @@ struct grid_sort_actor : public Command {
} }
}; };
struct validate_sel_multiple : public Command {
CMD_TYPE(COMMAND_VALIDATE)
bool Validate(const agi::Context *c) {
return c->selectionController->GetSelectedSet().size() > 1;
}
};
/// Sort all selected subtitles by their actor names
struct grid_sort_actor_selected : public validate_sel_multiple {
CMD_NAME("grid/sort/actor/selected")
STR_MENU("&Actor Name")
STR_DISP("Actor Name")
STR_HELP("Sort selected subtitles by their actor names")
void operator()(agi::Context *c) {
c->ass->Sort(AssFile::CompActor, c->selectionController->GetSelectedSet());
c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER);
}
};
/// Sort all subtitles by their effects /// Sort all subtitles by their effects
struct grid_sort_effect : public Command { struct grid_sort_effect : public Command {
CMD_NAME("grid/sort/effect") CMD_NAME("grid/sort/effect")
@ -127,6 +148,19 @@ struct grid_sort_effect : public Command {
} }
}; };
/// Sort all selected subtitles by their effects
struct grid_sort_effect_selected : public validate_sel_multiple {
CMD_NAME("grid/sort/effect/selected")
STR_MENU("&Effect")
STR_DISP("Effect")
STR_HELP("Sort selected subtitles by their effects")
void operator()(agi::Context *c) {
c->ass->Sort(AssFile::CompEffect, c->selectionController->GetSelectedSet());
c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER);
}
};
/// Sort all subtitles by their end times. /// Sort all subtitles by their end times.
struct grid_sort_end : public Command { struct grid_sort_end : public Command {
CMD_NAME("grid/sort/end") CMD_NAME("grid/sort/end")
@ -140,6 +174,19 @@ struct grid_sort_end : public Command {
} }
}; };
/// Sort all selected subtitles by their end times.
struct grid_sort_end_selected : public validate_sel_multiple {
CMD_NAME("grid/sort/end/selected")
STR_MENU("&End Time")
STR_DISP("End Time")
STR_HELP("Sort selected subtitles by their end times")
void operator()(agi::Context *c) {
c->ass->Sort(AssFile::CompEnd, c->selectionController->GetSelectedSet());
c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER);
}
};
/// Sort all subtitles by their start times. /// Sort all subtitles by their start times.
struct grid_sort_start : public Command { struct grid_sort_start : public Command {
CMD_NAME("grid/sort/start") CMD_NAME("grid/sort/start")
@ -153,6 +200,19 @@ struct grid_sort_start : public Command {
} }
}; };
/// Sort all selected subtitles by their start times.
struct grid_sort_start_selected : public validate_sel_multiple {
CMD_NAME("grid/sort/start/selected")
STR_MENU("&Start Time")
STR_DISP("Start Time")
STR_HELP("Sort selected subtitles by their start times")
void operator()(agi::Context *c) {
c->ass->Sort(AssFile::CompStart, c->selectionController->GetSelectedSet());
c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER);
}
};
/// Sort all subtitles by their style names /// Sort all subtitles by their style names
struct grid_sort_style : public Command { struct grid_sort_style : public Command {
CMD_NAME("grid/sort/style") CMD_NAME("grid/sort/style")
@ -166,6 +226,19 @@ struct grid_sort_style : public Command {
} }
}; };
/// Sort all selected subtitles by their style names
struct grid_sort_style_selected : public validate_sel_multiple {
CMD_NAME("grid/sort/style/selected")
STR_MENU("St&yle Name")
STR_DISP("Style Name")
STR_HELP("Sort selected subtitles by their style names")
void operator()(agi::Context *c) {
c->ass->Sort(AssFile::CompStyle, c->selectionController->GetSelectedSet());
c->ass->Commit(_("sort"), AssFile::COMMIT_ORDER);
}
};
/// Cycle through tag hiding modes. /// Cycle through tag hiding modes.
struct grid_tag_cycle_hiding : public Command { struct grid_tag_cycle_hiding : public Command {
CMD_NAME("grid/tag/cycle_hiding") CMD_NAME("grid/tag/cycle_hiding")
@ -340,6 +413,11 @@ namespace cmd {
reg(new grid_sort_end); reg(new grid_sort_end);
reg(new grid_sort_start); reg(new grid_sort_start);
reg(new grid_sort_style); reg(new grid_sort_style);
reg(new grid_sort_actor_selected);
reg(new grid_sort_effect_selected);
reg(new grid_sort_end_selected);
reg(new grid_sort_start_selected);
reg(new grid_sort_style_selected);
reg(new grid_move_down); reg(new grid_move_down);
reg(new grid_move_up); reg(new grid_move_up);
reg(new grid_swap); reg(new grid_swap);

View file

@ -83,7 +83,8 @@
{ "command" : "edit/line/recombine" }, { "command" : "edit/line/recombine" },
{ "command" : "edit/line/split/by_karaoke" }, { "command" : "edit/line/split/by_karaoke" },
{}, {},
{ "submenu" : "main/subtitle/sort lines", "text" : "Sort Lines" }, { "submenu" : "main/subtitle/sort lines", "text" : "Sort All Lines" },
{ "submenu" : "main/subtitle/sort selected lines", "text" : "Sort Selected Lines" },
{ "command" : "grid/swap" }, { "command" : "grid/swap" },
{ "command" : "tool/line/select" }, { "command" : "tool/line/select" },
{ "command" : "subtitle/select/all" } { "command" : "subtitle/select/all" }
@ -106,6 +107,13 @@
{ "command" : "grid/sort/actor" }, { "command" : "grid/sort/actor" },
{ "command" : "grid/sort/effect" } { "command" : "grid/sort/effect" }
], ],
"main/subtitle/sort selected lines" : [
{ "command" : "grid/sort/start/selected" },
{ "command" : "grid/sort/end/selected" },
{ "command" : "grid/sort/style/selected" },
{ "command" : "grid/sort/actor/selected" },
{ "command" : "grid/sort/effect/selected" }
],
"main/timing" : [ "main/timing" : [
{ "command" : "time/shift" }, { "command" : "time/shift" },
{ "command" : "tool/time/postprocess" }, { "command" : "tool/time/postprocess" },