From 82e42f7e17b58d15beb1cdf4f5f82a26e836c948 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 16 Feb 2018 03:36:36 +0100 Subject: [PATCH] Ref T252, updated CSettingsSimulatorBasicsComponent * avoid saving default values * use new specialized settings --- .../components/installxswiftbuscomponent.cpp | 6 +- .../settingssimulatorbasicscomponent.cpp | 104 +++++++++++------- .../settingssimulatorbasicscomponent.h | 13 ++- 3 files changed, 75 insertions(+), 48 deletions(-) diff --git a/src/blackgui/components/installxswiftbuscomponent.cpp b/src/blackgui/components/installxswiftbuscomponent.cpp index 5ac8fe0ae..defcca979 100644 --- a/src/blackgui/components/installxswiftbuscomponent.cpp +++ b/src/blackgui/components/installxswiftbuscomponent.cpp @@ -190,10 +190,8 @@ namespace BlackGui QString CInstallXSwiftBusComponent::getXPlanePluginDirectory() const { - const CSimulatorSettings settings = m_simulatorSettings.getSettings(CSimulatorInfo::XPLANE); - if (!settings.hasSimulatorDirectory()) { return CXPlaneUtil::xplanePluginDir(); } - const QString dir = CFileUtils::appendFilePaths(settings.getSimulatorDirectory(), CXPlaneUtil::xplanePluginPath()); - return dir; + const CXPlaneSimulatorSettings settings = m_simulatorSettings.getSettings(CSimulatorInfo::XPLANE); + return settings.getPluginDirOrDefault(); } void CInstallXSwiftBusComponent::updatesChanged() diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.cpp b/src/blackgui/components/settingssimulatorbasicscomponent.cpp index 4cf740ece..46c70a787 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.cpp +++ b/src/blackgui/components/settingssimulatorbasicscomponent.cpp @@ -9,6 +9,7 @@ #include "settingssimulatorbasicscomponent.h" #include "ui_settingssimulatorbasicscomponent.h" +#include "blackmisc/simulation/xplane/xplaneutil.h" #include "blackmisc/fileutils.h" #include "blackmisc/logmessage.h" #include "blackconfig/buildconfig.h" @@ -19,6 +20,7 @@ using namespace BlackMisc; using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::Settings; +using namespace BlackMisc::Simulation::XPlane; using namespace BlackConfig; namespace BlackGui @@ -48,9 +50,9 @@ namespace BlackGui connect(ui->pb_CopyDefaults, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::copyDefaults); connect(ui->pb_AdjustModelDirectory, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::adjustModelDirectory); connect(ui->le_SimulatorDirectory, &QLineEdit::returnPressed, this, &CSettingsSimulatorBasicsComponent::simulatorDirectoryEntered); - connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this, &CSettingsSimulatorBasicsComponent::simulatorChanged); + connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this, &CSettingsSimulatorBasicsComponent::onSimulatorChanged); - this->simulatorChanged(); + this->onSimulatorChanged(); } CSettingsSimulatorBasicsComponent::~CSettingsSimulatorBasicsComponent() @@ -76,7 +78,7 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::simulatorFileDialog() { - const QString startDirectory = this->getFileBrowserSimulatorDirectory(); + const QString startDirectory = CFileUtils::fixWindowsUncPath(this->getFileBrowserSimulatorDirectory()); const QString dir = QFileDialog::getExistingDirectory(this, tr("Simulator directory"), startDirectory, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.isEmpty()) { return; } @@ -86,11 +88,11 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::modelFileDialog() { - const QString startDirectory = this->getFileBrowserModelDirectory(); + const QString startDirectory = CFileUtils::fixWindowsUncPath(this->getFileBrowserModelDirectory()); const QString dir = QFileDialog::getExistingDirectory(this, tr("Model directory"), startDirectory, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.isEmpty()) { return; } - const QStringList newDirs = this->addDirectory(dir, this->parseDirectories(ui->pte_ModelDirectories->toPlainText())); + const QStringList newDirs = this->addDirectory(dir, this->parseModelDirectories()); this->displayModelDirectories(newDirs); } @@ -100,7 +102,7 @@ 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->parseDirectories(ui->pte_ExcludeDirectories->toPlainText())); + const QStringList newDirs = this->addDirectory(dir, this->parseModelDirectories()); this->displayExcludeDirectoryPatterns(newDirs); } @@ -115,9 +117,9 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::save() { const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); - CSimulatorSettings s = this->getSettings(simulator); + CSimulatorSettings s = this->getSettings(simulator).getGenericSettings(); const QString simulatorDir(ui->le_SimulatorDirectory->text().trimmed()); - const QStringList modelDirs(this->parseDirectories(ui->pte_ModelDirectories->toPlainText())); + const QStringList modelDirs(this->parseModelDirectories()); const QStringList excludeDirs(this->parseDirectories(ui->pte_ExcludeDirectories->toPlainText())); const QStringList relativeDirs = CFileUtils::makeDirectoriesRelative(excludeDirs, this->getFileBrowserModelDirectory(), m_fileCaseSensitivity); @@ -125,10 +127,7 @@ namespace BlackGui s.setModelDirectories(modelDirs); s.setModelExcludeDirectories(relativeDirs); const CStatusMessage m = m_settings.setAndSaveSettings(s, simulator); - if (!m.isEmpty()) - { - CLogMessage::preformatted(m); - } + if (!m.isEmpty()) { CLogMessage::preformatted(m); } // display as saved this->displaySettings(simulator); @@ -137,37 +136,26 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::copyDefaults() { const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); - const QString sd(m_settings.getDefaultSimulatorDirectory(simulator)); + const QString sd(m_settings.defaultSimulatorDirectory(simulator)); ui->le_SimulatorDirectory->setText(CFileUtils::normalizeFilePathToQtStandard(sd)); - const QStringList md(m_settings.getDefaultModelDirectories(simulator)); + const QStringList md(m_settings.defaultModelDirectories(simulator)); this->displayModelDirectories(md); - const QStringList excludes(m_settings.getDefaultModelExcludeDirectoryPatterns(simulator)); + const QStringList excludes(m_settings.defaultModelExcludeDirectoryPatterns(simulator)); this->displayExcludeDirectoryPatterns(excludes); } void CSettingsSimulatorBasicsComponent::adjustModelDirectory() { const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); - QString simDir = this->getFileBrowserSimulatorDirectory(); - if (simulator.isFsxP3DFamily()) - { - simDir = CFsCommonUtil::fsxSimObjectsDirFromSimDir(simDir); - } - else if (simulator.fs9()) - { - simDir = CFsCommonUtil::fs9AircraftDirFromSimDir(simDir); - } - else if (simulator.xplane()) - { - // There is not really a fixed place in the X-Plane install directory where models are put. - // We just treat the whole X-Plane directory as model directory and search for models in all subdirectories recursively. - } - else - { - return; - } + const QString simDir = this->getFileBrowserSimulatorDirectory(); + CSpecializedSimulatorSettings s = m_settings.getSpecializedSettings(simulator); + s.setSimulatorDirectory(simDir); - const QStringList newDirs = this->addDirectory(simDir, this->parseDirectories(ui->pte_ModelDirectories->toPlainText())); + // There is not really a fixed place in the X-Plane install directory where models are put. + // We just treat the whole X-Plane directory as model directory and search for models in all subdirectories recursively. + + const QStringList parsedDirectories = this->parseModelDirectories(); + const QStringList newDirs = parsedDirectories.size() > 1 ? parsedDirectories : this->removeDirectories(s.getModelDirectoriesFromSimulatorDirectoryOrDefault(), parsedDirectories); this->displayModelDirectories(newDirs); } @@ -183,11 +171,16 @@ namespace BlackGui CLogMessage(this).info("Reset values for settings of %1") << simulator.toQString(true); } - void CSettingsSimulatorBasicsComponent::simulatorChanged() + void CSettingsSimulatorBasicsComponent::onSimulatorChanged() { const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); - this->displayDefaultValuesAsPlaceholder(simulator); this->displaySettings(simulator); + this->displayDefaultValuesAsPlaceholder(simulator); + } + + QStringList CSettingsSimulatorBasicsComponent::parseModelDirectories() const + { + return this->parseDirectories(ui->pte_ModelDirectories->toPlainText()); } QStringList CSettingsSimulatorBasicsComponent::parseDirectories(const QString &rawString) const @@ -221,6 +214,27 @@ namespace BlackGui return dirs; } + QStringList CSettingsSimulatorBasicsComponent::removeDirectory(const QString &directory, const QStringList &existingDirs) + { + const QString d(CFileUtils::normalizeFilePathToQtStandard(directory)); + return this->removeDirectories(QStringList({d}), existingDirs); + } + + QStringList CSettingsSimulatorBasicsComponent::removeDirectories(const QStringList &removeDirectories, const QStringList &existingDirs) + { + if (existingDirs.isEmpty() || removeDirectories.isEmpty()) { return existingDirs; } + const QStringList rDirs = CFileUtils::fixWindowsUncPaths(removeDirectories); + QStringList dirs; + for (const QString &dir : existingDirs) + { + if (rDirs.contains(dir, m_fileCaseSensitivity)) { continue; } + dirs.push_back(dir); + } + dirs.removeDuplicates(); + dirs.sort(m_fileCaseSensitivity); + return dirs; + } + void CSettingsSimulatorBasicsComponent::displayExcludeDirectoryPatterns(const QStringList &dirs) { QStringList cleanedDirs(dirs); @@ -237,11 +251,12 @@ namespace BlackGui cleanedDirs.sort(m_fileCaseSensitivity); const QString d = cleanedDirs.join("\n"); ui->pte_ModelDirectories->setPlainText(d); + this->displayDefaultValuesAsPlaceholder(ui->comp_SimulatorSelector->getValue()); } - CSimulatorSettings CSettingsSimulatorBasicsComponent::getSettings(const CSimulatorInfo &simulator) const + CSpecializedSimulatorSettings CSettingsSimulatorBasicsComponent::getSettings(const CSimulatorInfo &simulator) const { - const CSimulatorSettings s = m_settings.getSettings(simulator); + const CSpecializedSimulatorSettings s = m_settings.getSpecializedSettings(simulator); return s; } @@ -254,12 +269,17 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::displayDefaultValuesAsPlaceholder(const CSimulatorInfo &simulator) { - const QString s = m_settings.getDefaultSimulatorDirectory(simulator); - ui->le_SimulatorDirectory->setPlaceholderText(s.isEmpty() ? "Simulator directory" : s); + const QString simDir = this->getFileBrowserSimulatorDirectory(); + ui->le_SimulatorDirectory->setPlaceholderText(simDir.isEmpty() ? "Simulator directory" : simDir); //! \fixme correct version when Qt multiline placeholder is fixed https://bugreports.qt.io/browse/QTBUG-43817 constexpr bool BrokenMultilinePlaceholder = true; // last checked with Qt 5.10 - const QStringList m = m_settings.getDefaultModelDirectories(simulator); + + // we take the settings and update to latest sim.directory + CSpecializedSimulatorSettings settings = m_settings.getSpecializedSettings(simulator); + settings.setSimulatorDirectory(simDir); + + const QStringList m = settings.getModelDirectoriesFromSimulatorDirectoryOrDefault(); if (m.isEmpty()) { ui->pte_ModelDirectories->setPlaceholderText("Model directories"); @@ -278,7 +298,7 @@ namespace BlackGui } } - const QStringList e = m_settings.getDefaultModelExcludeDirectoryPatterns(simulator); + const QStringList e = settings.getDefaultModelExcludeDirectoryPatterns(); if (e.isEmpty()) { ui->pte_ExcludeDirectories->setPlaceholderText("Exclude directories"); diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.h b/src/blackgui/components/settingssimulatorbasicscomponent.h index b68fc5aa5..7bc577b76 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.h +++ b/src/blackgui/components/settingssimulatorbasicscomponent.h @@ -79,17 +79,26 @@ namespace BlackGui void reset(); //! Simulator has been changed - void simulatorChanged(); + void onSimulatorChanged(); //! Optimize for small layout void setSmallLayout(bool small); //! Exclude directories from line edit + QStringList parseModelDirectories() const; + + //! Exclude directories QStringList parseDirectories(const QString &rawString) const; //! Add a directory QStringList addDirectory(const QString &directory, const QStringList &existingDirs); + //! Remove a directory + QStringList removeDirectory(const QString &directory, const QStringList &existingDirs); + + //! Remove directories + QStringList removeDirectories(const QStringList &directories, const QStringList &existingDirs); + //! Display the directories void displayExcludeDirectoryPatterns(const QStringList &dirs); @@ -97,7 +106,7 @@ namespace BlackGui void displayModelDirectories(const QStringList &dirs); //! Current settings - BlackMisc::Simulation::Settings::CSimulatorSettings getSettings(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + BlackMisc::Simulation::Settings::CSpecializedSimulatorSettings getSettings(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! Display simulator`s settings void displaySettings(const BlackMisc::Simulation::CSimulatorInfo &simulator);