diff --git a/src/Application.cpp b/src/Application.cpp index 38411871..8798ba08 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -575,14 +575,12 @@ namespace Bloom this->projectSettings.value().insightSettings, &(this->qtApplication) ); - - this->insight->activate(); } void Application::onInsightActivationRequest(const Events::InsightActivationRequested&) { if (this->insight) { // Insight has already been activated - this->insight->showMainWindow(); + this->insight->activateMainWindow(); return; } diff --git a/src/Insight/Insight.cpp b/src/Insight/Insight.cpp index 8bcc82d4..0c66a74e 100644 --- a/src/Insight/Insight.cpp +++ b/src/Insight/Insight.cpp @@ -32,14 +32,7 @@ namespace Bloom , environmentConfig(environmentConfig) , insightConfig(insightConfig) , insightProjectSettings(insightProjectSettings) - {} - - void Insight::showMainWindow() { - this->mainWindow->show(); - this->mainWindow->activateWindow(); - } - - void Insight::activate() { + { Logger::info("Starting Insight"); this->eventListener.registerCallbackForEventType( @@ -73,16 +66,6 @@ namespace Bloom QApplication::setQuitOnLastWindowClosed(false); QApplication::setStyle(new BloomProxyStyle()); - auto globalStylesheet = QFile( - QString::fromStdString( - Services::PathService::compiledResourcesPath() + "/src/Insight/UserInterfaces/InsightWindow/Stylesheets/Global.qss" - ) - ); - - if (!globalStylesheet.open(QFile::ReadOnly)) { - throw Exception("Failed to open global stylesheet file"); - } - qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); @@ -133,17 +116,17 @@ namespace Bloom QString::fromStdString(Services::PathService::resourcesDirPath() + "/fonts/Ubuntu/Ubuntu-Th.ttf") ); - QObject::connect( - this->mainWindow, - &InsightWindow::activatedSignal, - this, - &Insight::onInsightWindowActivated + auto globalStylesheet = QFile( + QString::fromStdString( + Services::PathService::compiledResourcesPath() + "/src/Insight/UserInterfaces/InsightWindow/Stylesheets/Global.qss" + ) ); - this->mainWindow->setStyleSheet(globalStylesheet.readAll()); + if (!globalStylesheet.open(QFile::ReadOnly)) { + throw Exception("Failed to open global stylesheet file"); + } - this->mainWindow->setInsightConfig(this->insightConfig); - this->mainWindow->setEnvironmentConfig(this->environmentConfig); + this->globalStylesheet = globalStylesheet.readAll(); // Construct and start worker threads for (std::uint8_t i = 0; i < Insight::INSIGHT_WORKER_COUNT; ++i) { @@ -162,14 +145,35 @@ namespace Bloom workerThread->start(); } - this->mainWindow->init(this->targetControllerService.getTargetDescriptor()); + this->activateMainWindow(); + } + + void Insight::activateMainWindow() { + if (this->mainWindow == nullptr) { + this->mainWindow = new InsightWindow( + this->environmentConfig, + this->insightConfig, + this->insightProjectSettings, + this->targetDescriptor + ); + + this->mainWindow->setStyleSheet(this->globalStylesheet); + + QObject::connect(this->mainWindow, &QObject::destroyed, this, &Insight::onInsightWindowDestroyed); + + this->refreshTargetState(); + } + this->mainWindow->show(); + this->mainWindow->activateWindow(); } void Insight::shutdown() { Logger::info("Shutting down Insight"); - this->mainWindow->close(); + if (this->mainWindow != nullptr) { + this->mainWindow->close(); + } for (auto& [workerId, workerPair] : this->insightWorkersById) { auto* workerThread = workerPair.second; @@ -183,7 +187,7 @@ namespace Bloom } } - void Insight::onInsightWindowActivated() { + void Insight::refreshTargetState() { const auto getTargetStateTask = QSharedPointer(new GetTargetState(), &QObject::deleteLater); QObject::connect( getTargetStateTask.get(), @@ -198,6 +202,10 @@ namespace Bloom InsightWorker::queueTask(getTargetStateTask); } + void Insight::onInsightWindowDestroyed() { + this->mainWindow = nullptr; + } + void Insight::onTargetStoppedEvent(const Events::TargetExecutionStopped& event) { if (this->lastTargetState == TargetState::STOPPED) { return; diff --git a/src/Insight/Insight.hpp b/src/Insight/Insight.hpp index 3a9af303..f53c2eae 100644 --- a/src/Insight/Insight.hpp +++ b/src/Insight/Insight.hpp @@ -57,15 +57,10 @@ namespace Bloom QApplication* parent ); - /** - * Entry point for Insight. - */ - void activate(); - /** * Opens main window and obtains focus. */ - void showMainWindow(); + void activateMainWindow(); /** * Shuts down Insight. Called when the user closes the Insight window or a ShutdownApplication event is fired. @@ -84,13 +79,12 @@ namespace Bloom EventListener& eventListener; Services::TargetControllerService targetControllerService = Services::TargetControllerService(); + Targets::TargetDescriptor targetDescriptor = this->targetControllerService.getTargetDescriptor(); + + QString globalStylesheet; + std::map> insightWorkersById; - InsightWindow* mainWindow = new InsightWindow( - this->environmentConfig, - this->insightConfig, - this->insightProjectSettings, - this->targetControllerService.getTargetDescriptor() - ); + InsightWindow* mainWindow = nullptr; Targets::TargetState lastTargetState = Targets::TargetState::UNKNOWN; bool targetStepping = false; @@ -98,7 +92,8 @@ namespace Bloom InsightSignals* insightSignals = InsightSignals::instance(); - void onInsightWindowActivated(); + void refreshTargetState(); + void onInsightWindowDestroyed(); void onTargetStoppedEvent(const Events::TargetExecutionStopped& event); void onTargetResumedEvent(const Events::TargetExecutionResumed& event); void onTargetResetEvent(const Events::TargetReset& event); diff --git a/src/Insight/UserInterfaces/InsightWindow/InsightWindow.cpp b/src/Insight/UserInterfaces/InsightWindow/InsightWindow.cpp index 41402962..f49b058b 100644 --- a/src/Insight/UserInterfaces/InsightWindow/InsightWindow.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/InsightWindow.cpp @@ -45,6 +45,7 @@ namespace Bloom , targetDescriptor(targetDescriptor) { this->setObjectName("main-window"); + this->setAttribute(Qt::WA_DeleteOnClose, true); this->setWindowTitle("Bloom Insight"); auto windowSize = QSize(1000, 500); @@ -169,6 +170,66 @@ namespace Bloom this->windowContainer->setFixedSize(windowSize); this->layoutContainer->setFixedSize(windowSize); + // InsightSignal connections + auto* insightSignals = InsightSignals::instance(); + + QObject::connect( + insightSignals, + &InsightSignals::targetStateUpdated, + this, + &InsightWindow::onTargetStateUpdate + ); + QObject::connect( + insightSignals, + &InsightSignals::targetReset, + this, + [this] { + this->refreshProgramCounter(); + } + ); + + QObject::connect( + insightSignals, + &InsightSignals::programmingModeEnabled, + this, + &InsightWindow::onProgrammingModeEnabled + ); + QObject::connect( + insightSignals, + &InsightSignals::programmingModeDisabled, + this, + &InsightWindow::onProgrammingModeDisabled + ); + + this->targetNameLabel->setText(QString::fromStdString(this->targetDescriptor.name)); + this->targetIdLabel->setText("0x" + QString::fromStdString(this->targetDescriptor.id).remove("0x").toUpper()); + + this->ioUnavailableWidget->hide(); + + this->populateVariantMenu(); + this->variantMenu->setEnabled(true); + + Logger::debug("Number of target variants supported by Insight: " + + std::to_string(supportedVariantsByName.size())); + + if (this->supportedVariantsByName.empty()) { + if (this->targetDescriptor.variants.empty()) { + this->variantMenu->parentWidget()->hide(); + } + + this->ioUnavailableWidget->setText( + "GPIO inspection is not available for this target. " + "Please report this to Bloom developers by clicking Help -> Report An Issue" + ); + this->ioUnavailableWidget->show(); + + } else { + this->selectDefaultVariant(); + } + + this->createPanes(); + this->setUiDisabled(true); + // Main menu connections QObject::connect( quitAction, @@ -254,42 +315,6 @@ namespace Bloom this, &InsightWindow::toggleFlashInspectionPane ); - - // InsightSignal connections - auto* insightSignals = InsightSignals::instance(); - - QObject::connect( - insightSignals, - &InsightSignals::targetStateUpdated, - this, - &InsightWindow::onTargetStateUpdate - ); - QObject::connect( - insightSignals, - &InsightSignals::targetReset, - this, - [this] { - this->refreshProgramCounter(); - } - ); - - QObject::connect( - insightSignals, - &InsightSignals::programmingModeEnabled, - this, - &InsightWindow::onProgrammingModeEnabled - ); - QObject::connect( - insightSignals, - &InsightSignals::programmingModeDisabled, - this, - &InsightWindow::onProgrammingModeDisabled - ); - } - - void InsightWindow::init(TargetDescriptor targetDescriptor) { - this->targetDescriptor = std::move(targetDescriptor); - this->activate(); } void InsightWindow::resizeEvent(QResizeEvent* event) { @@ -304,19 +329,11 @@ namespace Bloom } void InsightWindow::showEvent(QShowEvent* event) { - if (!this->activated) { - this->activate(); - } - this->adjustPanels(); this->adjustMinimumSize(); } void InsightWindow::closeEvent(QCloseEvent* event) { - if (this->activated) { - this->deactivate(); - } - return QMainWindow::closeEvent(event); } @@ -380,40 +397,6 @@ namespace Bloom } } - void InsightWindow::activate() { - this->targetNameLabel->setText(QString::fromStdString(this->targetDescriptor.name)); - this->targetIdLabel->setText("0x" + QString::fromStdString(this->targetDescriptor.id).remove("0x").toUpper()); - - this->ioUnavailableWidget->hide(); - - this->populateVariantMenu(); - this->variantMenu->setEnabled(true); - - Logger::debug("Number of target variants supported by Insight: " - + std::to_string(supportedVariantsByName.size())); - - if (this->supportedVariantsByName.empty()) { - if (this->targetDescriptor.variants.empty()) { - this->variantMenu->parentWidget()->hide(); - } - - this->ioUnavailableWidget->setText( - "GPIO inspection is not available for this target. " - "Please report this to Bloom developers by clicking Help -> Report An Issue" - ); - this->ioUnavailableWidget->show(); - - } else { - this->selectDefaultVariant(); - } - - this->createPanes(); - - this->setUiDisabled(this->targetState != TargetState::STOPPED); - this->activated = true; - emit this->activatedSignal(); - } - void InsightWindow::populateVariantMenu() { /* * We don't want to present the user with duplicate target variants. @@ -736,92 +719,6 @@ namespace Bloom } } - void InsightWindow::destroyPanes() { - if (this->targetRegistersSidePane != nullptr) { - this->targetRegistersSidePane->deactivate(); - this->targetRegistersSidePane->deleteLater(); - this->targetRegistersSidePane = nullptr; - - this->leftPanel->setVisible(false); - this->targetRegistersButton->setChecked(false); - this->targetRegistersButton->setDisabled(true); - } - - /* - * Before we destroy the memory inspection pane widgets, we take a copy of their current settings (memory - * regions, hex viewer settings, etc), in order to persist them through debug sessions. - */ - if (this->ramInspectionPane != nullptr) { - this->ramInspectionPane->deactivate(); - this->ramInspectionPane->deleteLater(); - this->ramInspectionPane = nullptr; - - this->bottomPanel->setVisible(false); - this->ramInspectionButton->setChecked(false); - this->ramInspectionButton->setDisabled(true); - } - - if (this->eepromInspectionPane != nullptr) { - this->eepromInspectionPane->deactivate(); - this->eepromInspectionPane->deleteLater(); - this->eepromInspectionPane = nullptr; - - this->bottomPanel->setVisible(false); - this->eepromInspectionButton->setChecked(false); - this->eepromInspectionButton->setDisabled(true); - } - - if (this->flashInspectionPane != nullptr) { - this->flashInspectionPane->deactivate(); - this->flashInspectionPane->deleteLater(); - this->flashInspectionPane = nullptr; - - this->bottomPanel->setVisible(false); - this->flashInspectionButton->setChecked(false); - this->flashInspectionButton->setDisabled(true); - } - } - - void InsightWindow::deactivate() { - const auto insightProjectSettings = this->insightProjectSettings; - const auto childWidgets = this->findChildren(); - - for (auto* widget : childWidgets) { - if (widget->windowFlags() & Qt::Window) { - widget->close(); - } - } - - if (this->selectedVariant != nullptr) { - this->previouslySelectedVariant = *(this->selectedVariant); - this->selectedVariant = nullptr; - } - - if (this->targetPackageWidget != nullptr) { - this->targetPackageWidget->hide(); - this->targetPackageWidget->deleteLater(); - this->targetPackageWidget = nullptr; - this->ioContainerWidget->setPackageWidget(this->targetPackageWidget); - } - - this->destroyPanes(); - - this->ioUnavailableWidget->setText("Insight deactivated"); - this->ioUnavailableWidget->show(); - - this->targetStatusLabel->setText("Unknown"); - this->programCounterValueLabel->setText("-"); - - this->variantMenu->clear(); - this->variantMenu->setEnabled(false); - - this->supportedVariantsByName.clear(); - - this->setUiDisabled(true); - this->activated = false; - this->insightProjectSettings = insightProjectSettings; - } - void InsightWindow::adjustPanels() { const auto targetPackageWidgetSize = (this->targetPackageWidget != nullptr) ? this->targetPackageWidget->size() : QSize(); @@ -909,6 +806,7 @@ namespace Bloom } else { this->targetStatusLabel->setText("Unknown"); + this->programCounterValueLabel->setText("-"); } } diff --git a/src/Insight/UserInterfaces/InsightWindow/InsightWindow.hpp b/src/Insight/UserInterfaces/InsightWindow/InsightWindow.hpp index 9a46d217..45655dd2 100644 --- a/src/Insight/UserInterfaces/InsightWindow/InsightWindow.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/InsightWindow.hpp @@ -39,20 +39,6 @@ namespace Bloom const Targets::TargetDescriptor& targetDescriptor ); - void setEnvironmentConfig(const EnvironmentConfig& environmentConfig) { - this->environmentConfig = environmentConfig; - this->targetConfig = environmentConfig.targetConfig; - } - - void setInsightConfig(const InsightConfig& insightConfig) { - this->insightConfig = insightConfig; - } - - void init(Targets::TargetDescriptor targetDescriptor); - - signals: - void activatedSignal(); - protected: void resizeEvent(QResizeEvent* event) override; void showEvent(QShowEvent* event) override; @@ -65,9 +51,7 @@ namespace Bloom EnvironmentConfig environmentConfig; TargetConfig targetConfig; - bool activated = false; - - Targets::TargetDescriptor targetDescriptor; + const Targets::TargetDescriptor& targetDescriptor; Targets::TargetState targetState = Targets::TargetState::UNKNOWN; QWidget* windowContainer = nullptr; @@ -118,13 +102,10 @@ namespace Bloom void setUiDisabled(bool disable); - void activate(); void populateVariantMenu(); void selectDefaultVariant(); void selectVariant(const Targets::TargetVariant* variant); void createPanes(); - void destroyPanes(); - void deactivate(); void adjustPanels(); void adjustMinimumSize();