From 083a8802e608a69d622ff5cda5d21ff61e289a85 Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Tue, 17 Feb 2015 17:53:39 +0100 Subject: [PATCH] Add context menu to create Functions --- src/gui/Mainwindow.cxx | 9 ++++-- src/gui/Mainwindow.hxx | 1 + src/gui/widgets/BasicBlockWidget.cxx | 42 +++++++++++++++++++++++----- src/gui/widgets/BasicBlockWidget.hxx | 3 +- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/gui/Mainwindow.cxx b/src/gui/Mainwindow.cxx index 55bc86d..70d31d5 100644 --- a/src/gui/Mainwindow.cxx +++ b/src/gui/Mainwindow.cxx @@ -127,13 +127,18 @@ void Mainwindow::requestNewFunction() { NewFunctionDialog dialog; int result = dialog.exec(); if (QDialog::Accepted == result) { - LOG4CXX_DEBUG(logger, "requesting Function at " << std::hex << dialog.result()); - manager->getDisassembler()->disassembleFunctionAt(dialog.result()); + requestNewFunctionByAddress(dialog.result()); } else { LOG4CXX_DEBUG(logger, "requestNewFunction aborted"); } } +void Mainwindow::requestNewFunctionByAddress(uint64_t address) { + LOG4CXX_DEBUG(logger, "requesting Function at " << std::hex << address); + manager->getDisassembler()->disassembleFunctionAt(address); + switchMainPlaneToAddress(address); +} + void Mainwindow::renameFunction(QListWidgetItem * item) { RenameFunctionDialog dialog; int result = dialog.exec(); diff --git a/src/gui/Mainwindow.hxx b/src/gui/Mainwindow.hxx index 179a9c4..7084e2f 100644 --- a/src/gui/Mainwindow.hxx +++ b/src/gui/Mainwindow.hxx @@ -49,6 +49,7 @@ private: log4cxx::LoggerPtr logger; public Q_SLOTS: void switchMainPlaneToAddress(uint64_t); + void requestNewFunctionByAddress(uint64_t address); private Q_SLOTS: void quit(); void open(); diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index f611329..586b707 100644 --- a/src/gui/widgets/BasicBlockWidget.cxx +++ b/src/gui/widgets/BasicBlockWidget.cxx @@ -1,14 +1,42 @@ #include "BasicBlockWidget.hxx" +#include "CustomQGraphicsTextItem.hxx" #include "gui/Mainwindow.hxx" +class CustomQGraphicsTextItem : public QObject, public QGraphicsTextItem { +public: + CustomQGraphicsTextItem(const QString& text, BasicBlockWidget* parent, Mainwindow* mainwindow) + : QGraphicsTextItem(text, parent), parent(parent), mainwindow(mainwindow) {} + void contextMenuEvent(QGraphicsSceneContextMenuEvent*); +private: + BasicBlockWidget* parent; + Mainwindow* mainwindow; +}; + +void CustomQGraphicsTextItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { + QTextCursor c = textCursor(); + c.setPosition(document()->documentLayout()->hitTest(event->pos(), Qt::FuzzyHit)); + c.select(QTextCursor::WordUnderCursor); + + QMenu menu; + bool ok; + uint64_t address = c.selectedText().toLongLong(&ok, 16); + if (ok) { + QAction* act = menu.addAction(c.selectedText() + " is a Function"); + QObject::connect(act, &QAction::triggered, + [=]() {mainwindow->requestNewFunctionByAddress(address);}); + } + menu.exec(event->screenPos()); +} + BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, Mainwindow * mainwindow) : width(270), height(45), name(name) - , _widget("", this), _table(NULL) + , _table(NULL) , block(block), mainwindow(mainwindow) { next[0] = NULL; next[1] = NULL; - _widget.setPos(5, 20); - _widget.setTextInteractionFlags(Qt::TextSelectableByMouse| + _widget.reset(new CustomQGraphicsTextItem("", this, mainwindow)); + _widget->setPos(5, 20); + _widget->setTextInteractionFlags(Qt::TextSelectableByMouse| Qt::LinksAccessibleByMouse); if (width < 250) width = 250; @@ -27,7 +55,7 @@ void BasicBlockWidget::addItem(uint8_t* bytes, size_t num_bytes, QTextTableFormat format; format.setBorderStyle(QTextFrameFormat::BorderStyle_None); format.setBorder(0); - _table = _widget.textCursor().insertTable(1, 3, format); + _table = _widget->textCursor().insertTable(1, 3, format); } for (size_t i(0); i < num_bytes; ++i) { @@ -46,7 +74,7 @@ void BasicBlockWidget::addItem(uint8_t* bytes, size_t num_bytes, _table->cellAt(row, 1).firstCursorPosition().insertHtml(line); - QObject::connect(&_widget, &QGraphicsTextItem::linkActivated, + QObject::connect(_widget.get(), &QGraphicsTextItem::linkActivated, [=](QString str) { if (str.startsWith("function:")) { QString address = str.remove("function:"); @@ -54,8 +82,8 @@ void BasicBlockWidget::addItem(uint8_t* bytes, size_t num_bytes, } }); - width = 10 + _widget.boundingRect().width(); - height = 25 + _widget.boundingRect().height(); + width = 10 + _widget->boundingRect().width(); + height = 25 + _widget->boundingRect().height(); if (width < 250) width = 250; } diff --git a/src/gui/widgets/BasicBlockWidget.hxx b/src/gui/widgets/BasicBlockWidget.hxx index 2122bf2..5d23d9b 100644 --- a/src/gui/widgets/BasicBlockWidget.hxx +++ b/src/gui/widgets/BasicBlockWidget.hxx @@ -7,6 +7,7 @@ #include #include #include +#include class Mainwindow; @@ -42,7 +43,7 @@ public: private: uint32_t width, height; QString name; - QGraphicsTextItem _widget; + std::unique_ptr _widget; QTextTable* _table; BasicBlock* block; Mainwindow* mainwindow; -- 2.39.2