void StackTreeView::contextMenuEvent(QContextMenuEvent *ev) { DebuggerEngine *engine = currentEngine(); StackHandler *handler = engine->stackHandler(); const QModelIndex index = indexAt(ev->pos()); const int row = index.row(); StackFrame frame; if (row >= 0 && row < handler->stackSize()) frame = handler->frameAt(row); const quint64 address = frame.address; QMenu menu; menu.addAction(action(ExpandStack)); QAction *actCopyContents = menu.addAction(tr("Copy Contents to Clipboard")); actCopyContents->setEnabled(model() != 0); QAction *actSaveTaskFile = menu.addAction(tr("Save as Task File...")); actSaveTaskFile->setEnabled(model() != 0); if (engine->hasCapability(CreateFullBacktraceCapability)) menu.addAction(action(CreateFullBacktrace)); QAction *additionalQmlStackAction = 0; if (engine->hasCapability(AdditionalQmlStackCapability)) additionalQmlStackAction = menu.addAction(tr("Load QML Stack")); QAction *actShowMemory = 0; if (engine->hasCapability(ShowMemoryCapability)) { actShowMemory = menu.addAction(QString()); if (address == 0) { actShowMemory->setText(tr("Open Memory Editor")); actShowMemory->setEnabled(false); } else { actShowMemory->setText(tr("Open Memory Editor at 0x%1").arg(address, 0, 16)); actShowMemory->setEnabled(engine->hasCapability(ShowMemoryCapability)); } } QAction *actShowDisassemblerAt = 0; QAction *actShowDisassemblerAtAddress = 0; QAction *actShowDisassemblerAtFunction = 0; if (engine->hasCapability(DisassemblerCapability)) { actShowDisassemblerAt = menu.addAction(QString()); actShowDisassemblerAtAddress = menu.addAction(tr("Open Disassembler at Address...")); actShowDisassemblerAtFunction = menu.addAction(tr("Disassemble Function...")); if (address == 0) { actShowDisassemblerAt->setText(tr("Open Disassembler")); actShowDisassemblerAt->setEnabled(false); } else { actShowDisassemblerAt->setText(tr("Open Disassembler at 0x%1").arg(address, 0, 16)); } } QAction *actLoadSymbols = 0; if (engine->hasCapability(ShowModuleSymbolsCapability)) actLoadSymbols = menu.addAction(tr("Try to Load Unknown Symbols")); if (engine->hasCapability(MemoryAddressCapability)) menu.addAction(action(UseAddressInStackView)); menu.addSeparator(); menu.addAction(action(UseToolTipsInStackView)); menu.addSeparator(); menu.addAction(action(SettingsDialog)); QAction *act = menu.exec(ev->globalPos()); if (!act) return; if (act == actCopyContents) { copyContentsToClipboard(); } else if (act == actShowMemory) { MemoryViewSetupData data; data.startAddress = address; data.title = tr("Memory at Frame #%1 (%2) 0x%3"). arg(row).arg(frame.function).arg(address, 0, 16); data.markup.push_back(MemoryMarkup(address, 1, QColor(Qt::blue).lighter(), tr("Frame #%1 (%2)").arg(row).arg(frame.function))); engine->openMemoryView(data); } else if (act == actShowDisassemblerAtAddress) { AddressDialog dialog; if (address) dialog.setAddress(address); if (dialog.exec() == QDialog::Accepted) currentEngine()->openDisassemblerView(Location(dialog.address())); } else if (act == actShowDisassemblerAtFunction) { const StackFrame frame = inputFunctionForDisassembly(); if (!frame.function.isEmpty()) currentEngine()->openDisassemblerView(Location(frame)); } else if (act == actShowDisassemblerAt) engine->openDisassemblerView(frame); else if (act == actLoadSymbols) engine->loadSymbolsForStack(); else if (act == actSaveTaskFile) saveTaskFile(this, handler); else if (act == additionalQmlStackAction) engine->loadAdditionalQmlStack(); }
QList<MemoryMarkup> RegisterMemoryView::registerMarkup(quint64 a, const QString ®Name) { return { MemoryMarkup(a, 1, QColor(Qt::blue).lighter(), tr("Register \"%1\"").arg(regName)) }; }