Skip to content

Commit

Permalink
save graph image to file, adjust drawing rectangle borders (#1198)
Browse files Browse the repository at this point in the history
  • Loading branch information
kkthx authored and mrexodia committed Oct 29, 2016
1 parent ee3a6db commit 5ea66f6
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 1 deletion.
23 changes: 22 additions & 1 deletion src/gui/Src/Gui/DisassemblerGraphView.cpp
Expand Up @@ -9,6 +9,7 @@
#include <QClipboard>
#include <QApplication>
#include <QMimeData>
#include <QFileDialog>

DisassemblerGraphView::DisassemblerGraphView(QWidget* parent)
: QAbstractScrollArea(parent),
Expand All @@ -34,6 +35,7 @@ DisassemblerGraphView::DisassemblerGraphView(QWidget* parent)
this->scroll_mode = false;
this->drawOverview = false;
this->blocks.clear();
this->saveGraph = false;

//Create timer to automatically refresh view when it needs to be updated
this->updateTimer = new QTimer();
Expand Down Expand Up @@ -351,7 +353,7 @@ void DisassemblerGraphView::paintEvent(QPaintEvent* event)
int yofs = this->verticalScrollBar()->value();

//Render background
QRect viewportRect = this->viewport()->rect();
QRect viewportRect(this->viewport()->rect().topLeft(), this->viewport()->rect().bottomRight() - QPoint(1,1));
p.setBrush(QBrush(backgroundColor));
p.drawRect(viewportRect);
p.setBrush(Qt::black);
Expand All @@ -367,6 +369,18 @@ void DisassemblerGraphView::paintEvent(QPaintEvent* event)
paintOverview(p, viewportRect, xofs, yofs);
else
paintNormal(p, viewportRect, xofs, yofs);

if (saveGraph)
{
saveGraph = false;
QString path = QFileDialog::getSaveFileName(this, tr("Save as image"), "", tr("PNG file (*.png);;JPG file (*.jpg)"));
if (path.isEmpty())
return;
QImage img(this->size(), QImage::Format_ARGB32);
QPainter painter(&img);
this->viewport()->render(&painter);
img.save(path);
}
}

bool DisassemblerGraphView::isMouseEventInBlock(QMouseEvent* event)
Expand Down Expand Up @@ -1474,6 +1488,7 @@ void DisassemblerGraphView::setupContextMenu()
});
mMenuBuilder->addSeparator();

mMenuBuilder->addAction(mToggleOverview = makeShortcutAction(tr("&Save to file"), SLOT(saveImageSlot()), "ActionGraphSaveImage"));
mMenuBuilder->addAction(mToggleOverview = makeShortcutAction(DIcon("graph.png"), tr("&Overview"), SLOT(toggleOverviewSlot()), "ActionGraphToggleOverview"));
mMenuBuilder->addAction(mToggleSyncOrigin = makeShortcutAction(DIcon("lock.png"), tr("&Sync with origin"), SLOT(toggleSyncOriginSlot()), "ActionGraphSyncOrigin"));
mMenuBuilder->addAction(makeShortcutAction(DIcon("sync.png"), tr("&Refresh"), SLOT(refreshSlot()), "ActionGraphRefresh"));
Expand Down Expand Up @@ -1602,3 +1617,9 @@ void DisassemblerGraphView::refreshSlot()
{
DbgCmdExec(QString("graph %1, force").arg(ToPtrString(this->cur_instr)).toUtf8().constData());
}

void DisassemblerGraphView::saveImageSlot()
{
saveGraph = true;
this->viewport()->update();
}
2 changes: 2 additions & 0 deletions src/gui/Src/Gui/DisassemblerGraphView.h
Expand Up @@ -271,6 +271,7 @@ public slots:
void gotoOriginSlot();
void toggleSyncOriginSlot();
void refreshSlot();
void saveImageSlot();

private:
QString status;
Expand Down Expand Up @@ -307,6 +308,7 @@ public slots:
qreal overviewScale;
duint mCip;
bool forceCenter;
bool saveGraph;

QAction* mToggleOverview;
QAction* mToggleSyncOrigin;
Expand Down
1 change: 1 addition & 0 deletions src/gui/Src/Utils/Configuration.cpp
Expand Up @@ -482,6 +482,7 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
defaultShortcuts.insert("ActionRefresh", Shortcut(tr("Actions -> Refresh"), "F5"));
defaultShortcuts.insert("ActionGraph", Shortcut(tr("Actions -> Graph"), "G"));
defaultShortcuts.insert("ActionGraphFollowDisassembler", Shortcut(tr("Actions -> Graph -> Follow in disassembler"), "Shift+Return"));
defaultShortcuts.insert("ActionGraphSaveImage", Shortcut(tr("Actions -> Graph -> Save as Image"), "S"));
defaultShortcuts.insert("ActionGraphToggleOverview", Shortcut(tr("Actions -> Graph -> Toggle overview"), "O"));
defaultShortcuts.insert("ActionGraphRefresh", Shortcut(tr("Actions -> Graph -> Refresh"), "R"));
defaultShortcuts.insert("ActionGraphSyncOrigin", Shortcut(tr("Actions -> Graph -> Toggle sync with origin"), "S"));
Expand Down

0 comments on commit 5ea66f6

Please sign in to comment.