diff options
Diffstat (limited to 'Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp')
| -rw-r--r-- | Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp b/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp index 09b045688c..fbb5c38d9b 100644 --- a/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp @@ -173,6 +173,7 @@ void BreakpointWidget::CreateWidgets() layout->setContentsMargins(2, 2, 2, 2); layout->setSpacing(0); + m_enabled = m_toolbar->addAction(tr("Disable"), this, &BreakpointWidget::OnToggleBreaking); m_new = m_toolbar->addAction(tr("New"), this, &BreakpointWidget::OnNewBreakpoint); m_clear = m_toolbar->addAction(tr("Clear"), this, &BreakpointWidget::OnClear); @@ -190,6 +191,10 @@ void BreakpointWidget::CreateWidgets() void BreakpointWidget::UpdateIcons() { + if (m_system.GetPowerPC().GetBreakPoints().IsBreakingEnabled()) + m_enabled->setIcon(Resources::GetThemeIcon("pause")); + else + m_enabled->setIcon(Resources::GetThemeIcon("play")); m_new->setIcon(Resources::GetThemeIcon("debugger_add_breakpoint")); m_clear->setIcon(Resources::GetThemeIcon("debugger_clear")); m_load->setIcon(Resources::GetThemeIcon("debugger_load")); @@ -289,6 +294,24 @@ void BreakpointWidget::Update() QPixmap enabled_icon = Resources::GetThemeIcon("debugger_breakpoint").pixmap(QSize(downscale, downscale)); + auto& power_pc = m_system.GetPowerPC(); + auto& breakpoints = power_pc.GetBreakPoints(); + + if (!breakpoints.IsBreakingEnabled()) + { + // Use QPainter to draw a transparent hole in the center + QImage image = enabled_icon.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); + QPainter painter(&image); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setPen(Qt::NoPen); + painter.setBrush(Qt::transparent); + // Center and radius + painter.drawEllipse(QPoint(downscale / 2, downscale / 2), downscale / 4, downscale / 4); + painter.end(); + enabled_icon = QPixmap::fromImage(image); + } + const auto create_item = [](const QString& string = {}) { QTableWidgetItem* item = new QTableWidgetItem(string); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); @@ -306,8 +329,6 @@ void BreakpointWidget::Update() Settings::Instance().IsThemeDark() ? QColor(75, 75, 75) : QColor(225, 225, 225); disabled_item.setBackground(disabled_color); - auto& power_pc = m_system.GetPowerPC(); - auto& breakpoints = power_pc.GetBreakPoints(); auto& memchecks = power_pc.GetMemChecks(); auto& ppc_symbol_db = power_pc.GetSymbolDB(); @@ -466,6 +487,36 @@ void BreakpointWidget::OnEditBreakpoint(u32 address, bool is_instruction_bp) emit Host::GetInstance()->PPCBreakpointsChanged(); } +void BreakpointWidget::OnToggleBreaking() +{ + auto& breakpoints = m_system.GetPowerPC().GetBreakPoints(); + auto& memchecks = m_system.GetPowerPC().GetMemChecks(); + // Memcheck's HasAny() will report no memchecks while breaking is disabled, so only check when + // breaking is true. + bool has_memory_bp; + + // Currently toggles all code and memory breakpoints. Could be split if needed. + if (breakpoints.IsBreakingEnabled()) + { + has_memory_bp = memchecks.HasAny(); + breakpoints.EnableBreaking(false); + memchecks.EnableBreaking(false); + m_enabled->setText(tr("Enable")); + m_enabled->setIcon(Resources::GetThemeIcon("play")); + } + else + { + breakpoints.EnableBreaking(true); + memchecks.EnableBreaking(true); + has_memory_bp = memchecks.HasAny(); + m_enabled->setText(tr("Disable")); + m_enabled->setIcon(Resources::GetThemeIcon("pause")); + } + + if (has_memory_bp || !breakpoints.GetBreakPoints().empty()) + emit Host::GetInstance()->PPCBreakpointsChanged(); +} + void BreakpointWidget::OnLoad() { Common::IniFile ini; |
