diff --git a/src/platform/qt/MemoryAccessLogController.cpp b/src/platform/qt/MemoryAccessLogController.cpp index c2f2216d5..d62b2f8a5 100644 --- a/src/platform/qt/MemoryAccessLogController.cpp +++ b/src/platform/qt/MemoryAccessLogController.cpp @@ -65,7 +65,9 @@ void MemoryAccessLogController::updateRegion(const QString& internalName, bool c if (!m_active) { return; } - m_regionMapping[internalName] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, internalName.toUtf8().constData(), activeFlags()); + if (checked && !m_regionMapping.contains(internalName)) { + m_regionMapping[internalName] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, internalName.toUtf8().constData(), activeFlags()); + } emit regionMappingChanged(internalName, checked); } @@ -74,6 +76,38 @@ void MemoryAccessLogController::setFile(const QString& path) { } void MemoryAccessLogController::start(bool loadExisting, bool logExtra) { + if (!m_loaded) { + load(loadExisting); + } + if (!m_loaded) { + return; + } + CoreController::Interrupter interrupter(m_controller); + mDebuggerAccessLoggerStart(&m_logger); + m_logExtra = logExtra; + + m_active = true; + for (const auto& region : m_watchedRegions) { + m_regionMapping[region] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, region.toUtf8().constData(), activeFlags()); + } + emit loggingChanged(true); +} + +void MemoryAccessLogController::stop() { + if (!m_active) { + return; + } + CoreController::Interrupter interrupter(m_controller); + mDebuggerAccessLoggerStop(&m_logger); + emit loggingChanged(false); + interrupter.resume(); + m_active = false; +} + +void MemoryAccessLogController::load(bool loadExisting) { + if (m_loaded) { + return; + } int flags = O_CREAT | O_RDWR; if (!loadExisting) { flags |= O_TRUNC; @@ -83,7 +117,6 @@ void MemoryAccessLogController::start(bool loadExisting, bool logExtra) { LOG(QT, ERROR) << tr("Failed to open memory log file"); return; } - m_logExtra = logExtra; mDebuggerAccessLoggerInit(&m_logger); CoreController::Interrupter interrupter(m_controller); @@ -93,26 +126,22 @@ void MemoryAccessLogController::start(bool loadExisting, bool logExtra) { LOG(QT, ERROR) << tr("Failed to open memory log file"); return; } - mDebuggerAccessLoggerStart(&m_logger); - - m_active = true; - emit loggingChanged(true); - for (const auto& region : m_watchedRegions) { - m_regionMapping[region] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, region.toUtf8().constData(), activeFlags()); - } - interrupter.resume(); + emit loaded(true); + m_loaded = true; } -void MemoryAccessLogController::stop() { - if (!m_active) { +void MemoryAccessLogController::unload() { + if (m_active) { + stop(); + } + if (m_active) { return; } CoreController::Interrupter interrupter(m_controller); m_controller->detachDebuggerModule(&m_logger.d); mDebuggerAccessLoggerDeinit(&m_logger); - emit loggingChanged(false); - interrupter.resume(); - m_active = false; + emit loaded(false); + m_loaded = false; } mDebuggerAccessLogRegionFlags MemoryAccessLogController::activeFlags() const { diff --git a/src/platform/qt/MemoryAccessLogController.h b/src/platform/qt/MemoryAccessLogController.h index 79553b333..b2df55214 100644 --- a/src/platform/qt/MemoryAccessLogController.h +++ b/src/platform/qt/MemoryAccessLogController.h @@ -49,6 +49,7 @@ public: QString file() const { return m_path; } bool active() const { return m_active; } + bool isLoaded() const { return m_loaded; } public slots: void updateRegion(const QString& internalName, bool enable); @@ -57,9 +58,13 @@ public slots: void start(bool loadExisting, bool logExtra); void stop(); + void load(bool loadExisting); + void unload(); + void exportFile(const QString& filename); signals: + void loaded(bool loaded); void loggingChanged(bool active); void regionMappingChanged(const QString& internalName, bool active); @@ -71,6 +76,7 @@ private: QHash m_regionMapping; QVector m_regions; struct mDebuggerAccessLogger m_logger{}; + bool m_loaded = false; bool m_active = false; mDebuggerAccessLogRegion* m_cachedRegion = nullptr; diff --git a/src/platform/qt/MemoryAccessLogView.cpp b/src/platform/qt/MemoryAccessLogView.cpp index 97a0c932e..a06c649ae 100644 --- a/src/platform/qt/MemoryAccessLogView.cpp +++ b/src/platform/qt/MemoryAccessLogView.cpp @@ -26,8 +26,10 @@ MemoryAccessLogView::MemoryAccessLogView(std::weak_ptractive(); + bool loaded = controllerPtr->isLoaded(); auto watchedRegions = controllerPtr->watchedRegions(); QVBoxLayout* regionBox = static_cast(m_ui.regionBox->layout()); @@ -46,11 +48,14 @@ MemoryAccessLogView::MemoryAccessLogView(std::weak_ptrsetEnabled(false); +void MemoryAccessLogView::updateRegion(const QString& internalName, bool checked) { + if (checked) { + m_regionBoxes[internalName]->setEnabled(false); + } } void MemoryAccessLogView::start() { @@ -68,10 +73,23 @@ void MemoryAccessLogView::stop() { return; } controllerPtr->stop(); - for (const auto& region : controllerPtr->watchedRegions()) { - m_regionBoxes[region]->setEnabled(true); +} + +void MemoryAccessLogView::load() { + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { + return; } - m_ui.exportButton->setEnabled(false); + controllerPtr->setFile(m_ui.filename->text()); + controllerPtr->load(m_ui.loadExisting->isChecked()); +} + +void MemoryAccessLogView::unload() { + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { + return; + } + controllerPtr->unload(); } void MemoryAccessLogView::selectFile() { @@ -110,12 +128,26 @@ void MemoryAccessLogView::handleStartStop(bool start) { m_regionBoxes[region]->setChecked(true); } - if (watchedRegions.contains(QString("cart0"))) { - m_ui.exportButton->setEnabled(start); - } - m_ui.start->setDisabled(start); m_ui.stop->setEnabled(start); - m_ui.filename->setDisabled(start); - m_ui.browse->setDisabled(start); + m_ui.unload->setDisabled(start || !controllerPtr->isLoaded()); +} + +void MemoryAccessLogView::handleLoadUnload(bool load) { + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { + return; + } + m_ui.filename->setText(controllerPtr->file()); + + if (load && controllerPtr->canExport()) { + m_ui.exportButton->setEnabled(true); + } else if (!load) { + m_ui.exportButton->setEnabled(false); + } + + m_ui.load->setDisabled(load); + m_ui.unload->setEnabled(load); + m_ui.filename->setDisabled(load); + m_ui.browse->setDisabled(load); } diff --git a/src/platform/qt/MemoryAccessLogView.h b/src/platform/qt/MemoryAccessLogView.h index e221a5d9d..f1f7c0388 100644 --- a/src/platform/qt/MemoryAccessLogView.h +++ b/src/platform/qt/MemoryAccessLogView.h @@ -34,9 +34,13 @@ private slots: void start(); void stop(); + void load(); + void unload(); + void exportFile(); void handleStartStop(bool start); + void handleLoadUnload(bool load); private: Ui::MemoryAccessLogView m_ui; diff --git a/src/platform/qt/MemoryAccessLogView.ui b/src/platform/qt/MemoryAccessLogView.ui index fe9450f53..9fadd0870 100644 --- a/src/platform/qt/MemoryAccessLogView.ui +++ b/src/platform/qt/MemoryAccessLogView.ui @@ -6,8 +6,8 @@ 0 0 - 385 - 380 + 311 + 387 @@ -22,25 +22,25 @@ Log file - - + + - + Browse - + Log additional information (uses 3× space) - + Load existing file if present @@ -50,6 +50,23 @@ + + + + Load + + + + + + + false + + + Unload + + + @@ -124,9 +141,43 @@ + + load + clicked() + QGBA::MemoryAccessLogView + load() + + + 81 + 152 + + + 192 + 189 + + + + + unload + clicked() + QGBA::MemoryAccessLogView + unload() + + + 226 + 152 + + + 192 + 189 + + + start() stop() + load() + unload()