diff --git a/aegisub/src/ass_dialogue.h b/aegisub/src/ass_dialogue.h index 51b0fcde1..89bd17f38 100644 --- a/aegisub/src/ass_dialogue.h +++ b/aegisub/src/ass_dialogue.h @@ -86,6 +86,7 @@ public: class AssDialogueBlockPlain : public AssDialogueBlock { public: + using AssDialogueBlock::text; AssBlockType GetType() const override { return BLOCK_PLAIN; } AssDialogueBlockPlain(std::string const& text = std::string()) : AssDialogueBlock(text) { } }; diff --git a/aegisub/src/command/edit.cpp b/aegisub/src/command/edit.cpp index 4c9696b1f..bcb28d10f 100644 --- a/aegisub/src/command/edit.cpp +++ b/aegisub/src/command/edit.cpp @@ -65,8 +65,10 @@ #include #include #include +#include #include #include +#include #include @@ -945,6 +947,24 @@ struct edit_clear : public Command { } }; +wxString get_text(AssDialogueBlock &d) { return d.GetText(); } +struct edit_clear_text : public Command { + CMD_NAME("edit/clear/text") + STR_DISP("Clear Text") + STR_MENU("Clear Text") + STR_HELP("Clear the current line's text, leaving override tags") + + void operator()(agi::Context *c) { + AssDialogue *line = c->selectionController->GetActiveLine(); + boost::ptr_vector blocks(line->ParseTags()); + line->Text = join(blocks + | filtered([](AssDialogueBlock const& b) { return b.GetType() != BLOCK_PLAIN; }) + | transformed(get_text), + wxS("")); + c->ass->Commit(_("clear line"), AssFile::COMMIT_DIAG_TEXT, -1, line); + } +}; + struct edit_insert_original : public Command { CMD_NAME("edit/insert_original") STR_DISP("Insert Original") @@ -956,7 +976,7 @@ struct edit_insert_original : public Command { int sel_start = c->textSelectionController->GetSelectionStart(); int sel_end = c->textSelectionController->GetSelectionEnd(); - line->Text = line->Text.Left(sel_start) + c->initialLineState->GetInitialText() + line->Text.Mid(sel_end); + line->Text = line->Text.get().Left(sel_start) + c->initialLineState->GetInitialText() + line->Text.get().Mid(sel_end); c->ass->Commit(_("insert original"), AssFile::COMMIT_DIAG_TEXT, -1, line); } }; @@ -995,5 +1015,6 @@ namespace cmd { reg(new edit_revert); reg(new edit_insert_original); reg(new edit_clear); + reg(new edit_clear_text); } } diff --git a/aegisub/src/subs_edit_box.cpp b/aegisub/src/subs_edit_box.cpp index 7d7d070d6..b1e27a561 100644 --- a/aegisub/src/subs_edit_box.cpp +++ b/aegisub/src/subs_edit_box.cpp @@ -191,6 +191,7 @@ SubsEditBox::SubsEditBox(wxWindow *parent, agi::Context *context) bottom_sizer = new wxBoxSizer(wxHORIZONTAL); bottom_sizer->Add(MakeBottomButton("edit/revert")); bottom_sizer->Add(MakeBottomButton("edit/clear")); + bottom_sizer->Add(MakeBottomButton("edit/clear/text")); bottom_sizer->Add(MakeBottomButton("edit/insert_original")); main_sizer->Add(bottom_sizer); main_sizer->Hide(bottom_sizer);