X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fgui%2Fwidgets%2FBasicBlockWidget.cxx;h=efa7ec34394ec6d2416933c99d452d1b054032fa;hp=37814014596b29e860a53778b9b09cfbc551ff33;hb=3a4fade0292b9b8776c6195467b70a8f25a3b1c7;hpb=4443ad3e38327c776dcc68538591456d37c9ed6f diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index 3781401..efa7ec3 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, (Function*)0x23); + } + 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 += QString(c->getText().c_str()).toHtmlEscaped(); } + return (comments == "" ? "" : ";; ") + comments.trimmed(); } void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem*,