diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.cpp b/src/blackgui/components/settingssimulatorbasicscomponent.cpp index 5b9b934a4..7d2c3bce8 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.cpp +++ b/src/blackgui/components/settingssimulatorbasicscomponent.cpp @@ -15,6 +15,7 @@ using namespace BlackMisc; using namespace BlackMisc::Simulation; +using namespace BlackMisc::Simulation::FsCommon; using namespace BlackConfig; namespace BlackGui @@ -35,6 +36,7 @@ namespace BlackGui connect(ui->pb_Save, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::save); connect(ui->pb_Reset, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_reset); connect(ui->pb_CopyDefaults, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_copyDefaults); + connect(ui->pb_AdjustModelDirectory, &QPushButton::clicked, this, &CSettingsSimulatorBasicsComponent::ps_adjustModelDirectory); connect(ui->le_SimulatorDirectory, &QLineEdit::returnPressed, this, &CSettingsSimulatorBasicsComponent::ps_simulatorDirectoryEntered); connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this, &CSettingsSimulatorBasicsComponent::ps_simulatorChanged); @@ -131,6 +133,25 @@ namespace BlackGui this->displayExcludeDirectoryPatterns(excludes); } + void CSettingsSimulatorBasicsComponent::ps_adjustModelDirectory() + { + const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); + QString simDir = this->getFileBrowserSimulatorDirectory(); + if (simulator.isFsxFamily()) + { + simDir = CFsCommonUtil::fsxSimObjectsDirFromSimDir(simDir); + } + else if (simulator.fs9()) + { + simDir = CFsCommonUtil::fs9AircraftDirFromSimDir(simDir); + } + + //! \todo counterpart function for XP + + const QStringList newDirs = this->addDirectory(simDir, this->parseDirectories(ui->pte_ModelDirectories->toPlainText())); + this->displayModelDirectories(newDirs); + } + void CSettingsSimulatorBasicsComponent::ps_reset() { const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue()); @@ -182,13 +203,19 @@ namespace BlackGui void CSettingsSimulatorBasicsComponent::displayExcludeDirectoryPatterns(const QStringList &dirs) { - const QString d = dirs.join("\n"); + QStringList cleanedDirs(dirs); + cleanedDirs.removeDuplicates(); + cleanedDirs.sort(this->m_fileCaseSensitivity); + const QString d = cleanedDirs.join("\n"); ui->pte_ExcludeDirectories->setPlainText(d); } void CSettingsSimulatorBasicsComponent::displayModelDirectories(const QStringList &dirs) { - const QString d = dirs.join("\n"); + QStringList cleanedDirs(dirs); + cleanedDirs.removeDuplicates(); + cleanedDirs.sort(this->m_fileCaseSensitivity); + const QString d = cleanedDirs.join("\n"); ui->pte_ModelDirectories->setPlainText(d); } diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.h b/src/blackgui/components/settingssimulatorbasicscomponent.h index 473c26813..86964dee3 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.h +++ b/src/blackgui/components/settingssimulatorbasicscomponent.h @@ -13,6 +13,7 @@ #define BLACKGUI_COMPONENTS_SETTINGSSIMULATORBASICSCOMPONENT_H #include "blackmisc/simulation/simulatorsettings.h" +#include "blackmisc/simulation/fscommon/fscommonutil.h" #include #include @@ -51,6 +52,7 @@ namespace BlackGui void ps_simulatorFileDialog(); void ps_simulatorDirectoryEntered(); void ps_copyDefaults(); + void ps_adjustModelDirectory(); void ps_reset(); void ps_simulatorChanged(); diff --git a/src/blackgui/components/settingssimulatorbasicscomponent.ui b/src/blackgui/components/settingssimulatorbasicscomponent.ui index ac46912be..a9405b28b 100644 --- a/src/blackgui/components/settingssimulatorbasicscomponent.ui +++ b/src/blackgui/components/settingssimulatorbasicscomponent.ui @@ -20,7 +20,14 @@ QFrame::Raised - + + + + ... + + + + copy (materialize) defaults @@ -37,10 +44,10 @@ - - + + - ... + Simulator directory: @@ -51,35 +58,35 @@ - + reset - - - - Simulator directory: + + + + Simulator directory path - - - - save - - - - + ... - + + + + save + + + + Excluded directory patterns @@ -92,21 +99,24 @@ - - - - Simulator directory path + + + + Excluded from model loading + + + Exclude directory patterns: - + Model directories - + @@ -119,13 +129,10 @@ - - - - Excluded from model loading - + + - Exclude directory patterns: + adjust diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.cpp b/src/blackmisc/simulation/fscommon/fscommonutil.cpp index 88a2e1635..ac5fdf723 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.cpp +++ b/src/blackmisc/simulation/fscommon/fscommonutil.cpp @@ -90,7 +90,7 @@ namespace BlackMisc { const QString fsxPath = CFsCommonUtil::fsxDirFromRegistry(); if (fsxPath.isEmpty()) { return ""; } - return QDir(fsxPath).filePath("SimObjects"); + return CFsCommonUtil::fsxSimObjectsDirFromSimDir(fsxPath); } const QString &CFsCommonUtil::fsxSimObjectsDirFromRegistry() @@ -103,7 +103,7 @@ namespace BlackMisc { QString dir(CFsCommonUtil::fsxDir()); if (dir.isEmpty()) { return ""; } - return QDir(dir).filePath("SimObjects"); + return CFsCommonUtil::fsxSimObjectsDirFromSimDir(dir); } const QString &CFsCommonUtil::fsxSimObjectsDir() @@ -112,6 +112,12 @@ namespace BlackMisc return dir; } + QString CFsCommonUtil::fsxSimObjectsDirFromSimDir(const QString &simDir) + { + Q_ASSERT_X(!simDir.isEmpty(), Q_FUNC_INFO, "missing simulator directory"); + return CFileUtils::appendFilePaths(simDir, "SimObjects"); + } + const QStringList &CFsCommonUtil::fsxSimObjectsExcludeDirectoryPatterns() { static const QStringList exclude @@ -175,7 +181,7 @@ namespace BlackMisc { const QString p3dPath = CFsCommonUtil::p3dDirFromRegistry(); if (p3dPath.isEmpty()) { return ""; } - return QDir(p3dPath).filePath("SimObjects"); + return CFsCommonUtil::fsxSimObjectsDirFromSimDir(p3dPath); } const QString &CFsCommonUtil::p3dSimObjectsDirFromRegistry() @@ -188,7 +194,7 @@ namespace BlackMisc { QString dir(CFsCommonUtil::p3dDir()); if (dir.isEmpty()) { return ""; } - return QDir(dir).filePath("SimObjects"); + return CFsCommonUtil::fsxSimObjectsDirFromSimDir(dir); } const QString &CFsCommonUtil::p3dSimObjectsDir() @@ -266,21 +272,20 @@ namespace BlackMisc { QString fs9Path = CFsCommonUtil::fs9DirFromRegistry(); if (fs9Path.isEmpty()) { return ""; } - fs9Path = QDir(fs9Path).filePath("Aircraft"); - return fs9Path; + return CFsCommonUtil::fs9AircraftDirFromSimDir(fs9Path); } const QString &CFsCommonUtil::fs9AircraftDirFromRegistry() { - static const QString v(fs9AircraftDirFromRegistryImpl()); - return v; + static const QString dir(fs9AircraftDirFromRegistryImpl()); + return dir; } QString fs9AircraftDirImpl() { const QString dir(CFsCommonUtil::fs9Dir()); if (dir.isEmpty()) { return ""; } - return QDir(dir).filePath("Aircraft"); + return CFsCommonUtil::fs9AircraftDirFromSimDir(dir); } const QString &CFsCommonUtil::fs9AircraftDir() @@ -289,6 +294,12 @@ namespace BlackMisc return dir; } + QString CFsCommonUtil::fs9AircraftDirFromSimDir(const QString &simDir) + { + Q_ASSERT_X(!simDir.isEmpty(), Q_FUNC_INFO, "missing simulator directory"); + return CFileUtils::appendFilePaths(simDir, "Aircraft"); + } + const QStringList &CFsCommonUtil::fs9AircraftObjectsExcludeDirectoryPatterns() { static const QStringList exclude; diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.h b/src/blackmisc/simulation/fscommon/fscommonutil.h index bbb57199f..f37ca2517 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.h +++ b/src/blackmisc/simulation/fscommon/fscommonutil.h @@ -43,6 +43,9 @@ namespace BlackMisc //! FSX's simobject dir, resolved from multiple sources static const QString &fsxSimObjectsDir(); + //! FSX aircraft dir, relative to simulator directory + static QString fsxSimObjectsDirFromSimDir(const QString &simDir); + //! Exclude directories for simObjects static const QStringList &fsxSimObjectsExcludeDirectoryPatterns(); @@ -73,6 +76,9 @@ namespace BlackMisc //! FS9's aircraft directory static const QString &fs9AircraftDir(); + //! FS9 aircraft dir, relative to simulator directory + static QString fs9AircraftDirFromSimDir(const QString &simDir); + //! Exclude directories for aircraft objects static const QStringList &fs9AircraftObjectsExcludeDirectoryPatterns(); }; diff --git a/src/blackmisc/simulation/simulatorinfo.cpp b/src/blackmisc/simulation/simulatorinfo.cpp index 031f39491..2c665df73 100644 --- a/src/blackmisc/simulation/simulatorinfo.cpp +++ b/src/blackmisc/simulation/simulatorinfo.cpp @@ -111,6 +111,11 @@ namespace BlackMisc return isMicrosoftSimulator() || p3d(); } + bool CSimulatorInfo::isFsxFamily() const + { + return fsx() || p3d(); + } + int CSimulatorInfo::numberSimulators() const { int c = fs9() ? 1 : 0; diff --git a/src/blackmisc/simulation/simulatorinfo.h b/src/blackmisc/simulation/simulatorinfo.h index 59b08d0cb..5d4e8322b 100644 --- a/src/blackmisc/simulation/simulatorinfo.h +++ b/src/blackmisc/simulation/simulatorinfo.h @@ -114,6 +114,9 @@ namespace BlackMisc //! Microsoft Simulator or P3D? bool isMicrosoftOrPrepare3DSimulator() const; + //! FSX family, i.e. FSX or P3D? + bool isFsxFamily() const; + //! Number simulators selected int numberSimulators() const;