From 9fd091260777a95432902173a35e15a475f6f9f9 Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Fri, 20 Mar 2015 15:29:56 +0100 Subject: [PATCH 1/1] Make GUI Widget move Comments through the backend properly --- src/core/Comment.hxx | 1 + src/gui/widgets/BasicBlockWidget.cxx | 65 +++++++++++++++++++++++----- src/gui/widgets/BasicBlockWidget.hxx | 3 ++ 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/core/Comment.hxx b/src/core/Comment.hxx index 98febe4..ca3e89c 100644 --- a/src/core/Comment.hxx +++ b/src/core/Comment.hxx @@ -11,6 +11,7 @@ public: bool isLocal() const {return location == NULL;} void setText(const std::string& text); + std::string getText() const {return text;} uint64_t getAddress(); Function* getLocation(); private: diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index 3781401..bdddd52 100644 --- a/src/gui/widgets/BasicBlockWidget.cxx +++ b/src/gui/widgets/BasicBlockWidget.cxx @@ -3,9 +3,12 @@ #include "gui/dialogs/SimpleStringDialog.hxx" #include "core/BasicBlock.hxx" #include "core/Function.hxx" +#include "core/Comment.hxx" +#include "disassembler/Instruction.hxx" #include "core/InformationManager.hxx" #include "core/events/RenameFunctionEvent.hxx" -#include +#include "core/events/ChangeCommentEvent.hxx" +#include class CustomQGraphicsTextItem : public QObject, public QGraphicsTextItem { public: @@ -13,18 +16,26 @@ public: : QGraphicsTextItem(text, parent), parent(parent) {} void contextMenuEvent(QGraphicsSceneContextMenuEvent*); private: - void addComment(QTextTableCell cell, const QString& title); + void addComment(int row, bool global); BasicBlockWidget* parent; }; -void CustomQGraphicsTextItem::addComment(QTextTableCell cell, const QString& title) { - SimpleStringDialog dialog(title); +void CustomQGraphicsTextItem::addComment(int row, bool global) { + SimpleStringDialog dialog(global ? "Global comment" : "Local comment"); int result = dialog.exec(); + uint64_t address = parent->instructions[row].getAddress(); if (QDialog::Accepted == result) { - LOG4CXX_DEBUG(parent->logger, "adding comment " << dialog.result().toStdString() - << " at row " << cell.row()); - cell.firstCursorPosition().insertHtml(QString(";; ") + dialog.result()); + Comment* comment; + if (global) { + comment = parent->block->getManager()->newGlobalComment(address); + } else { + comment = parent->block->getManager()->newLocalComment(address, NULL); + } + comment->setText(dialog.result().toStdString()); + parent->block->getManager()->finishComment(comment); + +// cell.firstCursorPosition().insertHtml(QString(";; ") + dialog.result()); } else { LOG4CXX_DEBUG(parent->logger, "addComment aborted"); } @@ -47,14 +58,13 @@ void CustomQGraphicsTextItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* e QTextTable* table = c.currentTable(); if (NULL != table) { int row = table->cellAt(c).row(); - QTextTableCell cell = table->cellAt(row, 2); QAction* globalComment = menu.addAction("Add global Comment"); QAction* localComment = menu.addAction("Add local Comment"); QObject::connect(globalComment, &QAction::triggered, - [=]() { addComment(cell, "Global comment"); }); + [=]() { addComment(row, true); }); QObject::connect(localComment, &QAction::triggered, - [=]() { addComment(cell, "Local comment"); }); + [=]() { addComment(row, false); }); } menu.exec(event->screenPos()); @@ -86,6 +96,7 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, }); instructions = block->getInstructions(); populateWidget(); + block->getManager()->registerChangeCommentEvent([=](ChangeCommentEvent* e) {changeCommentHandler(e);}); } void BasicBlockWidget::updateFunctionName(RenameFunctionEvent *event) { @@ -113,6 +124,29 @@ void BasicBlockWidget::updateFunctionName(RenameFunctionEvent *event) { } } +void BasicBlockWidget::changeCommentHandler(ChangeCommentEvent* event) { + auto inst_it = std::find_if(instructions.begin(), instructions.end(), + [=](Instruction& inst) { + return inst.getAddress() == event->address; + }); + if (inst_it != instructions.end()) { + if (std::find(inst_it->comments().begin(), + inst_it->comments().begin(), + event->comment) == inst_it->comments().end()) { + LOG4CXX_DEBUG(logger, "Change Comment Event -- New Comment!"); + inst_it->comments().push_back(event->comment); + } + int row = inst_it - instructions.begin(); + LOG4CXX_DEBUG(logger, "Inserting comment for instruction at row " << std::hex << row); + QTextCursor cursor = _table->cellAt(row, 2).lastCursorPosition(); + while (cursor != _table->cellAt(row, 2).firstCursorPosition()) { + cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, 1); + } + cursor.removeSelectedText(); + cursor.insertHtml(formatComments(&*inst_it)); + } +} + void BasicBlockWidget::populateWidget() { int row; QTextTableFormat format; @@ -152,9 +186,18 @@ void BasicBlockWidget::populateWidget() { } line = "" + line + ""; } - _table->cellAt(row, 1).firstCursorPosition().insertHtml(line); + _table->cellAt(row, 2).firstCursorPosition().insertHtml(formatComments(&inst)); + } +} + +QString BasicBlockWidget::formatComments(Instruction* inst) { + QString comments; + for (Comment* c: inst->comments()) { + comments += "
"; + comments += c->getText().c_str(); } + return (comments == "" ? "" : ";; ") + comments.trimmed(); } void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem*, diff --git a/src/gui/widgets/BasicBlockWidget.hxx b/src/gui/widgets/BasicBlockWidget.hxx index e3d3611..215086d 100644 --- a/src/gui/widgets/BasicBlockWidget.hxx +++ b/src/gui/widgets/BasicBlockWidget.hxx @@ -15,6 +15,7 @@ class Mainwindow; class CustomQGraphicsTextItem; class BasicBlock; class RenameFunctionEvent; +class ChangeCommentEvent; class BasicBlockWidget : public QObject, public QGraphicsItem { @@ -48,6 +49,8 @@ public: private: void updateFunctionName(RenameFunctionEvent* event); void populateWidget(); + void changeCommentHandler(ChangeCommentEvent* event); + QString formatComments(Instruction* inst); uint32_t width, height; QString name; -- 2.39.2