diff --git a/samples/blackmiscsim/samplesfscommon.cpp b/samples/blackmiscsim/samplesfscommon.cpp index e7212a6c3..73d608ec4 100644 --- a/samples/blackmiscsim/samplesfscommon.cpp +++ b/samples/blackmiscsim/samplesfscommon.cpp @@ -55,7 +55,7 @@ namespace BlackSample streamOut << "reading directly" << endl; QTime time; time.start(); - streamOut << "reading " << parser.getModelDirectory() << endl; + streamOut << "reading " << parser.getFirstModelDirectoryOrDefault() << endl; parser.startLoading(); streamOut << "read entries: " << parser.getAircraftCfgEntriesList().size() << " in " << time.restart() << "ms" << endl; diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index 9f43ec375..6a4e7b09f 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -77,14 +77,21 @@ namespace BlackMisc this->m_loadingInProgress = false; } - QString IAircraftModelLoader::getModelDirectory() const + QStringList IAircraftModelLoader::getModelDirectoriesOrDefault() const { - return this->m_settings.getModelDirectoryOrDefault(this->getSimulator()); + const QStringList mdirs = this->m_settings.getModelDirectoriesOrDefault(this->getSimulator()); + return mdirs; } - QStringList IAircraftModelLoader::getModelExcludeDirectories(bool relative) const + QString IAircraftModelLoader::getFirstModelDirectoryOrDefault() const { - return this->m_settings.getModelExcludeDirectoryPatternsOrDefault(this->getSimulator(), relative); + const QString md = this->m_settings.getFirstModelDirectoryOrDefault(this->getSimulator()); + return md; + } + + QStringList IAircraftModelLoader::getModelExcludeDirectoryPatterns() const + { + return this->m_settings.getModelExcludeDirectoryPatternsOrDefault(this->getSimulator()); } CAircraftModelList IAircraftModelLoader::getAircraftModels() const diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index 784be2975..87496c63f 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -94,11 +94,14 @@ namespace BlackMisc //! Is the given simulator supported? bool supportsSimulator(const BlackMisc::Simulation::CSimulatorInfo &info); - //! Current root directory - QString getModelDirectory() const; + //! Model directories + QStringList getModelDirectoriesOrDefault() const; + + //! First directory, can be used when only 1 directory is expected + QString getFirstModelDirectoryOrDefault() const; //! Exclude directories - QStringList getModelExcludeDirectories(bool relative) const; + QStringList getModelExcludeDirectoryPatterns() const; //! Cancel read void cancelLoading(); diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp index 6a418ae1d..f980e5b20 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp @@ -65,17 +65,17 @@ namespace BlackMisc void CAircraftCfgParser::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) { const CSimulatorInfo simulator = this->getSimulator(); - const QString modelDirectory(this->m_settings.getModelDirectoryOrDefault(simulator)); // copy - const QStringList excludedDirectories(this->m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator, true)); // copy + const QString modelDirectory(this->m_settings.getFirstModelDirectoryOrDefault(simulator)); // expect only one directory + const QStringList excludedDirectoryPatterns(this->m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy if (mode.testFlag(LoadInBackground)) { if (m_parserWorker && !m_parserWorker->isFinished()) { return; } m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftCfgParser::changeDirectory", - [this, modelDirectory, excludedDirectories, simulator, dbModels]() + [this, modelDirectory, excludedDirectoryPatterns, simulator, dbModels]() { bool ok = false; - const auto aircraftCfgEntriesList = this->performParsing(modelDirectory, excludedDirectories, &ok); + const auto aircraftCfgEntriesList = this->performParsing(modelDirectory, excludedDirectoryPatterns, &ok); CAircraftModelList models; if (ok) { @@ -108,7 +108,7 @@ namespace BlackMisc else if (mode == LoadDirectly) { bool ok; - this->m_parsedCfgEntriesList = performParsing(modelDirectory, excludedDirectories, &ok); + this->m_parsedCfgEntriesList = performParsing(modelDirectory, excludedDirectoryPatterns, &ok); CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(simulator)); CAircraftModelUtilities::mergeWithDbData(models, dbModels); const bool hasData = !models.isEmpty(); @@ -137,9 +137,11 @@ namespace BlackMisc bool CAircraftCfgParser::areModelFilesUpdated() const { const QDateTime cacheTs(getCacheTimestamp()); - if (!cacheTs.isValid()) { return true; } - return CFileUtils::containsFileNewerThan(cacheTs, this->getModelDirectory(), true, { fileFilter() }, this->getModelExcludeDirectories(true)); + return CFileUtils::containsFileNewerThan( + cacheTs, + this->m_settings.getFirstModelDirectoryOrDefault(this->getSimulator()), + true, { fileFilter() }, this->getModelExcludeDirectoryPatterns()); } CAircraftCfgEntriesList CAircraftCfgParser::performParsing(const QString &directory, const QStringList &excludeDirectories, bool *ok) diff --git a/src/blackmisc/simulation/settings/settingssimulator.cpp b/src/blackmisc/simulation/settings/settingssimulator.cpp index 805c7dea6..47f6cc118 100644 --- a/src/blackmisc/simulation/settings/settingssimulator.cpp +++ b/src/blackmisc/simulation/settings/settingssimulator.cpp @@ -36,14 +36,19 @@ namespace BlackMisc return this->m_simulatorDirectory; } - void CSettingsSimulator::setModelDirectory(const QString &modelDirectory) + void CSettingsSimulator::setModelDirectories(const QStringList &modelDirectories) { - this->m_modelDirectory = modelDirectory.trimmed(); + this->m_modelDirectories = modelDirectories; } - const QString &CSettingsSimulator::getModelDirectory() const + void CSettingsSimulator::setModelDirectory(const QString &modelDirectory) { - return this->m_modelDirectory; + this->m_modelDirectories = QStringList({ modelDirectory }); + } + + const QStringList &CSettingsSimulator::getModelDirectories() const + { + return this->m_modelDirectories; } void CSettingsSimulator::setModelExcludeDirectories(const QStringList &excludeDirectories) @@ -56,16 +61,10 @@ namespace BlackMisc return m_excludeDirectoryPatterns; } - QStringList CSettingsSimulator::getRelativeModelExcludeDirectoryPatterns(const QString &modelDirectory) const - { - const QStringList excludes(this->getModelExcludeDirectoryPatterns()); - return CFileUtils::makeDirectoriesRelative(excludes, modelDirectory); - } - void CSettingsSimulator::resetPaths() { this->m_excludeDirectoryPatterns.clear(); - this->m_modelDirectory.clear(); + this->m_modelDirectories.clear(); this->m_simulatorDirectory.clear(); } @@ -77,8 +76,8 @@ namespace BlackMisc QString CSettingsSimulator::convertToQString(const QString &separator, bool i18n) const { Q_UNUSED(i18n); - QString s("model directory: "); - s.append(this->m_modelDirectory); + QString s("model directories: "); + s.append(this->m_modelDirectories.join(',')); s.append(separator); s.append("exclude directories: "); s.append(this->m_excludeDirectoryPatterns.join(',')); @@ -94,7 +93,7 @@ namespace BlackMisc case IndexSimulatorDirectory: return CVariant::fromValue(this->m_simulatorDirectory); case IndexModelDirectory: - return CVariant::fromValue(this->m_modelDirectory); + return CVariant::fromValue(this->m_modelDirectories); case IndexModelExcludeDirectoryPatterns: return CVariant::fromValue(this->m_excludeDirectoryPatterns); default: @@ -219,41 +218,47 @@ namespace BlackMisc return ""; } - QString CMultiSimulatorSimulatorSettings::getModelDirectoryOrDefault(const CSimulatorInfo &simulator) const + QStringList CMultiSimulatorSimulatorSettings::getModelDirectoriesOrDefault(const CSimulatorInfo &simulator) const { const CSettingsSimulator s = this->getSettings(simulator); - if (s.getModelDirectory().isEmpty()) + if (s.getModelDirectories().isEmpty()) { - return this->getDefaultModelDirectory(simulator); + return this->getDefaultModelDirectories(simulator); } - return s.getModelDirectory(); + return s.getModelDirectories(); } - QString CMultiSimulatorSimulatorSettings::getDefaultModelDirectory(const CSimulatorInfo &simulator) const + QString CMultiSimulatorSimulatorSettings::getFirstModelDirectoryOrDefault(const CSimulatorInfo &simulator) const { + const QStringList models(getModelDirectoriesOrDefault(simulator)); + if (models.isEmpty()) { return ""; } + return models.first(); + } + + QStringList CMultiSimulatorSimulatorSettings::getDefaultModelDirectories(const CSimulatorInfo &simulator) const + { + static const QStringList e; Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); switch (simulator.getSimulator()) { - case CSimulatorInfo::FS9: return CFsCommonUtil::fs9AircraftDir(); - case CSimulatorInfo::FSX: return CFsCommonUtil::fsxSimObjectsDir(); - case CSimulatorInfo::P3D: return CFsCommonUtil::p3dSimObjectsDir(); - case CSimulatorInfo::XPLANE: return CXPlaneUtil::xplaneModelDirectory(); + case CSimulatorInfo::FS9: return CFsCommonUtil::fs9AircraftDir().isEmpty() ? e : QStringList({ CFsCommonUtil::fs9AircraftDir() }); + case CSimulatorInfo::FSX: return CFsCommonUtil::fsxSimObjectsDir().isEmpty() ? e : QStringList({ CFsCommonUtil::fsxSimObjectsDir() }); + case CSimulatorInfo::P3D: return CFsCommonUtil::p3dSimObjectsDir().isEmpty() ? e : QStringList({ CFsCommonUtil::p3dSimObjectsDir()}); + case CSimulatorInfo::XPLANE: return CXPlaneUtil::xplaneModelDirectories(); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; } - return ""; + return QStringList(); } - QStringList CMultiSimulatorSimulatorSettings::getModelExcludeDirectoryPatternsOrDefault(const CSimulatorInfo &simulator, bool relative) const + QStringList CMultiSimulatorSimulatorSettings::getModelExcludeDirectoryPatternsOrDefault(const CSimulatorInfo &simulator) const { const CSettingsSimulator s = this->getSettings(simulator); - const QString md = getModelDirectoryOrDefault(simulator); - QStringList exclude = relative ? s.getRelativeModelExcludeDirectoryPatterns(md) : s.getModelExcludeDirectoryPatterns(); + QStringList exclude(s.getModelExcludeDirectoryPatterns()); if (!exclude.isEmpty()) { return exclude; } exclude = this->getDefaultModelExcludeDirectoryPatterns(simulator); - if (!relative || exclude.isEmpty()) { return exclude; } - return CFileUtils::makeDirectoriesRelative(exclude, md); + return exclude; } QStringList CMultiSimulatorSimulatorSettings::getDefaultModelExcludeDirectoryPatterns(const CSimulatorInfo &simulator) const diff --git a/src/blackmisc/simulation/settings/settingssimulator.h b/src/blackmisc/simulation/settings/settingssimulator.h index 1301a9445..8e8b1c724 100644 --- a/src/blackmisc/simulation/settings/settingssimulator.h +++ b/src/blackmisc/simulation/settings/settingssimulator.h @@ -52,11 +52,14 @@ namespace BlackMisc //! Simulator directory const QString &getSimulatorDirectory() const; - //! Set model directory + //! Set model directories + void setModelDirectories(const QStringList &modelDirectories); + + //! Set single model directory void setModelDirectory(const QString &modelDirectory); //! Model directory - const QString &getModelDirectory() const; + const QStringList &getModelDirectories() const; //! Set exclude directories void setModelExcludeDirectories(const QStringList &excludeDirectories); @@ -64,9 +67,6 @@ namespace BlackMisc //! Margins for given dock widget const QStringList &getModelExcludeDirectoryPatterns() const; - //! Relative exclude directory patterns - QStringList getRelativeModelExcludeDirectoryPatterns(const QString &modelDirectory) const; - //! Reset the paths void resetPaths(); @@ -84,13 +84,13 @@ namespace BlackMisc private: QString m_simulatorDirectory; //! Simulator directory - QString m_modelDirectory; //!< Model directory + QStringList m_modelDirectories; //!< Model directory QStringList m_excludeDirectoryPatterns; //!< Exclude model directory BLACK_METACLASS( CSettingsSimulator, BLACK_METAMEMBER(simulatorDirectory), - BLACK_METAMEMBER(modelDirectory), + BLACK_METAMEMBER(modelDirectories), BLACK_METAMEMBER(excludeDirectoryPatterns) ); }; @@ -151,13 +151,16 @@ namespace BlackMisc QString getDefaultSimulatorDirectory(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! Model directory or default model path per simulator - QString getModelDirectoryOrDefault(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + QStringList getModelDirectoriesOrDefault(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + + //! First model directoy + QString getFirstModelDirectoryOrDefault(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! Default model path per simulator - QString getDefaultModelDirectory(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + QStringList getDefaultModelDirectories(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! Model exclude paths per simulator - QStringList getModelExcludeDirectoryPatternsOrDefault(const BlackMisc::Simulation::CSimulatorInfo &simulator, bool relative) const; + QStringList getModelExcludeDirectoryPatternsOrDefault(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! Default model exclude paths per simulator QStringList getDefaultModelExcludeDirectoryPatterns(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp index e03c250d8..2a21076ce 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp @@ -70,9 +70,10 @@ namespace BlackMisc void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) { + //! \todo according to meeting XP needs to support multiple directories const CSimulatorInfo simulator = this->getSimulator(); - const QString modelDirectory(this->m_settings.getModelDirectoryOrDefault(simulator)); // copy - const QStringList excludedDirectories(this->m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator, true)); // copy + const QString modelDirectory(this->getFirstModelDirectoryOrDefault()); // directory + const QStringList excludedDirectoryPatterns(this->m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy if (modelDirectory.isEmpty()) { @@ -85,9 +86,9 @@ namespace BlackMisc { if (m_parserWorker && !m_parserWorker->isFinished()) { return; } m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftModelLoaderXPlane::performParsing", - [this, modelDirectory, excludedDirectories, dbModels]() + [this, modelDirectory, excludedDirectoryPatterns, dbModels]() { - auto models = performParsing(modelDirectory, excludedDirectories); + auto models = performParsing(modelDirectory, excludedDirectoryPatterns); CAircraftModelUtilities::mergeWithDbData(models, dbModels); return models; }); @@ -98,7 +99,7 @@ namespace BlackMisc } else if (mode.testFlag(LoadDirectly)) { - CAircraftModelList models(performParsing(this->getModelDirectory(), excludedDirectories)); + CAircraftModelList models(performParsing(this->getFirstModelDirectoryOrDefault(), excludedDirectoryPatterns)); CAircraftModelUtilities::mergeWithDbData(models, dbModels); updateInstalledModels(models); } @@ -113,10 +114,11 @@ namespace BlackMisc { const QDateTime cacheTs(getCacheTimestamp()); if (!cacheTs.isValid()) { return true; } - return CFileUtils::containsFileNewerThan(cacheTs, this->getModelDirectory(), true, {fileFilterCsl(), fileFilterFlyable()}, this->getModelExcludeDirectories(false)); + return CFileUtils::containsFileNewerThan( + cacheTs, this->getFirstModelDirectoryOrDefault(), + true, {fileFilterCsl(), fileFilterFlyable()}, this->getModelExcludeDirectoryPatterns()); } - void CAircraftModelLoaderXPlane::updateInstalledModels(const CAircraftModelList &models) { this->setCachedModels(models); diff --git a/src/blackmisc/simulation/xplane/xplaneutil.cpp b/src/blackmisc/simulation/xplane/xplaneutil.cpp index 1d6fa6fd9..872449b55 100644 --- a/src/blackmisc/simulation/xplane/xplaneutil.cpp +++ b/src/blackmisc/simulation/xplane/xplaneutil.cpp @@ -102,9 +102,9 @@ namespace BlackMisc else { return {}; } } - QString CXPlaneUtil::xplaneModelDirectory() + QStringList CXPlaneUtil::xplaneModelDirectories() { - return xplaneRootDir(); + return QStringList({ xplaneRootDir() }); } QStringList CXPlaneUtil::xplaneModelExcludeDirectoryPatterns() diff --git a/src/blackmisc/simulation/xplane/xplaneutil.h b/src/blackmisc/simulation/xplane/xplaneutil.h index 522f715af..cff4066a4 100644 --- a/src/blackmisc/simulation/xplane/xplaneutil.h +++ b/src/blackmisc/simulation/xplane/xplaneutil.h @@ -41,9 +41,8 @@ namespace BlackMisc //! In case more then one XPlane version is found, the path to the highest version is used static QString xplaneRootDir(); - //! Directory with models - //! \todo needs review - static QString xplaneModelDirectory(); + //! Directories with models + static QStringList xplaneModelDirectories(); //! Exclude directories for models static QStringList xplaneModelExcludeDirectoryPatterns();