Use SetSelectionAndActive whenever both are set at once

I'm not sure if this fixes any current actual problems as using slightly
stale data is normally only a problem when lines are being deleted, but
it's easier to fix it across the board than to figure out where it is
and isn't needed, and the speed impact of batching is trivial.

Originally committed to SVN as r6753.
This commit is contained in:
Thomas Goyne 2012-05-05 02:11:09 +00:00
parent f756aa73c1
commit 06e23b9296
8 changed files with 23 additions and 23 deletions

View file

@ -321,9 +321,10 @@ void AssKaraoke::SplitLines(std::set<AssDialogue*> const& lines, agi::Context *c
--it; --it;
} }
c->selectionController->SetSelectedSet(sel); AssDialogue *new_active = c->selectionController->GetActiveLine();
if (!sel.count(c->selectionController->GetActiveLine())) if (!sel.count(c->selectionController->GetActiveLine()))
c->selectionController->SetActiveLine(*sel.begin()); new_active = *sel.begin();
c->selectionController->SetSelectionAndActive(sel, new_active);
if (did_split) if (did_split)
c->ass->Commit(_("splitting"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); c->ass->Commit(_("splitting"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL);

View file

@ -955,9 +955,10 @@ namespace Automation4 {
lua_pop(L, 1); lua_pop(L, 1);
} }
c->selectionController->SetSelectedSet(sel); AssDialogue *new_active = c->selectionController->GetActiveLine();
if (active_line && (active_idx > 0 || !sel.count(c->selectionController->GetActiveLine()))) if (active_line && (active_idx > 0 || !sel.count(new_active)))
c->selectionController->SetActiveLine(active_line); new_active = active_line;
c->selectionController->SetSelectionAndActive(sel, new_active);
} }
stackcheck.check_stack(1); stackcheck.check_stack(1);

View file

@ -189,8 +189,7 @@ static void duplicate_lines(agi::Context *c, bool shift) {
c->ass->Commit(_("duplicate lines"), AssFile::COMMIT_DIAG_ADDREM); c->ass->Commit(_("duplicate lines"), AssFile::COMMIT_DIAG_ADDREM);
c->selectionController->SetSelectedSet(new_sel); c->selectionController->SetSelectionAndActive(new_sel, new_active);
c->selectionController->SetActiveLine(new_active);
} }
/// Duplicate the selected lines. /// Duplicate the selected lines.
@ -249,8 +248,7 @@ static void combine_lines(agi::Context *c, void (*combiner)(AssDialogue *, AssDi
c->ass->Line.erase(out, c->ass->Line.end()); c->ass->Line.erase(out, c->ass->Line.end());
sel.clear(); sel.clear();
sel.insert(first); sel.insert(first);
c->selectionController->SetActiveLine(first); c->selectionController->SetSelectionAndActive(sel, first);
c->selectionController->SetSelectedSet(sel);
c->ass->Commit(message, AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); c->ass->Commit(message, AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL);
} }

View file

@ -173,8 +173,7 @@ struct subtitle_insert_after : public validate_nonempty_selection {
c->ass->Commit(_("line insertion"), AssFile::COMMIT_DIAG_ADDREM); c->ass->Commit(_("line insertion"), AssFile::COMMIT_DIAG_ADDREM);
SelectionController<AssDialogue>::Selection sel; SelectionController<AssDialogue>::Selection sel;
sel.insert(new_line); sel.insert(new_line);
c->selectionController->SetSelectedSet(sel); c->selectionController->SetSelectionAndActive(sel, new_line);
c->selectionController->SetActiveLine(new_line);
} }
}; };
@ -221,8 +220,7 @@ struct subtitle_insert_before : public validate_nonempty_selection {
c->ass->Commit(_("line insertion"), AssFile::COMMIT_DIAG_ADDREM); c->ass->Commit(_("line insertion"), AssFile::COMMIT_DIAG_ADDREM);
SelectionController<AssDialogue>::Selection sel; SelectionController<AssDialogue>::Selection sel;
sel.insert(new_line); sel.insert(new_line);
c->selectionController->SetSelectedSet(sel); c->selectionController->SetSelectionAndActive(sel, new_line);
c->selectionController->SetActiveLine(new_line);
} }
}; };

View file

@ -275,6 +275,11 @@ void DialogSelection::Process(wxCommandEvent&) {
con->selectionController->SetActiveLine(*new_sel.begin()); con->selectionController->SetActiveLine(*new_sel.begin());
con->selectionController->SetSelectedSet(new_sel); con->selectionController->SetSelectedSet(new_sel);
AssDialogue *new_active = con->selectionController->GetActiveLine();
if (new_sel.size() && !new_sel.count(new_active))
new_active = *new_sel.begin();
con->selectionController->SetSelectionAndActive(new_sel, new_active);
Close(); Close();
} }

View file

@ -267,10 +267,9 @@ bool DialogSpellChecker::CheckLine(AssDialogue *active_line, int start_pos, int
std::map<wxString, wxString>::const_iterator auto_rep = auto_replace.find(word); std::map<wxString, wxString>::const_iterator auto_rep = auto_replace.find(word);
if (auto_rep == auto_replace.end()) { if (auto_rep == auto_replace.end()) {
context->selectionController->SetActiveLine(active_line);
SelectionController<AssDialogue>::Selection sel; SelectionController<AssDialogue>::Selection sel;
sel.insert(active_line); sel.insert(active_line);
context->selectionController->SetSelectedSet(sel); context->selectionController->SetSelectionAndActive(sel, active_line);
SetWord(word); SetWord(word);
return true; return true;
} }

View file

@ -155,11 +155,9 @@ void SubtitlesGrid::RecombineLines() {
newSel.insert(*lines.begin()); newSel.insert(*lines.begin());
// Restore selection // Restore selection
SetSelectedSet(newSel); if (!newSel.count(activeLine))
if (find(newSel.begin(), newSel.end(), activeLine) == newSel.end()) {
activeLine = *newSel.begin(); activeLine = *newSel.begin();
} SetSelectionAndActive(newSel, activeLine);
SetActiveLine(activeLine);
context->ass->Commit(_("combining"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); context->ass->Commit(_("combining"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL);
} }

View file

@ -355,11 +355,11 @@ void VisualTool<FeatureType>::RemoveSelection(feature_iterator feat) {
// Set the active line to an arbitrary selected line if we just // Set the active line to an arbitrary selected line if we just
// deselected the active line // deselected the active line
if (feat->line == c->selectionController->GetActiveLine()) { AssDialogue *new_active = c->selectionController->GetActiveLine();
c->selectionController->SetActiveLine(*sel.begin()); if (feat->line == new_active)
} new_active = *sel.begin();
c->selectionController->SetSelectedSet(sel); c->selectionController->SetSelectionAndActive(sel, new_active);
} }
//////// PARSERS //////// PARSERS