From 4c1a8a21b99c3e80fd022651cc5c703d89b211ba Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Sun, 1 Dec 2013 20:17:52 -0800 Subject: [PATCH] Fix assertion failure when deleting all lines Lines need to be deselected before they're deleted, but new lines need to be committed before they can be selected, so reorder things to remove -> insert new line if needed -> commit -> update selection -> delete. --- aegisub/src/ass_karaoke.cpp | 4 ++-- aegisub/src/command/edit.cpp | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/aegisub/src/ass_karaoke.cpp b/aegisub/src/ass_karaoke.cpp index b7f65f110..90ffc7c81 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/command/edit.cpp b/aegisub/src/command/edit.cpp index 21b84a493..bf2ab5cc4 100644 --- a/aegisub/src/command/edit.cpp +++ b/aegisub/src/command/edit.cpp @@ -503,10 +503,16 @@ static void delete_lines(agi::Context *c, wxString const& commit_message) { pre_sel = diag; } - // Delete selected lines + // Remove the selected lines, but defer the deletion until after we select + // different lines. We can't just change the selection first because we may + // need to create a new dialogue line for it, and we can't select dialogue + // lines until after they're committed. + std::vector> to_delete; c->ass->Line.remove_and_dispose_if([&sel](AssEntry const& e) { return sel.count(const_cast(static_cast(&e))); - }, [](AssEntry *e) { delete e; }); + }, [&](AssEntry *e) { + to_delete.emplace_back(e); + }); AssDialogue *new_active = post_sel; if (!new_active) @@ -518,11 +524,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 {