Skip to content

Commit 5b76962

Browse files
lynnuxmrexodia
authored andcommitted
Tab switch using history stack (x64dbg#1807)
* add OpenViewsWindow * almost done for history view switch * rename the class * add icon in history popup window * astyle format * add config TabSwitchUseHistory, default disable history tab switch * remove no used code * add shortcuts for the stuff * rename HistoryViewsPopupWindow to MultiItemsSelectWindow, for further common use * GUI: some small style adjustments * GUI: change default hotkeys for ViewNextTab
1 parent 7963e52 commit 5b76962

19 files changed

+565
-67
lines changed

src/gui/Src/BasicView/LabeledSplitter.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,14 @@ void LabeledSplitter::detachSlot()
8888
// Find Widget and connect
8989
connect(detachedWidget, SIGNAL(OnClose(LabeledSplitterDetachedWindow*)), this, SLOT(attachSlot(LabeledSplitterDetachedWindow*)));
9090

91-
detachedWidget->setWindowTitle(names.at(currentIndex));
91+
detachedWidget->setWindowTitle(mNames.at(currentIndex));
9292
detachedWidget->index = currentIndex;
9393
// Remove from splitter
9494
QWidget* tearOffWidget = widget(currentIndex);
9595
tearOffWidget->setParent(detachedWidget);
9696

9797
// Add it to the windows list
98-
m_Windows.append(tearOffWidget);
98+
mWindows.append(tearOffWidget);
9999

100100
// Create and show
101101
detachedWidget->setCentralWidget(tearOffWidget);
@@ -110,7 +110,7 @@ void LabeledSplitter::detachSlot()
110110
detachedWidget->showNormal();
111111
detachedWidget->setGeometry(x, y, w, h);
112112
detachedWidget->showNormal();
113-
names.removeAt(currentIndex);
113+
mNames.removeAt(currentIndex);
114114
}
115115

116116
void LabeledSplitter::attachSlot(LabeledSplitterDetachedWindow* widget)
@@ -119,11 +119,11 @@ void LabeledSplitter::attachSlot(LabeledSplitterDetachedWindow* widget)
119119
QWidget* tearOffWidget = widget->centralWidget();
120120

121121
// Remove it from the windows list
122-
for(int i = 0; i < m_Windows.size(); i++)
122+
for(int i = 0; i < mWindows.size(); i++)
123123
{
124-
if(m_Windows.at(i) == tearOffWidget)
124+
if(mWindows.at(i) == tearOffWidget)
125125
{
126-
m_Windows.removeAt(i);
126+
mWindows.removeAt(i);
127127
}
128128
}
129129

@@ -161,7 +161,7 @@ void LabeledSplitterHandle::paintEvent(QPaintEvent* event)
161161
painter.drawLine(rect.left(), rect.height() - 1, rect.right(), rect.height() - 1);
162162
}
163163
QRect textRect(rect.left() + charHeight, rect.top(), rect.width() - charHeight, rect.height());
164-
painter.drawText(textRect, 0, parent->names.at(index));
164+
painter.drawText(textRect, 0, parent->mNames.at(index));
165165
}
166166

167167
void LabeledSplitterHandle::mouseMoveEvent(QMouseEvent* event)
@@ -221,7 +221,7 @@ QSplitterHandle* LabeledSplitter::createHandle()
221221

222222
void LabeledSplitter::addWidget(QWidget* widget, const QString & name)
223223
{
224-
names.push_back(name);
224+
mNames.push_back(name);
225225
addWidget(widget);
226226
}
227227

@@ -246,7 +246,7 @@ void LabeledSplitter::collapseLowerTabs()
246246

247247
void LabeledSplitter::insertWidget(int index, QWidget* widget, const QString & name)
248248
{
249-
names.insert(index, name);
249+
mNames.insert(index, name);
250250
insertWidget(index, widget);
251251
}
252252

src/gui/Src/BasicView/LabeledSplitter.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ class LabeledSplitter : public QSplitter
1717
void insertWidget(int index, QWidget* widget, const QString & name);
1818
void collapseLowerTabs();
1919
void loadFromConfig(const QString & configName);
20-
QList<QString> names;
21-
QList<QWidget*> m_Windows;
20+
2221
public slots:
2322
void attachSlot(LabeledSplitterDetachedWindow* widget);
2423
void contextMenuEvent(QContextMenuEvent* event);
24+
2525
protected slots:
2626
void detachSlot();
2727
void collapseSlot();
2828
void closeSlot();
29+
2930
protected:
3031
QMenu* mMenu;
3132
QAction* mExpandCollapseAction;
@@ -38,6 +39,10 @@ protected slots:
3839
void setupContextMenu();
3940

