From d53e766d6595d8cdd74f1f8316c82f7fa9e7bb3e Mon Sep 17 00:00:00 2001 From: TryTwo Date: Wed, 9 Jul 2025 23:00:00 -0700 Subject: [PATCH] CodeWidget: Add button that prevents automatic updates to the address, such as navigating to the PC on pause. --- Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp | 11 +++++++++-- Source/Core/DolphinQt/Debugger/CodeViewWidget.h | 2 ++ Source/Core/DolphinQt/Debugger/CodeWidget.cpp | 13 ++++++++++++- Source/Core/DolphinQt/Debugger/CodeWidget.h | 2 ++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp index e555054938..a430be15a3 100644 --- a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp @@ -181,11 +181,13 @@ CodeViewWidget::CodeViewWidget() &CodeViewWidget::OnDebugFontChanged); connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [this] { - m_address = m_system.GetPPCState().pc; + if (!m_lock_address && Core::GetState(m_system) == Core::State::Paused) + m_address = m_system.GetPPCState().pc; Update(); }); connect(Host::GetInstance(), &Host::UpdateDisasmDialog, this, [this] { - m_address = m_system.GetPPCState().pc; + if (!m_lock_address && Core::GetState(m_system) == Core::State::Paused) + m_address = m_system.GetPPCState().pc; Update(); }); connect(Host::GetInstance(), &Host::PPCSymbolsChanged, this, @@ -538,6 +540,11 @@ u32 CodeViewWidget::GetAddress() const return m_address; } +void CodeViewWidget::OnLockAddress(bool lock) +{ + m_lock_address = lock; +} + void CodeViewWidget::SetAddress(u32 address, SetAddressUpdate update) { if (m_address == address) diff --git a/Source/Core/DolphinQt/Debugger/CodeViewWidget.h b/Source/Core/DolphinQt/Debugger/CodeViewWidget.h index 6760c082eb..d1eeef49ef 100644 --- a/Source/Core/DolphinQt/Debugger/CodeViewWidget.h +++ b/Source/Core/DolphinQt/Debugger/CodeViewWidget.h @@ -41,6 +41,7 @@ public: ~CodeViewWidget() override; u32 GetAddress() const; + void OnLockAddress(bool lock); u32 GetContextAddress() const; void SetAddress(u32 address, SetAddressUpdate update); @@ -111,6 +112,7 @@ private: bool m_updating = false; u32 m_address = 0; + bool m_lock_address = false; u32 m_context_address = 0; std::vector m_branches; diff --git a/Source/Core/DolphinQt/Debugger/CodeWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeWidget.cpp index 002ea47570..e5aaa1c2cd 100644 --- a/Source/Core/DolphinQt/Debugger/CodeWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/CodeWidget.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ #include "Core/System.h" #include "DolphinQt/Debugger/BranchWatchDialog.h" #include "DolphinQt/Host.h" +#include "DolphinQt/Resources.h" #include "DolphinQt/Settings.h" static const QString BOX_SPLITTER_STYLESHEET = QStringLiteral( @@ -61,7 +63,7 @@ CodeWidget::CodeWidget(QWidget* parent) [this](bool visible) { setHidden(!visible); }); connect(Host::GetInstance(), &Host::UpdateDisasmDialog, this, [this] { - if (Core::GetState(m_system) == Core::State::Paused) + if (!m_lock_btn->isChecked() && Core::GetState(m_system) == Core::State::Paused) SetAddress(m_system.GetPPCState().pc, CodeViewWidget::SetAddressUpdate::WithoutUpdate); Update(); }); @@ -109,8 +111,16 @@ void CodeWidget::CreateWidgets() auto* top_layout = new QHBoxLayout; m_search_address = new QLineEdit; m_search_address->setPlaceholderText(tr("Search Address")); + + m_lock_btn = new QToolButton(); + m_lock_btn->setIcon(Resources::GetThemeIcon("pause")); + m_lock_btn->setCheckable(true); + m_lock_btn->setMinimumSize(24, 24); + m_lock_btn->setToolTip(tr("When enabled, prevents automatic updates to the code view.")); m_branch_watch = new QPushButton(tr("Branch Watch")); + top_layout->addWidget(m_search_address); + top_layout->addWidget(m_lock_btn); top_layout->addWidget(m_branch_watch); auto* right_layout = new QVBoxLayout; @@ -191,6 +201,7 @@ void CodeWidget::ConnectWidgets() connect(m_search_address, &QLineEdit::textChanged, this, &CodeWidget::OnSearchAddress); connect(m_search_address, &QLineEdit::returnPressed, this, &CodeWidget::OnSearchAddress); + connect(m_lock_btn, &QPushButton::toggled, m_code_view, &CodeViewWidget::OnLockAddress); connect(m_search_symbols, &QLineEdit::textChanged, this, &CodeWidget::OnSearchSymbols); connect(m_search_calls, &QLineEdit::textChanged, this, [this] { if (const Common::Symbol* symbol = m_ppc_symbol_db.GetSymbolFromAddr(m_code_view->GetAddress())) diff --git a/Source/Core/DolphinQt/Debugger/CodeWidget.h b/Source/Core/DolphinQt/Debugger/CodeWidget.h index a7ca9f4a0c..76ada4f506 100644 --- a/Source/Core/DolphinQt/Debugger/CodeWidget.h +++ b/Source/Core/DolphinQt/Debugger/CodeWidget.h @@ -17,6 +17,7 @@ class QSplitter; class QListWidget; class QPushButton; class QTableWidget; +class QToolButton; namespace Common { @@ -80,6 +81,7 @@ private: BranchWatchDialog* m_branch_watch_dialog = nullptr; QLineEdit* m_search_address; + QToolButton* m_lock_btn; QPushButton* m_branch_watch; QLineEdit* m_search_callstack;