Skip to content

Commit 282539c

Browse files
committed
Raise/focus docks for Goto actions, and create them if UI edit mode is enabled
1 parent 9e1611d commit 282539c

File tree

5 files changed

+74
-13
lines changed

5 files changed

+74
-13
lines changed

gui/qt/debugger.cpp

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2004,23 +2004,54 @@ void MainWindow::gotoPressed() {
20042004

20052005
void MainWindow::gotoDisasmAddr(uint32_t address) {
20062006
disasmUpdateAddr(address, false);
2007+
raiseContainingDock(ui->disasm);
2008+
ui->disasm->setFocus();
2009+
}
2010+
2011+
QAction *MainWindow::gotoDisasmAction(QMenu *menu) {
2012+
QAction *gotoDisasm = menu->addAction(ACTION_GOTO_DISASM_VIEW);
2013+
gotoDisasm->setEnabled(m_uiEditMode || ui->debugDisassemblyWidget->isVisible());
2014+
return gotoDisasm;
20072015
}
20082016

20092017
void MainWindow::gotoMemAddr(uint32_t address) {
2010-
if (m_memWidget != Q_NULLPTR) {
2011-
memGoto(m_memWidget, address);
2012-
} else {
2013-
for (HexWidget *edit : { ui->flashEdit, ui->ramEdit }) {
2018+
HexWidget *memWidget = m_memWidget;
2019+
bool didGoto = false;
2020+
if (memWidget == Q_NULLPTR && !ui->debugMemoryWidget->isVisible()) {
2021+
memWidget = firstMemWidget();
2022+
}
2023+
if (memWidget == Q_NULLPTR) {
2024+
for (HexWidget *edit : ui->debugMemoryWidget->findChildren<HexWidget*>()) {
20142025
uint32_t offset = address - edit->getBase();
20152026
if (offset < edit->getSize()) {
2016-
edit->setFocus();
20172027
edit->setOffset(offset);
2028+
memWidget = edit;
2029+
didGoto = true;
20182030
break;
20192031
}
20202032
}
2033+
if (!didGoto) {
2034+
if (m_docksMemory.isEmpty() && m_uiEditMode) {
2035+
addMemDock(randomString(20), 8, true);
2036+
}
2037+
memWidget = firstMemWidget();
2038+
}
2039+
}
2040+
if (memWidget != Q_NULLPTR) {
2041+
if (!didGoto) {
2042+
memGoto(memWidget, address);
2043+
}
2044+
raiseContainingDock(memWidget);
2045+
memWidget->setFocus();
20212046
}
20222047
}
20232048

2049+
QAction *MainWindow::gotoMemAction(QMenu *menu, bool vat) {
2050+
QAction *gotoMem = menu->addAction(vat ? ACTION_GOTO_VAT_MEMORY_VIEW : ACTION_GOTO_MEMORY_VIEW);
2051+
gotoMem->setEnabled(m_uiEditMode || ui->debugMemoryWidget->isVisible() || !m_docksMemory.isEmpty());
2052+
return gotoMem;
2053+
}
2054+
20242055
void MainWindow::handleCtrlClickText(QPlainTextEdit *edit) {
20252056
if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) {
20262057
bool ok = true;
@@ -2552,7 +2583,7 @@ void MainWindow::contextOp(const QPoint &posa) {
25522583
QString data = obj->item(obj->selectionModel()->selectedRows().first().row(), obj->objectName() == QStringLiteral("opView") ? 2 : 1)->text();
25532584

25542585
QMenu menu;
2555-
QAction *gotoMem = menu.addAction(ACTION_GOTO_MEMORY_VIEW);
2586+
QAction *gotoMem = gotoMemAction(&menu);
25562587
QAction *copyAddr = menu.addAction(ACTION_COPY_ADDR);
25572588
menu.addSeparator();
25582589
QAction *copyData = menu.addAction(ACTION_COPY_DATA);
@@ -2579,17 +2610,17 @@ void MainWindow::contextVat(const QPoint &posa) {
25792610
QString vatAddr = obj->item(obj->selectionModel()->selectedRows().first().row(), VAT_VAT_ADDR_COL)->text();
25802611

25812612
QMenu menu;
2582-
QAction *gotoMem = menu.addAction(ACTION_GOTO_MEMORY_VIEW);
2583-
QAction *gotoVat = menu.addAction(ACTION_GOTO_VAT_MEMORY_VIEW);
2584-
QAction *gotoDisasm = menu.addAction(ACTION_GOTO_DISASM_VIEW);
2613+
QAction *gotoMem = gotoMemAction(&menu);
2614+
QAction *gotoVat = gotoMemAction(&menu, true);
2615+
QAction *gotoDisasm = gotoDisasmAction(&menu);
25852616

25862617
QAction *item = menu.exec(globalPos);
25872618
if (item == gotoMem) {
25882619
gotoMemAddr(hex2int(addr));
25892620
} else if (item == gotoVat) {
25902621
gotoMemAddr(hex2int(vatAddr));
25912622
} else if (item == gotoDisasm) {
2592-
disasmUpdateAddr(hex2int(addr) + 4, false);
2623+
gotoDisasmAddr(hex2int(addr) + 4);
25932624
}
25942625
}
25952626

@@ -2604,6 +2635,16 @@ void MainWindow::memDocksUpdate() {
26042635
}
26052636
}
26062637

2638+
HexWidget *MainWindow::firstMemWidget() {
2639+
if (!m_docksMemory.isEmpty()) {
2640+
QWidget *dock = findChild<QDockWidget*>(m_docksMemory.first());
2641+
if (dock != Q_NULLPTR) {
2642+
return dock->findChild<HexWidget*>();
2643+
}
2644+
}
2645+
return Q_NULLPTR;
2646+
}
2647+
26072648
//------------------------------------------------
26082649
// Stepping
26092650
//------------------------------------------------

gui/qt/mainwindow.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,17 @@ bool MainWindow::redistributeDocks(const QPoint &pos, const QPoint &offset,
985985
return false;
986986
}
987987

988+
void MainWindow::raiseContainingDock(QWidget *widget) {
989+
QWidget *dock = findSelfOrParent<QDockWidget*>(widget);
990+
if (dock != Q_NULLPTR) {
991+
if (m_uiEditMode) {
992+
dock->show();
993+
}
994+
dock->activateWindow();
995+
dock->raise();
996+
}
997+
}
998+
988999
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event) {
9891000
if (!childAt(event->pos())) {
9901001
int sep = style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent, Q_NULLPTR, this);
@@ -2489,7 +2500,7 @@ void MainWindow::contextDisasm(const QPoint &posa) {
24892500
QAction *toggleWrite = menu.addAction(ACTION_TOGGLE_WRITE);
24902501
QAction *toggleRw = menu.addAction(ACTION_TOGGLE_RW);
24912502
menu.addSeparator();
2492-
QAction *gotoMem = menu.addAction(ACTION_GOTO_MEMORY_VIEW);
2503+
QAction *gotoMem = gotoMemAction(&menu);
24932504
QAction *setPc = menu.addAction(tr("Set PC"));
24942505

24952506
QAction *item = menu.exec(globalPos);
@@ -2575,8 +2586,8 @@ void MainWindow::contextConsole(const QPoint &posa) {
25752586
ui->console->setTextCursor(cursor);
25762587

25772588
QMenu menu;
2578-
QAction *gotoMem = menu.addAction(ACTION_GOTO_MEMORY_VIEW);
2579-
QAction *gotoDisasm = menu.addAction(ACTION_GOTO_DISASM_VIEW);
2589+
QAction *gotoMem = gotoMemAction(&menu);
2590+
QAction *gotoDisasm = gotoDisasmAction(&menu);
25802591
menu.addSeparator();
25812592
QAction *toggleBreak = menu.addAction(ACTION_TOGGLE_BREAK);
25822593
QAction *toggleRead = menu.addAction(ACTION_TOGGLE_READ);

gui/qt/mainwindow.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,9 @@ class MainWindow : public QMainWindow {
318318
// goto
319319
void gotoPressed();
320320
void gotoDisasmAddr(uint32_t addr);
321+
QAction *gotoDisasmAction(QMenu *menu);
321322
void gotoMemAddr(uint32_t addr);
323+
QAction *gotoMemAction(QMenu *menu, bool vat = false);
322324

323325
void handleCtrlClickText(QPlainTextEdit *edit);
324326
void handleCtrlClickLine(QLineEdit *edit);
@@ -517,6 +519,7 @@ class MainWindow : public QMainWindow {
517519
void memSyncEdit(HexWidget *edit);
518520
void memAsciiToggle(HexWidget *edit);
519521
void memDocksUpdate();
522+
HexWidget *firstMemWidget();
520523
void addMemDock(const QString &magic, int bytes, bool ascii);
521524
void addVisualizerDock(const QString &magic, const QString &config);
522525
void addKeyHistoryDock(const QString &magic, int size);
@@ -574,6 +577,7 @@ class MainWindow : public QMainWindow {
574577
Qt::CursorShape cursorShape,
575578
int (QSize::*dimension)() const,
576579
Qt::Orientation orientation);
580+
void raiseContainingDock(QWidget *widget);
577581

578582
// Members
579583
Ui::MainWindow *ui = Q_NULLPTR;

gui/qt/memorywidget.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,14 @@ void MainWindow::contextMemWidget(const QPoint &pos, uint32_t address) {
267267
QAction *toggleRead = menu.addAction(ACTION_TOGGLE_READ);
268268
QAction *toggleWrite = menu.addAction(ACTION_TOGGLE_WRITE);
269269
QAction *toggleReadWrite = menu.addAction(ACTION_TOGGLE_RW);
270+
menu.addSeparator();
271+
QAction *gotoDisasm = gotoDisasmAction(&menu);
270272

271273
QAction* item = menu.exec(pos);
272274
if (item == copyAddr) {
273275
qApp->clipboard()->setText(addr.toLatin1());
276+
} else if (item == gotoDisasm) {
277+
gotoDisasmAddr(address);
274278
} else if (item == toggleBreak) {
275279
breakAdd(breakNextLabel(), address, true, true, false);
276280
memDocksUpdate();

gui/qt/settings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,7 @@ void MainWindow::addKeyHistoryDock(const QString &magic, int size) {
11651165
});
11661166

11671167
dw->setState(m_uiEditMode);
1168+
dw->setAttribute(Qt::WA_DeleteOnClose);
11681169
addDockWidget(Qt::RightDockWidgetArea, dw);
11691170
dw->setObjectName(magic);
11701171
dw->setWidget(widget);

0 commit comments

Comments
 (0)