diff --git a/src/blackgui/components/configsimulatorcomponent.cpp b/src/blackgui/components/configsimulatorcomponent.cpp index 3aa44b8ac..034373f7f 100644 --- a/src/blackgui/components/configsimulatorcomponent.cpp +++ b/src/blackgui/components/configsimulatorcomponent.cpp @@ -41,6 +41,16 @@ namespace BlackGui CLogMessage::preformatted(msg); } + bool CConfigSimulatorComponent::hasUnsavedChanges() const + { + return ui->comp_SettingsSimulator->hasUnsavedChanges(); + } + + void CConfigSimulatorComponent::resetUnsavedChanges() + { + ui->comp_SettingsSimulator->resetUnsavedChanges(); + } + void CConfigSimulatorComponent::preselectSimulators() { CSimulatorInfo sims; @@ -88,6 +98,11 @@ namespace BlackGui return ids; } + void CConfigSimulatorWizardPage::initializePage() + { + m_config->resetUnsavedChanges(); + } + bool CConfigSimulatorWizardPage::validatePage() { Q_ASSERT_X(m_config, Q_FUNC_INFO, "Missing config"); diff --git a/src/blackgui/components/configsimulatorcomponent.h b/src/blackgui/components/configsimulatorcomponent.h index 443ccbc9f..3c6ff6de4 100644 --- a/src/blackgui/components/configsimulatorcomponent.h +++ b/src/blackgui/components/configsimulatorcomponent.h @@ -40,6 +40,12 @@ namespace BlackGui //! Save data void save(); + //! Has unsaved changes + bool hasUnsavedChanges() const; + + //! Reset the flag + void resetUnsavedChanges(); + private: //! Preselect simulators void preselectSimulators(); @@ -64,6 +70,9 @@ namespace BlackGui //! Set config void setConfigComponent(CConfigSimulatorComponent *config) { m_config = config; } + //! \copydoc QWizardPage::initializePage + virtual void initializePage() override; + //! \copydoc QWizardPage::validatePage virtual bool validatePage() override; diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.cpp b/src/blackgui/components/settingssimulatorbasicscomponent.cpp index f2656d73f..00a643e96 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.cpp +++ b/src/blackgui/components/settingssimulatorbasicscomponent.cpp @@ -101,6 +101,7 @@ namespace BlackGui const QString dir = QFileDialog::getExistingDirectory(this, tr("Model directory"), startDirectory, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.isEmpty()) { return; } + m_unsavedChanges = true; const QStringList newDirs = this->addDirectory(dir, this->parseModelDirectories()); this->displayModelDirectories(newDirs); } @@ -111,7 +112,10 @@ namespace BlackGui const QString dir = QFileDialog::getExistingDirectory(this, tr("Exclude directory"), startDirectory, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.isEmpty()) { return; } - const QStringList newDirs = this->addDirectory(dir, this->parseModelDirectories()); + m_unsavedChanges = true; + const QStringList newDirs = CFileUtils::stripLeadingSlashOrDriveLetters( + this->addDirectory(dir, this->parseExcludeDirectories()) + ); this->displayExcludeDirectoryPatterns(newDirs); } @@ -137,6 +141,7 @@ namespace BlackGui s.setModelExcludeDirectories(relativeDirs); const CStatusMessage m = m_settings.setAndSaveSettings(s, simulator); if (!m.isEmpty()) { CLogMessage::preformatted(m); } + m_unsavedChanges = m_unsavedChanges && !m.isSuccess(); // reset if success, but only if there were changes // display as saved this->displaySettings(simulator); @@ -152,12 +157,16 @@ namespace BlackGui if (reply != QMessageBox::Yes) { return; } } - const QString sd(m_settings.defaultSimulatorDirectory(simulator)); - ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(sd)); + // override if values are not empty + const CSpecializedSimulatorSettings ss = m_settings.getSpecializedSettings(simulator); + const QString sd = CFileUtils::fixWindowsUncPath(CFileUtils::normalizeFilePathToQtStandard(ss.defaultSimulatorDirectory(simulator))); + if (!sd.isEmpty()) { ui->le_SimulatorDirectory->setText(sd); m_unsavedChanges = true; } + const QStringList md(m_settings.defaultModelDirectories(simulator)); - this->displayModelDirectories(md); - const QStringList excludes(m_settings.defaultModelExcludeDirectoryPatterns(simulator)); - this->displayExcludeDirectoryPatterns(excludes); + if (!md.isEmpty()) { this->displayModelDirectories(md); m_unsavedChanges = true; } + + const QStringList excludes(ss.defaultModelExcludeDirectoryPatterns(simulator)); + if (!excludes.isEmpty()) { this->displayExcludeDirectoryPatterns(excludes); m_unsavedChanges = true; } } void CSettingsSimulatorBasicsComponent::adjustModelDirectory() @@ -178,7 +187,10 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::reset() { const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); + m_settings.resetToDefaults(simulator); + m_unsavedChanges = true; + ui->le_SimulatorDirectory->clear(); ui->pte_ModelDirectories->clear(); ui->pte_ExcludeDirectories->clear(); @@ -208,6 +220,11 @@ namespace BlackGui return this->parseDirectories(ui->pte_ModelDirectories->toPlainText()); } + QStringList CSettingsSimulatorBasicsComponent::parseExcludeDirectories() const + { + return this->parseDirectories(ui->pte_ExcludeDirectories->toPlainText()); + } + QStringList CSettingsSimulatorBasicsComponent::parseDirectories(const QString &rawString) const { const QString raw = rawString.trimmed(); diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.h b/src/blackgui/components/settingssimulatorbasicscomponent.h index 229265fe5..6fe0f8747 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.h +++ b/src/blackgui/components/settingssimulatorbasicscomponent.h @@ -55,10 +55,17 @@ namespace BlackGui //! Save data void save(); + //! Has unsaved changes + bool hasUnsavedChanges() const { return m_unsavedChanges; } + + //! Reset unsaved changes + void resetUnsavedChanges() { m_unsavedChanges = false; } + //! Settings for given simulator BlackMisc::Simulation::Settings::CSpecializedSimulatorSettings getSimulatorSettings(const BlackMisc::Simulation::CSimulatorInfo &simulator) const { return m_settings.getSpecializedSettings(simulator); } private: + bool m_unsavedChanges = false; QScopedPointer ui; BlackMisc::Simulation::Settings::CMultiSimulatorSettings m_settings { this }; Qt::CaseSensitivity m_fileCaseSensitivity = BlackMisc::CFileUtils::osFileNameCaseSensitivity(); @@ -93,9 +100,12 @@ namespace BlackGui //! Optimize for small layout void setSmallLayout(bool small); - //! Exclude directories from line edit + //! Model directories from line edit QStringList parseModelDirectories() const; + //! Exclude directories from line edit + QStringList parseExcludeDirectories() const; + //! Exclude directories QStringList parseDirectories(const QString &rawString) const;