diff --git a/src/command/edit.cpp b/src/command/edit.cpp index 333cdc6d5d..e99de01673 100644 --- a/src/command/edit.cpp +++ b/src/command/edit.cpp @@ -544,7 +544,7 @@ struct edit_find_replace final : public Command { void operator()(agi::Context *c) override { c->videoController->Stop(); - DialogSearchReplace::Show(c, true); + ShowSearchReplaceDialog(c, true); } }; diff --git a/src/command/subtitle.cpp b/src/command/subtitle.cpp index fe095198dd..38bb805512 100644 --- a/src/command/subtitle.cpp +++ b/src/command/subtitle.cpp @@ -96,7 +96,7 @@ struct subtitle_find final : public Command { void operator()(agi::Context *c) override { c->videoController->Stop(); - DialogSearchReplace::Show(c, false); + ShowSearchReplaceDialog(c, false); } }; @@ -110,7 +110,7 @@ struct subtitle_find_next final : public Command { void operator()(agi::Context *c) override { c->videoController->Stop(); if (!c->search->FindNext()) - DialogSearchReplace::Show(c, false); + ShowSearchReplaceDialog(c, false); } }; diff --git a/src/dialog_manager.h b/src/dialog_manager.h index b81e2be671..26a9008be8 100644 --- a/src/dialog_manager.h +++ b/src/dialog_manager.h @@ -70,6 +70,7 @@ class DialogManager { if (*diag.first == typeid(DialogType)) { diag.second->Show(); diag.second->SetFocus(); + return; } } diff --git a/src/dialog_search_replace.cpp b/src/dialog_search_replace.cpp index 7c2cb91b06..96149f1fa5 100644 --- a/src/dialog_search_replace.cpp +++ b/src/dialog_search_replace.cpp @@ -22,6 +22,7 @@ #include "dialog_search_replace.h" #include "compat.h" +#include "dialog_manager.h" #include "include/aegisub/context.h" #include "options.h" #include "search_replace_engine.h" @@ -42,11 +43,11 @@ #include #include -DialogSearchReplace::DialogSearchReplace(agi::Context* c, bool replace) -: wxDialog(c->parent, -1, replace ? _("Replace") : _("Find")) +template +DialogSearchReplace::DialogSearchReplace(agi::Context* c) +: wxDialog(c->parent, -1, has_replace ? _("Replace") : _("Find")) , c(c) , settings(agi::make_unique()) -, has_replace(replace) { auto recent_find(lagi_MRU_wxAS("Find")); auto recent_replace(lagi_MRU_wxAS("Replace")); @@ -128,10 +129,8 @@ DialogSearchReplace::DialogSearchReplace(agi::Context* c, bool replace) replace_all->Bind(wxEVT_BUTTON, std::bind(&DialogSearchReplace::FindReplace, this, &SearchReplaceEngine::ReplaceAll)); } -DialogSearchReplace::~DialogSearchReplace() { -} - -void DialogSearchReplace::FindReplace(bool (SearchReplaceEngine::*func)()) { +template +void DialogSearchReplace::FindReplace(bool (SearchReplaceEngine::*func)()) { TransferDataFromWindow(); if (settings->find.empty()) @@ -160,7 +159,7 @@ void DialogSearchReplace::FindReplace(bool (SearchReplaceEngine::*func)()) { UpdateDropDowns(); } -static void update_mru(wxComboBox *cb, const char *mru_name) { +void update_mru(wxComboBox *cb, const char *mru_name) { cb->Freeze(); cb->Clear(); cb->Append(lagi_MRU_wxAS(mru_name)); @@ -169,27 +168,33 @@ static void update_mru(wxComboBox *cb, const char *mru_name) { cb->Thaw(); } -void DialogSearchReplace::UpdateDropDowns() { +template +void DialogSearchReplace::UpdateDropDowns() { update_mru(find_edit, "Find"); if (has_replace) update_mru(replace_edit, "Replace"); } -void DialogSearchReplace::Show(agi::Context *context, bool replace) { - static DialogSearchReplace *diag = nullptr; - - if (diag && replace != diag->has_replace) { - // Already opened, but wrong type - destroy and create the right one - diag->Destroy(); - diag = nullptr; +template +void ShowSearchReplaceDialog(agi::Context *context) { + auto other = context->dialog->Get>(); + if (other != nullptr) { + other->Close(); } - if (!diag) - diag = new DialogSearchReplace(context, replace); + context->dialog->Show>(context); + auto dialog = context->dialog->Get>(); - diag->find_edit->SetFocus(); - diag->find_edit->SelectAll(); - diag->wxDialog::Show(); - diag->Raise(); + dialog->find_edit->SetFocus(); + dialog->find_edit->SelectAll(); + dialog->Raise(); +} + +void ShowSearchReplaceDialog(agi::Context *context, bool replace) { + if (replace) { + ShowSearchReplaceDialog(context); + } else { + ShowSearchReplaceDialog(context); + } } diff --git a/src/dialog_search_replace.h b/src/dialog_search_replace.h index 2d231e7ec5..1d87eac525 100644 --- a/src/dialog_search_replace.h +++ b/src/dialog_search_replace.h @@ -28,19 +28,16 @@ class SearchReplaceEngine; struct SearchReplaceSettings; class wxComboBox; +template class DialogSearchReplace final : public wxDialog { agi::Context *c; std::unique_ptr settings; - bool has_replace; - wxComboBox *find_edit; wxComboBox *replace_edit; void UpdateDropDowns(); void FindReplace(bool (SearchReplaceEngine::*func)()); public: - static void Show(agi::Context *context, bool with_replace); - - DialogSearchReplace(agi::Context* c, bool with_replace); - ~DialogSearchReplace(); + wxComboBox *find_edit; + DialogSearchReplace(agi::Context* c); }; diff --git a/src/dialogs.h b/src/dialogs.h index d781c66148..5f1f93fead 100644 --- a/src/dialogs.h +++ b/src/dialogs.h @@ -68,6 +68,7 @@ void ShowKanjiTimerDialog(agi::Context *c); void ShowLogWindow(agi::Context *c); void ShowPreferences(wxWindow *parent); void ShowPropertiesDialog(agi::Context *c); +void ShowSearchReplaceDialog(agi::Context *c, bool replace); void ShowSelectLinesDialog(agi::Context *c); void ShowShiftTimesDialog(agi::Context *c); void ShowSpellcheckerDialog(agi::Context *c);