From 0645b4d5792111cc992b85cda6694c95ab43408f Mon Sep 17 00:00:00 2001 From: mitaclaw <140017135+mitaclaw@users.noreply.github.com> Date: Tue, 5 Mar 2024 14:02:45 -0800 Subject: [PATCH] BranchWatchDialog: Fix Misc. Errata Window icon was missing from QDialog lacking a parent. Giving the QDialog a parent revealed I had failed to make it properly non-modal, necessitating further changes. Settings save less often, now only upon destruction. Construction of BranchWatchDialog is now deferred. --- .../DolphinQt/Debugger/BranchWatchDialog.cpp | 30 ++++++++++--------- .../DolphinQt/Debugger/BranchWatchDialog.h | 10 +++++-- Source/Core/DolphinQt/Debugger/CodeWidget.cpp | 18 ++++++----- Source/Core/DolphinQt/Debugger/CodeWidget.h | 2 +- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Source/Core/DolphinQt/Debugger/BranchWatchDialog.cpp b/Source/Core/DolphinQt/Debugger/BranchWatchDialog.cpp index f5e6a5acc3..f45da30d20 100644 --- a/Source/Core/DolphinQt/Debugger/BranchWatchDialog.cpp +++ b/Source/Core/DolphinQt/Debugger/BranchWatchDialog.cpp @@ -504,15 +504,9 @@ BranchWatchDialog::BranchWatchDialog(Core::System& system, Core::BranchWatch& br restoreGeometry(settings.value(QStringLiteral("branchwatchdialog/geometry")).toByteArray()); } -void BranchWatchDialog::done(int r) +BranchWatchDialog::~BranchWatchDialog() { - if (m_timer->isActive()) - m_timer->stop(); - auto& settings = Settings::GetQSettings(); - settings.setValue(QStringLiteral("branchwatchdialog/geometry"), saveGeometry()); - settings.setValue(QStringLiteral("branchwatchdialog/tableheader/state"), - m_table_view->horizontalHeader()->saveState()); - QDialog::done(r); + SaveSettings(); } static constexpr int BRANCH_WATCH_TOOL_TIMER_DELAY_MS = 100; @@ -523,18 +517,18 @@ static bool TimerCondition(const Core::BranchWatch& branch_watch, Core::State st return branch_watch.GetRecordingActive() && state > Core::State::Paused; } -int BranchWatchDialog::exec() +void BranchWatchDialog::hideEvent(QHideEvent* event) { - if (TimerCondition(m_branch_watch, Core::GetState())) - m_timer->start(BRANCH_WATCH_TOOL_TIMER_DELAY_MS); - return QDialog::exec(); + if (m_timer->isActive()) + m_timer->stop(); + QDialog::hideEvent(event); } -void BranchWatchDialog::open() +void BranchWatchDialog::showEvent(QShowEvent* event) { if (TimerCondition(m_branch_watch, Core::GetState())) m_timer->start(BRANCH_WATCH_TOOL_TIMER_DELAY_MS); - QDialog::open(); + QDialog::showEvent(event); } void BranchWatchDialog::OnStartPause(bool checked) @@ -927,6 +921,14 @@ void BranchWatchDialog::OnTableCopyAddress(QModelIndexList index_list) QApplication::clipboard()->setText(text); } +void BranchWatchDialog::SaveSettings() +{ + auto& settings = Settings::GetQSettings(); + settings.setValue(QStringLiteral("branchwatchdialog/geometry"), saveGeometry()); + settings.setValue(QStringLiteral("branchwatchdialog/tableheader/state"), + m_table_view->horizontalHeader()->saveState()); +} + void BranchWatchDialog::Update() { if (m_branch_watch.GetRecordingPhase() == Core::BranchWatch::Phase::Blacklist) diff --git a/Source/Core/DolphinQt/Debugger/BranchWatchDialog.h b/Source/Core/DolphinQt/Debugger/BranchWatchDialog.h index b167ca106d..d97972980c 100644 --- a/Source/Core/DolphinQt/Debugger/BranchWatchDialog.h +++ b/Source/Core/DolphinQt/Debugger/BranchWatchDialog.h @@ -49,9 +49,11 @@ class BranchWatchDialog : public QDialog public: explicit BranchWatchDialog(Core::System& system, Core::BranchWatch& branch_watch, CodeWidget* code_widget, QWidget* parent = nullptr); - void done(int r) override; - int exec() override; - void open() override; + ~BranchWatchDialog() override; + +protected: + void hideEvent(QHideEvent* event) override; + void showEvent(QShowEvent* event) override; private: void OnStartPause(bool checked); @@ -82,6 +84,8 @@ private: void OnTableSetNOP(QModelIndexList index_list); void OnTableCopyAddress(QModelIndexList index_list); + void SaveSettings(); + public: // TODO: Step doesn't cause EmulationStateChanged to be emitted, so it has to call this manually. void Update(); diff --git a/Source/Core/DolphinQt/Debugger/CodeWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeWidget.cpp index 94662bba71..382ec03861 100644 --- a/Source/Core/DolphinQt/Debugger/CodeWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/CodeWidget.cpp @@ -36,10 +36,7 @@ static const QString BOX_SPLITTER_STYLESHEET = QStringLiteral( "QSplitter::handle { border-top: 1px dashed black; width: 1px; margin-left: 10px; " "margin-right: 10px; }"); -CodeWidget::CodeWidget(QWidget* parent) - : QDockWidget(parent), m_system(Core::System::GetInstance()), - m_branch_watch_dialog( - new BranchWatchDialog(m_system, m_system.GetPowerPC().GetBranchWatch(), this)) +CodeWidget::CodeWidget(QWidget* parent) : QDockWidget(parent), m_system(Core::System::GetInstance()) { setWindowTitle(tr("Code")); setObjectName(QStringLiteral("code")); @@ -215,7 +212,12 @@ void CodeWidget::ConnectWidgets() void CodeWidget::OnBranchWatchDialog() { - m_branch_watch_dialog->open(); + if (m_branch_watch_dialog == nullptr) + { + m_branch_watch_dialog = + new BranchWatchDialog(m_system, m_system.GetPowerPC().GetBranchWatch(), this, this); + } + m_branch_watch_dialog->show(); m_branch_watch_dialog->raise(); m_branch_watch_dialog->activateWindow(); } @@ -397,7 +399,8 @@ void CodeWidget::UpdateSymbols() // TODO: There seems to be a lack of a ubiquitous signal for when symbols change. // This is the best location to catch the signals from MenuBar and CodeViewWidget. - m_branch_watch_dialog->UpdateSymbols(); + if (m_branch_watch_dialog != nullptr) + m_branch_watch_dialog->UpdateSymbols(); } void CodeWidget::UpdateFunctionCalls(const Common::Symbol* symbol) @@ -470,7 +473,8 @@ void CodeWidget::Step() // Will get a UpdateDisasmDialog(), don't update the GUI here. // TODO: Step doesn't cause EmulationStateChanged to be emitted, so it has to call this manually. - m_branch_watch_dialog->Update(); + if (m_branch_watch_dialog != nullptr) + m_branch_watch_dialog->Update(); } void CodeWidget::StepOver() diff --git a/Source/Core/DolphinQt/Debugger/CodeWidget.h b/Source/Core/DolphinQt/Debugger/CodeWidget.h index e0a5679bfb..7ccd2af2f3 100644 --- a/Source/Core/DolphinQt/Debugger/CodeWidget.h +++ b/Source/Core/DolphinQt/Debugger/CodeWidget.h @@ -72,7 +72,7 @@ private: Core::System& m_system; - BranchWatchDialog* m_branch_watch_dialog; + BranchWatchDialog* m_branch_watch_dialog = nullptr; QLineEdit* m_search_address; QPushButton* m_branch_watch;