diff options
| author | InusualZ <wesmoret98@gmail.com> | 2021-02-28 08:44:03 +0000 |
|---|---|---|
| committer | InusualZ <wesmoret98@gmail.com> | 2021-03-03 15:55:22 +0000 |
| commit | 5e1b3514f63f25401e19162f18b3035807aaa0d1 (patch) | |
| tree | 574575f533621b16f739627b5a3892e714ec70e5 /Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp | |
| parent | 4935e9b560a380deb3f293c35a4ab558ccf0d56b (diff) | |
Allow to disable/enable from the BreakpointWidget
Added a context menu, for when a breakpoint is right-clicked
Removed the `itemClicked` behavior, since it would clash with the context menu
Diffstat (limited to 'Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp')
| -rw-r--r-- | Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp | 72 |
1 files changed, 62 insertions, 10 deletions
diff --git a/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp b/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp index 9ff68a1f25..06bd74a29e 100644 --- a/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp @@ -5,6 +5,7 @@ #include "DolphinQt/Debugger/BreakpointWidget.h" #include <QHeaderView> +#include <QMenu> #include <QTableWidget> #include <QToolBar> #include <QVBoxLayout> @@ -80,14 +81,10 @@ void BreakpointWidget::CreateWidgets() m_table->setEditTriggers(QAbstractItemView::NoEditTriggers); m_table->verticalHeader()->hide(); - connect(m_table, &QTableWidget::itemClicked, [this](QTableWidgetItem* item) { - if (m_table->selectedItems()[0]->row() == item->row() && - Core::GetState() == Core::State::Paused) - { - auto address = m_table->selectedItems()[0]->data(Qt::UserRole).toUInt(); - emit SelectedBreakpoint(address); - } - }); + connect(m_table, &QTableWidget::customContextMenuRequested, this, + &BreakpointWidget::OnContextMenu); + + m_table->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); auto* layout = new QVBoxLayout; @@ -168,7 +165,7 @@ void BreakpointWidget::Update() { m_table->setRowCount(i + 1); - auto* active = create_item(bp.is_enabled ? tr("on") : QString()); + auto* active = create_item(bp.is_enabled ? tr("on") : tr("off")); active->setData(Qt::UserRole, bp.address); @@ -201,7 +198,8 @@ void BreakpointWidget::Update() for (const auto& mbp : PowerPC::memchecks.GetMemChecks()) { m_table->setRowCount(i + 1); - auto* active = create_item(mbp.break_on_hit || mbp.log_on_hit ? tr("on") : QString()); + auto* active = + create_item(mbp.is_enabled && (mbp.break_on_hit || mbp.log_on_hit) ? tr("on") : tr("off")); active->setData(Qt::UserRole, mbp.start_address); m_table->setItem(i, 0, active); @@ -310,6 +308,60 @@ void BreakpointWidget::OnSave() ini.Save(File::GetUserPath(D_GAMESETTINGS_IDX) + SConfig::GetInstance().GetGameID() + ".ini"); } +void BreakpointWidget::OnContextMenu() +{ + const auto& selected_items = m_table->selectedItems(); + if (selected_items.isEmpty()) + { + return; + } + + const auto& selected_item = selected_items.constFirst(); + const auto bp_address = static_cast<u32>(selected_item->data(Qt::UserRole).toUInt()); + + auto is_memory_breakpoint = false; + + auto* menu = new QMenu(this); + + const auto& inst_breakpoints = PowerPC::breakpoints.GetBreakPoints(); + const auto bp_iter = + std::find_if(inst_breakpoints.begin(), inst_breakpoints.end(), + [bp_address](const auto& bp) { return bp.address == bp_address; }); + if (bp_iter != inst_breakpoints.end()) + { + menu->addAction(bp_iter->is_enabled ? tr("Disable") : tr("Enable"), [this, &bp_address]() { + PowerPC::breakpoints.ToggleBreakPoint(bp_address); + Update(); + }); + } + else + { + // It should be a memory breakpoint + const auto& memory_breakpoints = PowerPC::memchecks.GetMemChecks(); + const auto mb_iter = + std::find_if(memory_breakpoints.begin(), memory_breakpoints.end(), + [bp_address](const auto& bp) { return bp.start_address == bp_address; }); + + if (mb_iter == memory_breakpoints.end()) + { + return; + } + + is_memory_breakpoint = true; + + menu->addAction(mb_iter->is_enabled ? tr("Disable") : tr("Enable"), [this, &bp_address]() { + PowerPC::memchecks.ToggleBreakPoint(bp_address); + Update(); + }); + } + + if (!is_memory_breakpoint) + { + menu->addAction(tr("Go to"), [this, bp_address]() { emit SelectedBreakpoint(bp_address); }); + } + menu->exec(QCursor::pos()); +} + void BreakpointWidget::AddBP(u32 addr) { AddBP(addr, false, true, true); |
