From eee4da06423bcb1c84dcc2b4430777329f423b93 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Sun, 27 Oct 2013 06:59:56 -0700 Subject: [PATCH] Change the selection before committing deletions of lines For whatever reason this was sometimes being done after the commit, which resulted in a lot of code only working by coincidence when the grid commit handler happened to be the first one to be called. --- aegisub/src/ass_karaoke.cpp | 4 ++-- aegisub/src/base_grid.cpp | 11 +---------- aegisub/src/command/edit.cpp | 5 +++-- aegisub/src/subs_controller.cpp | 3 ++- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/aegisub/src/ass_karaoke.cpp b/aegisub/src/ass_karaoke.cpp index e5cf8bb44..c0c803039 100644 --- a/aegisub/src/ass_karaoke.cpp +++ b/aegisub/src/ass_karaoke.cpp @@ -315,10 +315,10 @@ void AssKaraoke::SplitLines(std::set const& lines, agi::Context *c if (!did_split) return; - c->ass->Commit(_("splitting"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); - AssDialogue *new_active = c->selectionController->GetActiveLine(); if (!sel.count(c->selectionController->GetActiveLine())) new_active = *sel.begin(); c->selectionController->SetSelectionAndActive(sel, new_active); + + c->ass->Commit(_("splitting"), AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); } diff --git a/aegisub/src/base_grid.cpp b/aegisub/src/base_grid.cpp index 2e0f3a7f0..7fd3514ca 100644 --- a/aegisub/src/base_grid.cpp +++ b/aegisub/src/base_grid.cpp @@ -320,14 +320,8 @@ void BaseGrid::UpdateMaps(bool preserve_selected_rows) { SetSelectedSet(new_sel); } - // Force a reannounce of the active line if it hasn't changed, as it isn't - // safe to touch the active line while processing a commit event which would - // cause this function to be called - AssDialogue *line = active_line; - active_line = nullptr; - // The active line may have ceased to exist; pick a new one if so - if (line_index_map.size() && line_index_map.find(line) == line_index_map.end()) { + if (line_index_map.size() && !line_index_map.count(active_line)) { if (active_row < (int)index_line_map.size()) SetActiveLine(index_line_map[active_row]); else if (preserve_selected_rows && !selection.empty()) @@ -335,9 +329,6 @@ void BaseGrid::UpdateMaps(bool preserve_selected_rows) { else SetActiveLine(index_line_map.back()); } - else { - SetActiveLine(line); - } if (selection.empty() && active_line) { Selection sel; diff --git a/aegisub/src/command/edit.cpp b/aegisub/src/command/edit.cpp index 116be9de2..837e09c4f 100644 --- a/aegisub/src/command/edit.cpp +++ b/aegisub/src/command/edit.cpp @@ -494,11 +494,11 @@ static void delete_lines(agi::Context *c, wxString const& commit_message) { c->ass->InsertLine(new_active); } - c->ass->Commit(commit_message, AssFile::COMMIT_DIAG_ADDREM); - sel.clear(); sel.insert(new_active); c->selectionController->SetSelectionAndActive(sel, new_active); + + c->ass->Commit(commit_message, AssFile::COMMIT_DIAG_ADDREM); } struct edit_line_copy : public validate_sel_nonempty { @@ -670,6 +670,7 @@ static void combine_lines(agi::Context *c, void (*combiner)(AssDialogue *, AssDi sel.clear(); sel.insert(first); c->selectionController->SetSelectionAndActive(sel, first); + c->ass->Commit(message, AssFile::COMMIT_DIAG_ADDREM | AssFile::COMMIT_DIAG_FULL); } diff --git a/aegisub/src/subs_controller.cpp b/aegisub/src/subs_controller.cpp index 2cfa237a0..c2164d610 100644 --- a/aegisub/src/subs_controller.cpp +++ b/aegisub/src/subs_controller.cpp @@ -208,7 +208,8 @@ void SubsController::Close() { redo_stack.clear(); autosaved_commit_id = saved_commit_id = commit_id + 1; filename.clear(); - context->ass->Line.clear(); + AssFile blank; + swap(blank.Line, context->ass->Line); context->ass->LoadDefault(); context->ass->Commit("", AssFile::COMMIT_NEW); }