void RegisterWidget::ShowContextMenu() { QMenu* menu = new QMenu(this); if (m_table->selectedItems().size()) { auto variant = m_table->selectedItems()[0]->data(DATA_TYPE); if (!variant.isNull()) { auto* item = reinterpret_cast<RegisterColumn*>(m_table->selectedItems()[0]); auto type = static_cast<RegisterType>(item->data(DATA_TYPE).toInt()); auto display = item->GetDisplay(); AddAction(menu, tr("Add to &watch"), this, [this, item] { emit RequestMemoryBreakpoint(item->GetValue()); }); menu->addAction(tr("View &memory")); menu->addAction(tr("View &code")); menu->addSeparator(); QActionGroup* group = new QActionGroup(menu); group->setExclusive(true); auto* view_hex = menu->addAction(tr("Hexadecimal")); auto* view_int = menu->addAction(tr("Signed Integer")); auto* view_uint = menu->addAction(tr("Unsigned Integer")); auto* view_float = menu->addAction(tr("Float")); auto* view_double = menu->addAction(tr("Double")); for (auto* action : {view_hex, view_int, view_uint, view_float, view_double}) { action->setCheckable(true); action->setVisible(false); action->setActionGroup(group); } switch (display) { case RegisterDisplay::Hex: view_hex->setChecked(true); break; case RegisterDisplay::SInt32: view_int->setChecked(true); break; case RegisterDisplay::UInt32: view_uint->setChecked(true); break; case RegisterDisplay::Float: view_float->setChecked(true); break; case RegisterDisplay::Double: view_double->setChecked(true); break; } switch (type) { case RegisterType::gpr: view_hex->setVisible(true); view_int->setVisible(true); view_uint->setVisible(true); view_float->setVisible(true); break; case RegisterType::fpr: view_hex->setVisible(true); view_double->setVisible(true); break; default: break; } connect(view_hex, &QAction::triggered, [this, item] { m_updating = true; item->SetDisplay(RegisterDisplay::Hex); m_updating = false; }); connect(view_int, &QAction::triggered, [this, item] { m_updating = true; item->SetDisplay(RegisterDisplay::SInt32); m_updating = false; }); connect(view_uint, &QAction::triggered, [this, item] { m_updating = true; item->SetDisplay(RegisterDisplay::UInt32); m_updating = false; }); connect(view_float, &QAction::triggered, [this, item] { m_updating = true; item->SetDisplay(RegisterDisplay::Float); m_updating = false; }); connect(view_double, &QAction::triggered, [this, item] { m_updating = true; item->SetDisplay(RegisterDisplay::Double); m_updating = false; }); menu->addSeparator(); } } AddAction(menu, tr("Update"), this, [this] { emit RequestTableUpdate(); }); menu->exec(QCursor::pos()); }
void WatchWidget::AddWatchBreakpoint(int row) { emit RequestMemoryBreakpoint(PowerPC::debug_interface.GetWatch(row).address); }