|
15 | 15 | #include <QtWidgets/QFileDialog> |
16 | 16 | #include <QtWidgets/QMessageBox> |
17 | 17 |
|
| 18 | +static constexpr int TIMER_REFRESH_INTERVAL_MS = 100; |
| 19 | + |
18 | 20 | DebuggerWindow::DebuggerWindow(QWidget* parent /* = nullptr */) |
19 | 21 | : QMainWindow(parent), m_active_memory_region(Bus::MemoryRegion::Count) |
20 | 22 | { |
@@ -64,11 +66,16 @@ void DebuggerWindow::onDebuggerMessageReported(const QString& message) |
64 | 66 | m_ui.statusbar->showMessage(message, 0); |
65 | 67 | } |
66 | 68 |
|
| 69 | +void DebuggerWindow::timerRefresh() |
| 70 | +{ |
| 71 | + m_ui.memoryView->forceRefresh(); |
| 72 | +} |
| 73 | + |
67 | 74 | void DebuggerWindow::refreshAll() |
68 | 75 | { |
69 | 76 | m_registers_model->updateValues(); |
70 | 77 | m_stack_model->invalidateView(); |
71 | | - m_ui.memoryView->repaint(); |
| 78 | + m_ui.memoryView->forceRefresh(); |
72 | 79 |
|
73 | 80 | m_code_model->setPC(CPU::g_state.pc); |
74 | 81 | scrollToPC(); |
@@ -478,6 +485,9 @@ void DebuggerWindow::connectSignals() |
478 | 485 |
|
479 | 486 | connect(m_ui.memorySearch, &QPushButton::clicked, this, &DebuggerWindow::onMemorySearchTriggered); |
480 | 487 | connect(m_ui.memorySearchString, &QLineEdit::textChanged, this, &DebuggerWindow::onMemorySearchStringChanged); |
| 488 | + |
| 489 | + connect(&m_refresh_timer, &QTimer::timeout, this, &DebuggerWindow::timerRefresh); |
| 490 | + m_refresh_timer.setInterval(TIMER_REFRESH_INTERVAL_MS); |
481 | 491 | } |
482 | 492 |
|
483 | 493 | void DebuggerWindow::disconnectSignals() |
@@ -514,28 +524,35 @@ void DebuggerWindow::createModels() |
514 | 524 |
|
515 | 525 | void DebuggerWindow::setUIEnabled(bool enabled, bool allow_pause) |
516 | 526 | { |
| 527 | + const bool memory_view_enabled = (enabled || allow_pause); |
| 528 | + |
517 | 529 | m_ui.actionPause->setEnabled(allow_pause); |
518 | 530 |
|
519 | 531 | // Disable all UI elements that depend on execution state |
520 | 532 | m_ui.codeView->setEnabled(enabled); |
521 | 533 | m_ui.registerView->setEnabled(enabled); |
522 | 534 | m_ui.stackView->setEnabled(enabled); |
523 | | - m_ui.memoryView->setEnabled(enabled); |
| 535 | + m_ui.memoryView->setEnabled(memory_view_enabled); |
524 | 536 | m_ui.actionRunToCursor->setEnabled(enabled); |
525 | 537 | m_ui.actionAddBreakpoint->setEnabled(enabled); |
526 | 538 | m_ui.actionToggleBreakpoint->setEnabled(enabled); |
527 | 539 | m_ui.actionClearBreakpoints->setEnabled(enabled); |
528 | | - m_ui.actionDumpAddress->setEnabled(enabled); |
| 540 | + m_ui.actionDumpAddress->setEnabled(memory_view_enabled); |
529 | 541 | m_ui.actionStepInto->setEnabled(enabled); |
530 | 542 | m_ui.actionStepOver->setEnabled(enabled); |
531 | 543 | m_ui.actionStepOut->setEnabled(enabled); |
532 | 544 | m_ui.actionGoToAddress->setEnabled(enabled); |
533 | 545 | m_ui.actionGoToPC->setEnabled(enabled); |
534 | 546 | m_ui.actionTrace->setEnabled(enabled); |
535 | | - m_ui.memoryRegionRAM->setEnabled(enabled); |
536 | | - m_ui.memoryRegionEXP1->setEnabled(enabled); |
537 | | - m_ui.memoryRegionScratchpad->setEnabled(enabled); |
538 | | - m_ui.memoryRegionBIOS->setEnabled(enabled); |
| 547 | + m_ui.memoryRegionRAM->setEnabled(memory_view_enabled); |
| 548 | + m_ui.memoryRegionEXP1->setEnabled(memory_view_enabled); |
| 549 | + m_ui.memoryRegionScratchpad->setEnabled(memory_view_enabled); |
| 550 | + m_ui.memoryRegionBIOS->setEnabled(memory_view_enabled); |
| 551 | + |
| 552 | + // Partial/timer refreshes only active when not paused. |
| 553 | + const bool timer_active = (!enabled && allow_pause); |
| 554 | + if (m_refresh_timer.isActive() != timer_active) |
| 555 | + timer_active ? m_refresh_timer.start() : m_refresh_timer.stop(); |
539 | 556 | } |
540 | 557 |
|
541 | 558 | void DebuggerWindow::saveCurrentState() |
|
0 commit comments