From 3666c971782b5833732d5359dee288eacf699b92 Mon Sep 17 00:00:00 2001 From: Itay Cohen Date: Sat, 12 Jan 2019 11:02:07 +0200 Subject: [PATCH] Highlight program counter in Navbar widget (#1095) Highlight program counter in navbar and add navbar cursor colors to native theme configuration. --- src/common/ColorSchemeFileSaver.cpp | 2 ++ src/common/Configuration.cpp | 4 +++ src/widgets/ColorSchemePrefWidget.cpp | 2 ++ src/widgets/VisualNavbar.cpp | 43 +++++++++++++++++---------- src/widgets/VisualNavbar.h | 7 +++-- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/common/ColorSchemeFileSaver.cpp b/src/common/ColorSchemeFileSaver.cpp index 2a1cef45..d8162572 100644 --- a/src/common/ColorSchemeFileSaver.cpp +++ b/src/common/ColorSchemeFileSaver.cpp @@ -15,6 +15,8 @@ static const QStringList cutterSpecificOptions = { "highlightPC", "highlightWord", "gui.navbar.err", + "gui.navbar.seek", + "gui.navbar.pc", "gui.navbar.sym", "gui.dataoffset", "gui.navbar.code", diff --git a/src/common/Configuration.cpp b/src/common/Configuration.cpp index 4da7b974..90a9ba62 100644 --- a/src/common/Configuration.cpp +++ b/src/common/Configuration.cpp @@ -152,6 +152,8 @@ void Configuration::loadBaseThemeNative() setColor("gui.imports", QColor(50, 140, 255)); setColor("gui.main", QColor(0, 128, 0)); setColor("gui.navbar.err", QColor(255, 0, 0)); + setColor("gui.navbar.seek", QColor(233, 86, 86)); + setColor("gui.navbar.pc", QColor(66, 238, 244)); setColor("gui.navbar.code", QColor(104, 229, 69)); setColor("gui.navbar.str", QColor(69, 104, 229)); setColor("gui.navbar.sym", QColor(229, 150, 69)); @@ -221,6 +223,8 @@ void Configuration::loadBaseThemeDark() // GUI: navbar setColor("gui.navbar.err", QColor(233, 86, 86)); + setColor("gui.navbar.seek", QColor(233, 86, 86)); + setColor("gui.navbar.pc", QColor(66, 238, 244)); setColor("gui.navbar.code", QColor(130, 200, 111)); setColor("angui.navbar.str", QColor(111, 134, 216)); setColor("gui.navbar.sym", QColor(221, 163, 104)); diff --git a/src/widgets/ColorSchemePrefWidget.cpp b/src/widgets/ColorSchemePrefWidget.cpp index 2ca7484f..f3376cc4 100644 --- a/src/widgets/ColorSchemePrefWidget.cpp +++ b/src/widgets/ColorSchemePrefWidget.cpp @@ -261,6 +261,8 @@ static const QMap optionInfoMap = { { "gui.imports", { "", "gui.imports", true } }, { "highlightPC", { "", "highlightPC", true } }, { "gui.navbar.err", { "", "gui.navbar.err", true } }, + { "gui.navbar.seek", { "", "gui.navbar.seek", true } }, + { "gui.navbar.pc", { "", "gui.navbar.pc", true } }, { "gui.navbar.sym", { "", "gui.navbar.sym", true } }, { "gui.navbar.code", { diff --git a/src/widgets/VisualNavbar.cpp b/src/widgets/VisualNavbar.cpp index 8a806a0e..d64cbcb7 100644 --- a/src/widgets/VisualNavbar.cpp +++ b/src/widgets/VisualNavbar.cpp @@ -17,7 +17,8 @@ VisualNavbar::VisualNavbar(MainWindow *main, QWidget *parent) : QToolBar(main), graphicsView(new QGraphicsView), - cursorGraphicsItem(nullptr), + seekGraphicsItem(nullptr), + PCGraphicsItem(nullptr), main(main) { Q_UNUSED(parent); @@ -40,6 +41,7 @@ VisualNavbar::VisualNavbar(MainWindow *main, QWidget *parent) : //addWidget(addsCombo); connect(Core(), SIGNAL(seekChanged(RVA)), this, SLOT(on_seekChanged(RVA))); + connect(Core(), SIGNAL(registersChanged()), this, SLOT(drawPCCursor())); connect(Core(), SIGNAL(refreshAll()), this, SLOT(fetchAndPaintData())); connect(Core(), SIGNAL(functionsChanged()), this, SLOT(fetchAndPaintData())); connect(Core(), SIGNAL(flagsChanged()), this, SLOT(fetchAndPaintData())); @@ -116,8 +118,8 @@ void VisualNavbar::updateGraphicsScene() { graphicsScene->clear(); xToAddress.clear(); - cursorGraphicsItem = nullptr; - + seekGraphicsItem = nullptr; + PCGraphicsItem = nullptr; graphicsScene->setBackgroundBrush(QBrush(Config()->getColor("gui.navbar.empty"))); if (stats.to <= stats.from) { @@ -191,33 +193,42 @@ void VisualNavbar::updateGraphicsScene() // Update scene width graphicsScene->setSceneRect(0, 0, w, h); - drawCursor(); + drawSeekCursor(); } -void VisualNavbar::drawCursor() +void VisualNavbar::drawCursor(RVA addr, QColor color, QGraphicsRectItem *&graphicsItem) { - RVA offset = Core()->getOffset(); - double cursor_x = addressToLocalX(offset); - if (cursorGraphicsItem != nullptr) { - graphicsScene->removeItem(cursorGraphicsItem); - delete cursorGraphicsItem; - cursorGraphicsItem = nullptr; + double cursor_x = addressToLocalX(addr); + if (graphicsItem != nullptr) { + graphicsScene->removeItem(graphicsItem); + delete graphicsItem; + graphicsItem = nullptr; } if (std::isnan(cursor_x)) { return; } int h = this->graphicsView->height(); - cursorGraphicsItem = new QGraphicsRectItem(cursor_x, 0, 2, h); - cursorGraphicsItem->setPen(Qt::NoPen); - cursorGraphicsItem->setBrush(QBrush(Config()->getColor("gui.navbar.err"))); - graphicsScene->addItem(cursorGraphicsItem); + graphicsItem = new QGraphicsRectItem(cursor_x, 0, 2, h); + graphicsItem->setPen(Qt::NoPen); + graphicsItem->setBrush(QBrush(color)); + graphicsScene->addItem(graphicsItem); +} + +void VisualNavbar::drawPCCursor() +{ + drawCursor(Core()->getProgramCounterValue(), Config()->getColor("gui.navbar.pc"), PCGraphicsItem); +} + +void VisualNavbar::drawSeekCursor() +{ + drawCursor(Core()->getOffset(), Config()->getColor("gui.navbar.err"), seekGraphicsItem); } void VisualNavbar::on_seekChanged(RVA addr) { Q_UNUSED(addr); // Update cursor - this->drawCursor(); + this->drawSeekCursor(); } void VisualNavbar::mousePressEvent(QMouseEvent *event) diff --git a/src/widgets/VisualNavbar.h b/src/widgets/VisualNavbar.h index fe7ed332..934fe732 100644 --- a/src/widgets/VisualNavbar.h +++ b/src/widgets/VisualNavbar.h @@ -30,13 +30,16 @@ public slots: private slots: void fetchAndPaintData(); void fetchStats(); - void drawCursor(); + void drawSeekCursor(); + void drawPCCursor(); + void drawCursor(RVA addr, QColor color, QGraphicsRectItem *&graphicsItem); void on_seekChanged(RVA addr); private: QGraphicsView *graphicsView; QGraphicsScene *graphicsScene; - QGraphicsRectItem *cursorGraphicsItem; + QGraphicsRectItem *seekGraphicsItem; + QGraphicsRectItem *PCGraphicsItem; MainWindow *main; BlockStatistics stats;