Skip to content

Commit

Permalink
Fix crash when using search/replace with multiple windows
Browse files Browse the repository at this point in the history
Have the dialog_manager manage the search/replace dialog like the other
dialogs.
  • Loading branch information
arch1t3cht committed Dec 27, 2024
1 parent 913cc7d commit d185d07
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 30 deletions.
2 changes: 1 addition & 1 deletion src/command/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,7 @@ struct edit_find_replace final : public Command {

void operator()(agi::Context *c) override {
c->videoController->Stop();
DialogSearchReplace::Show(c, true);
ShowSearchReplaceDialog(c, true);
}
};

Expand Down
4 changes: 2 additions & 2 deletions src/command/subtitle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ struct subtitle_find final : public Command {

void operator()(agi::Context *c) override {
c->videoController->Stop();
DialogSearchReplace::Show(c, false);
ShowSearchReplaceDialog(c, false);
}
};

Expand All @@ -109,7 +109,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);
}
};

Expand Down
47 changes: 26 additions & 21 deletions src/dialog_search_replace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -41,11 +42,11 @@
#include <wx/textctrl.h>
#include <wx/valgen.h>

DialogSearchReplace::DialogSearchReplace(agi::Context* c, bool replace)
: wxDialog(c->parent, -1, replace ? _("Replace") : _("Find"))
template<bool has_replace>
DialogSearchReplace<has_replace>::DialogSearchReplace(agi::Context* c)
: wxDialog(c->parent, -1, has_replace ? _("Replace") : _("Find"))
, c(c)
, settings(std::make_unique<SearchReplaceSettings>())
, has_replace(replace)
{
auto recent_find(lagi_MRU_wxAS("Find"));
auto recent_replace(lagi_MRU_wxAS("Replace"));
Expand Down Expand Up @@ -127,10 +128,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<bool has_replace>
void DialogSearchReplace<has_replace>::FindReplace(bool (SearchReplaceEngine::*func)()) {
TransferDataFromWindow();

if (settings->find.empty())
Expand Down Expand Up @@ -168,27 +167,33 @@ static void update_mru(wxComboBox *cb, const char *mru_name) {
cb->Thaw();
}

void DialogSearchReplace::UpdateDropDowns() {
template<bool has_replace>
void DialogSearchReplace<has_replace>::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<bool replace>
void ShowSearchReplaceDialog(agi::Context *context) {
auto other = context->dialog->Get<DialogSearchReplace<!replace>>();
if (other != nullptr) {
other->Close();
}

if (!diag)
diag = new DialogSearchReplace(context, replace);
context->dialog->Show<DialogSearchReplace<replace>>(context);
auto dialog = context->dialog->Get<DialogSearchReplace<replace>>();

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<true>(context);
} else {
ShowSearchReplaceDialog<false>(context);
}
}
9 changes: 3 additions & 6 deletions src/dialog_search_replace.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,16 @@ class SearchReplaceEngine;
struct SearchReplaceSettings;
class wxComboBox;

template<bool has_replace>
class DialogSearchReplace final : public wxDialog {
agi::Context *c;
std::unique_ptr<SearchReplaceSettings> 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);
};
1 change: 1 addition & 0 deletions src/dialogs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit d185d07

Please sign in to comment.