diff --git a/src/gui/Src/Gui/CPUWidget.cpp b/src/gui/Src/Gui/CPUWidget.cpp index af13fb6a..a0354853 100644 --- a/src/gui/Src/Gui/CPUWidget.cpp +++ b/src/gui/Src/Gui/CPUWidget.cpp @@ -9,6 +9,7 @@ #include "CPURegistersView.h" #include "CPUInfoBox.h" #include "CPUArgumentWidget.h" +#include "DisassemblerGraphView.h" #include "Configuration.h" CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) @@ -22,6 +23,8 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) mSideBar = new CPUSideBar(mDisas); mDisas->setSideBar(mSideBar); mArgumentWidget = new CPUArgumentWidget(this); + mGraphView = new DisassemblerGraphView(this); + connect(mDisas, SIGNAL(tableOffsetChanged(dsint)), mSideBar, SLOT(changeTopmostAddress(dsint))); connect(mDisas, SIGNAL(viewableRowsChanged(int)), mSideBar, SLOT(setViewableRows(int))); connect(mDisas, SIGNAL(selectionChanged(dsint)), mSideBar, SLOT(setSelection(dsint))); @@ -35,6 +38,9 @@ CPUWidget::CPUWidget(QWidget* parent) : QWidget(parent), ui(new Ui::CPUWidget) ui->mTopLeftUpperLeftFrameLayout->addWidget(mSideBar); ui->mTopLeftUpperRightFrameLayout->addWidget(mDisas); + ui->mTopLeftUpperRightFrameLayout->addWidget(mGraphView); + mGraphView->hide(); + disasMode = true; ui->mTopLeftVSplitter->setCollapsible(1, true); //allow collapsing of the InfoBox connect(ui->mTopLeftVSplitter, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved(int, int))); @@ -149,9 +155,33 @@ void CPUWidget::setDefaultDisposition() void CPUWidget::setDisasmFocus() { + if(!disasMode) + { + mGraphView->hide(); + mDisas->show(); + mSideBar->show(); + disasMode = true; + } mDisas->setFocus(); } +void CPUWidget::setGraphFocus() +{ + if(disasMode) + { + mDisas->hide(); + mSideBar->hide(); + mGraphView->show(); + disasMode = false; + } + mGraphView->setFocus(); +} + +duint CPUWidget::getSelectionVa() +{ + return disasMode ? mDisas->getSelectedVa() : mGraphView->get_cursor_pos(); +} + CPUSideBar* CPUWidget::getSidebarWidget() { return mSideBar; diff --git a/src/gui/Src/Gui/CPUWidget.h b/src/gui/Src/Gui/CPUWidget.h index ef7f0e79..de4c9e7d 100644 --- a/src/gui/Src/Gui/CPUWidget.h +++ b/src/gui/Src/Gui/CPUWidget.h @@ -2,6 +2,7 @@ #define CPUWIDGET_H #include +#include "Bridge.h" class QVBoxLayout; class CPUSideBar; @@ -11,6 +12,7 @@ class CPUStack; class CPURegistersView; class CPUInfoBox; class CPUArgumentWidget; +class DisassemblerGraphView; namespace Ui { @@ -28,10 +30,13 @@ public: // Misc void setDefaultDisposition(); void setDisasmFocus(); + void setGraphFocus(); void saveWindowSettings(); void loadWindowSettings(); + duint getSelectionVa(); + // Widget getters CPUSideBar* getSidebarWidget(); CPUDisassembly* getDisasmWidget(); @@ -42,12 +47,15 @@ public: protected: CPUSideBar* mSideBar; CPUDisassembly* mDisas; + DisassemblerGraphView* mGraphView; CPUMultiDump* mDump; CPUStack* mStack; CPURegistersView* mGeneralRegs; CPUInfoBox* mInfo; CPUArgumentWidget* mArgumentWidget; + bool disasMode; + private: Ui::CPUWidget* ui; diff --git a/src/gui/Src/Gui/MainWindow.cpp b/src/gui/Src/Gui/MainWindow.cpp index ca3ef6bc..6ad93c26 100644 --- a/src/gui/Src/Gui/MainWindow.cpp +++ b/src/gui/Src/Gui/MainWindow.cpp @@ -202,11 +202,6 @@ MainWindow::MainWindow(QWidget* parent) mHandlesView->setWindowTitle(tr("Handles")); mHandlesView->setWindowIcon(DIcon("handles.png")); - // Graph view - mGraphView = new DisassemblerGraphView(this); - mGraphView->setWindowTitle(tr("Graph")); - mGraphView->setWindowIcon(DIcon("graph.png")); - // Trace view mTraceWidget = new TraceWidget(this); mTraceWidget->setWindowTitle(tr("Trace")); @@ -217,7 +212,6 @@ MainWindow::MainWindow(QWidget* parent) // Add all widgets to the list mWidgetList.push_back(WidgetInfo(mCpuWidget, "CPUTab")); - mWidgetList.push_back(WidgetInfo(mGraphView, "GraphTab")); mWidgetList.push_back(WidgetInfo(mLogView, "LogTab")); mWidgetList.push_back(WidgetInfo(mNotesManager, "NotesTab")); mWidgetList.push_back(WidgetInfo(mBreakpointsView, "BreakpointsTab")); @@ -1066,6 +1060,7 @@ void MainWindow::updateWindowTitleSlot(QString filename) void MainWindow::displayCpuWidget() { showQWidgetTab(mCpuWidget); + mCpuWidget->setDisasmFocus(); } void MainWindow::displaySymbolWidget() @@ -1090,7 +1085,8 @@ void MainWindow::displayThreadsWidget() void MainWindow::displayGraphWidget() { - showQWidgetTab(mGraphView); + showQWidgetTab(mCpuWidget); + mCpuWidget->setGraphFocus(); } void MainWindow::displayPreviousTab() @@ -1518,7 +1514,7 @@ void MainWindow::setNameMenu(int hMenu, QString name) void MainWindow::runSelection() { if(DbgIsDebugging()) - DbgCmdExec(("run " + ToPtrString(mGraphView->hasFocus() ? mGraphView->get_cursor_pos() : mCpuWidget->getDisasmWidget()->getSelectedVa())).toUtf8().constData()); + DbgCmdExec(("run " + ToPtrString(mCpuWidget->getSelectionVa())).toUtf8().constData()); } void MainWindow::runExpression() diff --git a/src/gui/Src/Gui/MainWindow.h b/src/gui/Src/Gui/MainWindow.h index 3f414a93..3cba6a1c 100644 --- a/src/gui/Src/Gui/MainWindow.h +++ b/src/gui/Src/Gui/MainWindow.h @@ -29,7 +29,6 @@ class MainWindowCloseThread; class TimeWastedCounter; class NotesManager; class SettingsDialog; -class DisassemblerGraphView; class SimpleTraceDialog; class MRUList; class UpdateChecker; @@ -180,7 +179,6 @@ private: CalculatorDialog* mCalculatorDialog; HandlesView* mHandlesView; NotesManager* mNotesManager; - DisassemblerGraphView* mGraphView; TraceWidget* mTraceWidget; SimpleTraceDialog* mSimpleTraceDialog; UpdateChecker* mUpdateChecker; diff --git a/src/gui/Src/Tracer/TraceBrowser.cpp b/src/gui/Src/Tracer/TraceBrowser.cpp index a53d01c0..52eb698c 100644 --- a/src/gui/Src/Tracer/TraceBrowser.cpp +++ b/src/gui/Src/Tracer/TraceBrowser.cpp @@ -736,13 +736,7 @@ void TraceBrowser::mousePressEvent(QMouseEvent* event) setSingleSelection(index); mHistory.addVaToHistory(index); updateViewport(); - - if(mAutoDisassemblyFollowSelection) - followDisassemblySlot(); - - REGDUMP temp; - temp = mTraceFile->Registers(getInitialSelection()); - emit updateTraceRegistersView(&temp); + selectionChanged(); return; break; @@ -874,13 +868,22 @@ void TraceBrowser::keyPressEvent(QKeyEvent* event) mHistory.addVaToHistory(visibleindex); updateViewport(); - if(mAutoDisassemblyFollowSelection) - followDisassemblySlot(); + selectionChanged(); } else AbstractTableView::keyPressEvent(event); } +void TraceBrowser::selectionChanged() +{ + if(mAutoDisassemblyFollowSelection) + followDisassemblySlot(); + + REGDUMP temp; + temp = mTraceFile->Registers(getInitialSelection()); + emit updateTraceRegistersView(&temp); +} + void TraceBrowser::tokenizerConfigUpdatedSlot() { mDisasm->UpdateConfig(); @@ -1095,6 +1098,7 @@ void TraceBrowser::gotoNextSlot() setSingleSelection(index); makeVisible(index); updateViewport(); + selectionChanged(); } } @@ -1106,6 +1110,7 @@ void TraceBrowser::gotoPreviousSlot() setSingleSelection(index); makeVisible(index); updateViewport(); + selectionChanged(); } } diff --git a/src/gui/Src/Tracer/TraceBrowser.h b/src/gui/Src/Tracer/TraceBrowser.h index d1b52265..9ad18590 100644 --- a/src/gui/Src/Tracer/TraceBrowser.h +++ b/src/gui/Src/Tracer/TraceBrowser.h @@ -46,6 +46,7 @@ private: void pushSelectionInto(bool copyBytes, QTextStream & stream, QTextStream* htmlStream = nullptr); void copySelectionSlot(bool copyBytes); void copySelectionToFileSlot(bool copyBytes); + void selectionChanged(); void contextMenuEvent(QContextMenuEvent* event) override; void mousePressEvent(QMouseEvent* event) override;