4041
friend class LabeledSplitterHandle;
42+
43+
private:
44+
QList<QString> mNames;
45+
QList<QWidget*> mWindows;
4146
};
4247

4348
#endif //LABELEDSPLITTER_H

src/gui/Src/BasicView/LabeledSplitterDetachedWindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LabeledSplitterDetachedWindow::LabeledSplitterDetachedWindow(QWidget* parent, La
55
: QMainWindow(parent),
66
index(0)
77
{
8-
m_SplitterWidget = splitterwidget;
8+
mSplitterWidget = splitterwidget;
99
}
1010

1111
LabeledSplitterDetachedWindow::~LabeledSplitterDetachedWindow()

src/gui/Src/BasicView/LabeledSplitterDetachedWindow.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ class LabeledSplitterHandle : public QSplitterHandle
1212
public:
1313
LabeledSplitterHandle(Qt::Orientation o, LabeledSplitter* parent);
1414
int originalSize;
15+
1516
protected slots:
1617
QSize sizeHint() const override;
1718
QSize minimumSizeHint() const override;
1819
void mouseMoveEvent(QMouseEvent* event) override;
1920
void mousePressEvent(QMouseEvent* event) override;
2021
void paintEvent(QPaintEvent* event) override;
2122
void contextMenuEvent(QContextMenuEvent* event) override;
23+
2224
protected:
2325
int getIndex();
24-
int charHeight;
2526
LabeledSplitter* getParent() const;
27+
28+
int charHeight;
2629
};
2730

2831
class LabeledSplitterDetachedWindow : public QMainWindow
@@ -31,16 +34,17 @@ class LabeledSplitterDetachedWindow : public QMainWindow
3134

3235
public:
3336
LabeledSplitterDetachedWindow(QWidget* parent = 0, LabeledSplitter* splitterwidget = 0);
34-
~LabeledSplitterDetachedWindow(void);
37+
~LabeledSplitterDetachedWindow();
38+
3539
int index;
3640

37-
protected:
38-
LabeledSplitter* m_SplitterWidget;
41+
signals:
42+
void OnClose(LabeledSplitterDetachedWindow* widget);
3943

44+
protected:
4045
void closeEvent(QCloseEvent* event);
4146

42-
signals:
43-
void OnClose(LabeledSplitterDetachedWindow* widget);
47+
LabeledSplitter* mSplitterWidget;
4448
};
4549

4650

src/gui/Src/Gui/CPUSideBar.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ void CPUSideBar::updateColors()
6767

6868
void CPUSideBar::updateFonts()
6969
{
70-
m_DefaultFont = mDisas->font();
71-
this->setFont(m_DefaultFont);
70+
mDefaultFont = mDisas->font();
71+
this->setFont(mDefaultFont);
7272

7373
delete mFontMetrics;
74-
mFontMetrics = new CachedFontMetrics(this, m_DefaultFont);
74+
mFontMetrics = new CachedFontMetrics(this, mDefaultFont);
7575
fontWidth = mFontMetrics->width(' ');
7676
fontHeight = mFontMetrics->height();
7777

src/gui/Src/Gui/CPUSideBar.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public slots:
6060
CachedFontMetrics* mFontMetrics;
6161
dsint topVA;
6262
dsint selectedVA;
63-
QFont m_DefaultFont;
63+
QFont mDefaultFont;
6464
int fontWidth, fontHeight;
6565
int viewableRows;
6666
int mBulletRadius;

src/gui/Src/Gui/MainWindow.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ MainWindow::MainWindow(QWidget* parent)
211211
mTraceBrowser->setWindowIcon(DIcon("trace.png"));
212212
connect(mTraceBrowser, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidget()));
213213

214-
// Create the tab widget and enable detaching and hiding
215214
mTabWidget = new MHTabWidget(this, true, true);
216215

