X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=src%2Fgui%2Fwidgets%2FBasicBlockWidget.cxx;h=21f432fa0245670d6fbab2e8e88828f977303bbb;hb=HEAD;hp=1cdc33f3dc7eb2ce4cf67f84ba8b1e77a0f24d0d;hpb=42617ae5ed5b400a66df8b59a705f6523eec71b8;p=frida%2Ffrida.git diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index 1cdc33f..21f432f 100644 --- a/src/gui/widgets/BasicBlockWidget.cxx +++ b/src/gui/widgets/BasicBlockWidget.cxx @@ -16,8 +16,6 @@ public: CustomQGraphicsTextItem(const QString& text, BasicBlockWidget* parent) : QGraphicsTextItem(text, parent), parent(parent) {} void contextMenuEvent(QGraphicsSceneContextMenuEvent*); - - void adjustSize(); private: void addComment(int row, bool global); @@ -60,7 +58,7 @@ void CustomQGraphicsTextItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* e QAction* act = menu.addAction(c.selectedText() + " is a Function"); QObject::connect(act, &QAction::triggered, [=]() { - parent->mainwindow->requestNewFunctionByAddress(address); + emit parent->mainwindow->requestNewFunctionByAddress(address); if (NULL == table) return; int row = table->cellAt(c).row(); uint64_t insAddress = parent->instructions[row].getAddress(); @@ -84,31 +82,6 @@ void CustomQGraphicsTextItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* e menu.exec(event->screenPos()); } -/* QGraphicsTextItem has an adjustSize() function that is supposed to - * resize the widget to it's "ideal" size. However it totally ignores - * all directives to not wrap lines and "ideal" is actually just a - * bunch of heuristics. - * - * We are starting with a hopefully absurdly large startingwidth and - * reduce it untill a line is broken (detected by a change in - * height). As long as the width (1000 here) is sufficiently large, - * this should give us a widget without any line-wrapping. - * - * One needs to call this on a Pointer of tye CustomQGraphicsTextItem - * as the adjustSize() function is not polymorphic (vurtual). - */ -void CustomQGraphicsTextItem::adjustSize() { - int width = 1000; - setTextWidth(width); - int height = boundingRect().height(); - while (width > 250 && height == boundingRect().height()) { - setTextWidth(width -= 10); - } - width += 10; - if (width < 250) width = 250; - setTextWidth(width); -} - BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, Mainwindow * mainwindow) : width(200), height(45), name(name) @@ -117,7 +90,8 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, , logger(log4cxx::Logger::getLogger("gui.BasicBlockWidget." + name.toStdString())) { next[0] = NULL; next[1] = NULL; - block->getManager()->registerRenameFunctionEvent([=](RenameFunctionEvent* event) {updateFunctionName(event);}); + QObject::connect(block->getManager(), &InformationManager::renameFunctionEvent, + [=](RenameFunctionEvent* event) {updateFunctionName(event);}); _widget.reset(new CustomQGraphicsTextItem("", this)); _widget->setPos(5, 20); @@ -150,7 +124,8 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, }); instructions = block->getInstructions(); populateWidget(); - block->getManager()->registerChangeCommentEvent([=](ChangeCommentEvent* e) {changeCommentHandler(e);}); + QObject::connect(block->getManager(), &InformationManager::changeCommentEvent, + [=](ChangeCommentEvent* e) {changeCommentHandler(e);}); } void BasicBlockWidget::updateFunctionName(RenameFunctionEvent *event) { @@ -181,7 +156,7 @@ void BasicBlockWidget::updateFunctionName(RenameFunctionEvent *event) { c.insertText(event->new_name.c_str()); QGraphicsTextItem* item = _widget.get(); - ((CustomQGraphicsTextItem*)item)->adjustSize(); + item->adjustSize(); } } } @@ -210,13 +185,14 @@ void BasicBlockWidget::changeCommentHandler(ChangeCommentEvent* event) { cursor.removeSelectedText(); cursor.insertHtml(formatComments(&*inst_it)); QGraphicsTextItem* item = _widget.get(); - ((CustomQGraphicsTextItem*)item)->adjustSize(); + item->adjustSize(); } } void BasicBlockWidget::populateWidget() { int row; QTextTableFormat format; + QTextDocument* document = new QTextDocument(); format.setBorderStyle(QTextFrameFormat::BorderStyle_None); format.setBorder(0); @@ -226,7 +202,7 @@ void BasicBlockWidget::populateWidget() { _table->appendRows(1); } else { row = 0; - _table = _widget->textCursor().insertTable(1, 3, format); + _table = QTextCursor(document).insertTable(1, 3, format); } QString bytestring; for (uint8_t byte : inst.getBytes()) { @@ -257,23 +233,29 @@ void BasicBlockWidget::populateWidget() { _table->cellAt(row, 2).firstCursorPosition().insertHtml(formatComments(&inst)); } QGraphicsTextItem* item = _widget.get(); - ((CustomQGraphicsTextItem*)item)->adjustSize(); + item->setDocument(document); + item->adjustSize(); + updateSize(); } QString BasicBlockWidget::formatComments(Instruction* inst) { - QString comments; + QStringList comments; for (Comment* c: inst->comments()) { - comments += "
"; - comments += QString(c->getText().c_str()).toHtmlEscaped(); + comments << QString(c->getText().c_str()).toHtmlEscaped(); } - return (comments == "" ? "" : ";; ") + comments.trimmed(); + return (comments.empty() ? "" : ";; ") + comments.join("
").trimmed(); } -void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem*, - QWidget*) { +void BasicBlockWidget::updateSize() { + prepareGeometryChange(); width = 10 + _widget->boundingRect().width(); height = 25 + _widget->boundingRect().height(); if (width < 250) width = 250; +} + +void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem*, + QWidget*) { + updateSize(); painter->fillRect(0, 0, width, height, currentColor); painter->setPen(QColor(0x00, 0x00, 0xff, 0xff));