217216
// Add all widgets to the list
@@ -321,6 +320,8 @@ MainWindow::MainWindow(QWidget* parent)
321320
connect(ui->actionGraph, SIGNAL(triggered()), this, SLOT(displayGraphWidget()));
322321
connect(ui->actionPreviousTab, SIGNAL(triggered()), this, SLOT(displayPreviousTab()));
323322
connect(ui->actionNextTab, SIGNAL(triggered()), this, SLOT(displayNextTab()));
323+
connect(ui->actionPreviousView, SIGNAL(triggered()), this, SLOT(displayPreviousView()));
324+
connect(ui->actionNextView, SIGNAL(triggered()), this, SLOT(displayNextView()));
324325
connect(ui->actionHideTab, SIGNAL(triggered()), this, SLOT(hideTab()));
325326
makeCommandAction(ui->actionStepIntoSource, "TraceIntoConditional src.line(cip) && !src.disp(cip)");
326327
makeCommandAction(ui->actionStepOverSource, "TraceOverConditional src.line(cip) && !src.disp(cip)");
@@ -690,6 +691,8 @@ void MainWindow::refreshShortcuts()
690691
setGlobalShortcut(ui->actionGraph, ConfigShortcut("ViewGraph"));
691692
setGlobalShortcut(ui->actionPreviousTab, ConfigShortcut("ViewPreviousTab"));
692693
setGlobalShortcut(ui->actionNextTab, ConfigShortcut("ViewNextTab"));
694+
setGlobalShortcut(ui->actionPreviousView, ConfigShortcut("ViewPreviousHistory"));
695+
setGlobalShortcut(ui->actionNextView, ConfigShortcut("ViewNextHistory"));
693696
setGlobalShortcut(ui->actionHideTab, ConfigShortcut("ViewHideTab"));
694697

695698
setGlobalShortcut(ui->actionRun, ConfigShortcut("DebugRun"));
@@ -904,6 +907,17 @@ void MainWindow::dropEvent(QDropEvent* pEvent)
904907
}
905908
}
906909

910+
bool MainWindow::event(QEvent* event)
911+
{
912+
// just make sure mTabWidget take current view as the latest
913+
if(event->type() == QEvent::WindowActivate && this->isActiveWindow())
914+
{
915+
mTabWidget->setCurrentIndex(mTabWidget->currentIndex());
916+
}
917+
918+
return QMainWindow::event(event);
919+
}
920+
907921
void MainWindow::updateWindowTitleSlot(QString filename)
908922
{
909923
if(filename.length())
@@ -963,6 +977,16 @@ void MainWindow::displayNextTab()
963977
mTabWidget->showNextTab();
964978
}
965979

980+
void MainWindow::displayPreviousView()
981+
{
982+
mTabWidget->showPreviousView();
983+
}
984+
985+
void MainWindow::displayNextView()
986+
{
987+
mTabWidget->showNextView();
988+
}
989+
966990
void MainWindow::hideTab()
967991
{
968992
mTabWidget->deleteCurrentTab();

src/gui/Src/Gui/MainWindow.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ public slots:
9292
void displayRunTrace();
9393
void displayPreviousTab();
9494
void displayNextTab();
95+
void displayPreviousView();
96+
void displayNextView();
9597
void hideTab();
9698
void openSettings();
9799
void openAppearance();
@@ -265,6 +267,7 @@ public slots:
265267
protected:
266268
void dragEnterEvent(QDragEnterEvent* pEvent);
267269
void dropEvent(QDropEvent* pEvent);
270+
bool event(QEvent* event);
268271

269272
public:
270273
static QString windowTitle;

src/gui/Src/Gui/MainWindow.ui

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@
8181
<addaction name="separator"/>
8282
<addaction name="actionPreviousTab"/>
8383
<addaction name="actionNextTab"/>
84+
<addaction name="actionPreviousView"/>
85+
<addaction name="actionNextView"/>
8486
<addaction name="actionHideTab"/>
8587
</widget>
8688
<widget class="QMenu" name="menuDebug">
@@ -1107,6 +1109,24 @@
11071109
<string>Next Tab</string>
11081110
</property>
11091111
</action>
1112+
<action name="actionPreviousView">
1113+
<property name="icon">
1114+
<iconset resource="../../resource.qrc">
1115+
<normaloff>:/icons/images/previous.png</normaloff>:/icons/images/previous.png</iconset>
1116+
</property>
1117+
<property name="text">
1118+
<string>Previous View</string>
1119+
</property>
1120+
</action>
1121+
<action name="actionNextView">
1122+
<property name="icon">
1123+
<iconset resource="../../resource.qrc">
1124+
<normaloff>:/icons/images/next.png</normaloff>:/icons/images/next.png</iconset>
1125+
</property>
1126+
<property name="text">
1127+
<string>Next View</string>
1128+
</property>
1129+
</action>
11101130
<action name="actionHideTab">
11111131
<property name="icon">
11121132
<iconset resource="../../resource.qrc">

0 commit comments

Comments
 (0)