From 80cee12fdb0dbc88ed0d3ed98a02903bf404620a Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 14 Jul 2018 19:45:21 +0200 Subject: [PATCH] Ref T246, utility for 1st model set directory * remove empty enries in directories * allow to add directory * detect same directories and avoid duplicates --- src/blackmisc/directoryutils.cpp | 9 +++ src/blackmisc/directoryutils.h | 3 + .../simulation/aircraftmodelloader.cpp | 1 + .../simulation/aircraftmodelloader.h | 25 ++++--- .../simulation/settings/simulatorsettings.cpp | 69 ++++++++++++++++--- .../simulation/settings/simulatorsettings.h | 31 ++++++--- .../simulation/xplane/xplaneutil.cpp | 1 + .../simulator/xplane/simulatorxplane.cpp | 12 ++-- 8 files changed, 117 insertions(+), 34 deletions(-) diff --git a/src/blackmisc/directoryutils.cpp b/src/blackmisc/directoryutils.cpp index b371b3fce..4b37a8132 100644 --- a/src/blackmisc/directoryutils.cpp +++ b/src/blackmisc/directoryutils.cpp @@ -479,6 +479,15 @@ namespace BlackMisc return CDirectoryUtils::isDirExisting(dir.absolutePath()); } + bool CDirectoryUtils::isSameExistingDirectory(const QString &dir1, const QString &dir2) + { + if (dir1.isEmpty() || dir2.isEmpty()) { return false; } + const QDir d1(dir1); + const QDir d2(dir2); + if (!d1.exists() || !d2.exists()) { return false; } + return d1.absolutePath() == d2.absolutePath(); + } + QSet CDirectoryUtils::fileNamesToQSet(const QFileInfoList &fileInfoList) { QSet sl; diff --git a/src/blackmisc/directoryutils.h b/src/blackmisc/directoryutils.h index fb3e4ed3a..57cc5016e 100644 --- a/src/blackmisc/directoryutils.h +++ b/src/blackmisc/directoryutils.h @@ -158,6 +158,9 @@ namespace BlackMisc static bool isDirExisting(const QDir &dir); //! @} + //! Same existing directories + static bool isSameExistingDirectory(const QString &dir1, const QString &dir2); + //! Result of directory comparison struct DirComparison { diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index 69fa846f6..b5c693e21 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -38,6 +38,7 @@ namespace BlackMisc // first connect is an internal connection to log info about load status connect(this, &IAircraftModelLoader::loadingFinished, this, &IAircraftModelLoader::onLoadingFinished); connect(&m_caches, &IMultiSimulatorModelCaches::cacheChanged, this, &IAircraftModelLoader::onCacheChanged); + connect(&m_settings, &CMultiSimulatorSettings::simulatorSettingsChanged, this, &IAircraftModelLoader::simulatorSettingsChanged); } QString IAircraftModelLoader::enumToString(IAircraftModelLoader::LoadFinishedInfo info) diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index 62de21d09..15b6d6182 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -156,6 +156,9 @@ namespace BlackMisc //! Access to multi simulator settings const Settings::CMultiSimulatorSettings &multiSimulatorSettings() const { return m_settings; } + //! Access to multi simulator settings + Settings::CMultiSimulatorSettings &multiSimulatorSettings() { return m_settings; } + //! \name Implementations of the model interfaces (allows to set models modified in utility functions) //! @{ virtual void setModels(const CAircraftModelList &models) override { this->setCachedModels(models, this->getSimulator()); } @@ -164,10 +167,6 @@ namespace BlackMisc virtual void updateModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) override { this->replaceOrAddCachedModels(models, simulator); } //! @} - //! Create a loader and synchronize caches - static std::unique_ptr createModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simulator); - - public slots: //! Set cache from outside, this should only be used in special cases. //! But it allows to modify data elsewhere and update the cache with manipulated data. //! Normally used to consoidate data with DB data and write them back @@ -178,10 +177,16 @@ namespace BlackMisc //! Normally used to consoidate data with DB data and write them back BlackMisc::CStatusMessage replaceOrAddCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo()); + //! Create a loader and synchronize caches + static std::unique_ptr createModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simulator); + signals: //! Parsing is finished or cache has been loaded void loadingFinished(const CStatusMessageList &status, const CSimulatorInfo &simulator, LoadFinishedInfo info); + //! Corresponding Settings::CMultiSimulatorSettings::simulatorSettingsChange + void simulatorSettingsChanged(const CSimulatorInfo &simulator); + protected: //! Constructor IAircraftModelLoader(const CSimulatorInfo &simulator); @@ -207,12 +212,12 @@ namespace BlackMisc //! Get model directories from settings if empty, otherwise checked and UNC path fixed QStringList getInitializedModelDirectories(const QStringList &modelDirectories, const CSimulatorInfo &simulator) const; - std::atomic m_cancelLoading { false }; //!< flag, requesting to cancel loading - std::atomic m_loadingInProgress { false }; //!< Loading in progress - std::atomic m_skipLoadingEmptyModelDir { true }; //!< Loading empty model dirs might erase the cache, so normally we skip it - Data::CModelCaches m_caches { false, this }; //!< caches used with this loader - Settings::CMultiSimulatorSettings m_settings { this }; //!< settings - CStatusMessageList m_loadingMessages; //!< loading messages + std::atomic m_cancelLoading { false }; //!< flag, requesting to cancel loading + std::atomic m_loadingInProgress { false }; //!< loading in progress + std::atomic m_skipLoadingEmptyModelDir { true }; //!< loading empty model dirs might erase the cache, so normally we skip it + CStatusMessageList m_loadingMessages; //!< loading messages + Data::CModelCaches m_caches { false, this }; //!< caches used with this loader + Settings::CMultiSimulatorSettings m_settings { this }; //!< settings }; } // ns } // ns diff --git a/src/blackmisc/simulation/settings/simulatorsettings.cpp b/src/blackmisc/simulation/settings/simulatorsettings.cpp index 3217862b2..568650ef7 100644 --- a/src/blackmisc/simulation/settings/simulatorsettings.cpp +++ b/src/blackmisc/simulation/settings/simulatorsettings.cpp @@ -12,9 +12,10 @@ #include "blackmisc/simulation/fscommon/fscommonutil.h" #include "blackmisc/simulation/xplane/xplaneutil.h" #include "blackmisc/stringutils.h" +#include "blackconfig/buildconfig.h" #include -using namespace BlackMisc; +using namespace BlackConfig; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::XPlane; @@ -41,6 +42,8 @@ namespace BlackMisc void CSimulatorSettings::setModelDirectories(const QStringList &modelDirectories) { m_modelDirectories = modelDirectories; + m_modelDirectories.removeAll({}); + m_modelDirectories.removeDuplicates(); } void CSimulatorSettings::setModelDirectory(const QString &modelDirectory) @@ -48,6 +51,16 @@ namespace BlackMisc m_modelDirectories = QStringList({ modelDirectory }); } + bool CSimulatorSettings::addModelDirectory(const QString &modelDirectory) + { + const Qt::CaseSensitivity cs = CBuildConfig::isRunningOnWindowsNtPlatform() ? Qt::CaseInsensitive : Qt::CaseSensitive; + if (m_modelDirectories.contains(modelDirectory, cs)) { return false; } + m_modelDirectories.push_back(modelDirectory); + m_modelDirectories.removeAll({}); + m_modelDirectories.removeDuplicates(); + return true; + } + const QStringList &CSimulatorSettings::getModelDirectories() const { return m_modelDirectories; @@ -56,6 +69,8 @@ namespace BlackMisc void CSimulatorSettings::setModelExcludeDirectories(const QStringList &excludeDirectories) { m_excludeDirectoryPatterns = excludeDirectories; + m_excludeDirectoryPatterns.removeAll({}); + m_excludeDirectoryPatterns.removeDuplicates(); } const QStringList &CSimulatorSettings::getModelExcludeDirectoryPatterns() const @@ -153,6 +168,16 @@ namespace BlackMisc return CStatusMessage({ CLogCategory::settings() }, CStatusMessage::SeverityError, "wrong simulator"); } + CStatusMessage CMultiSimulatorSettings::addModelDirectory(const QString &modelDirectory, const CSimulatorInfo &simulator) + { + CSimulatorSettings s = this->getSettings(simulator); + if (!s.addModelDirectory(modelDirectory)) + { + return CStatusMessage({ CLogCategory::settings() }, CStatusMessage::SeverityInfo, "directory already existing"); + } + return this->setSettings(s, simulator); + } + CStatusMessage CMultiSimulatorSettings::setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator) { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); @@ -249,6 +274,26 @@ namespace BlackMisc return CSpecializedSimulatorSettings::defaultSimulatorDirectory(simulator); } + void CMultiSimulatorSettings::onFsxSettingsChanged() + { + emit this->simulatorSettingsChanged(CSimulatorInfo::fsx()); + } + + void CMultiSimulatorSettings::onP3DSettingsChanged() + { + emit this->simulatorSettingsChanged(CSimulatorInfo::p3d()); + } + + void CMultiSimulatorSettings::onFs9SettingsChanged() + { + emit this->simulatorSettingsChanged(CSimulatorInfo::fs9()); + } + + void CMultiSimulatorSettings::onXPSettingsChanged() + { + emit this->simulatorSettingsChanged(CSimulatorInfo::xplane()); + } + void CSimulatorMessagesSettings::setTechnicalLogSeverity(CStatusMessage::StatusSeverity severity) { m_technicalLogLevel = static_cast(severity); @@ -422,29 +467,33 @@ namespace BlackMisc CSpecializedSimulatorSettings::defaultSimulatorDirectory(m_simulator); } - const QStringList CSpecializedSimulatorSettings::getModelDirectoriesOrDefault() const + QStringList CSpecializedSimulatorSettings::getModelDirectoriesOrDefault() const { return m_genericSettings.hasModelDirectories() ? m_genericSettings.getModelDirectories() : this->getModelDirectoriesFromSimulatorDirectoryOrDefault(); } - const QStringList CSpecializedSimulatorSettings::getModelDirectoriesFromSimulatorDirectoy() const + QStringList CSpecializedSimulatorSettings::getModelDirectoriesFromSimulatorDirectoy() const { if (!m_genericSettings.hasSimulatorDirectory()) { return QStringList(); } const QString s(m_genericSettings.getSimulatorDirectory()); + QStringList dirs; switch (m_simulator.getSimulator()) { - case CSimulatorInfo::FS9: return QStringList({CFsCommonUtil::fs9AircraftDirFromSimDir(s)}); - case CSimulatorInfo::FSX: return QStringList({CFsCommonUtil::fsxSimObjectsDirFromSimDir(s)}); - case CSimulatorInfo::P3D: return QStringList({CFsCommonUtil::p3dSimObjectsDirFromSimDir(s)}); - case CSimulatorInfo::XPLANE: return QStringList({CXPlaneUtil::modelDirectoriesFromSimDir(s)}); + case CSimulatorInfo::FS9: dirs = QStringList({CFsCommonUtil::fs9AircraftDirFromSimDir(s)}); break; + case CSimulatorInfo::FSX: dirs = QStringList({CFsCommonUtil::fsxSimObjectsDirFromSimDir(s)}); break; + case CSimulatorInfo::P3D: dirs = QStringList({CFsCommonUtil::p3dSimObjectsDirFromSimDir(s)}); break; + case CSimulatorInfo::XPLANE: dirs = QStringList({CXPlaneUtil::modelDirectoriesFromSimDir(s)}); break; default: break; } - return QStringList(); + + dirs.removeAll({}); // remove empty + dirs.removeDuplicates(); + return dirs; } - const QStringList CSpecializedSimulatorSettings::getModelDirectoriesFromSimulatorDirectoryOrDefault() const + QStringList CSpecializedSimulatorSettings::getModelDirectoriesFromSimulatorDirectoryOrDefault() const { if (!m_genericSettings.hasSimulatorDirectory()) { return CSpecializedSimulatorSettings::defaultModelDirectories(m_simulator); } return this->getModelDirectoriesFromSimulatorDirectoy(); @@ -466,7 +515,7 @@ namespace BlackMisc return CSpecializedSimulatorSettings::defaultModelExcludeDirectoryPatterns(m_simulator); } - const QString CSpecializedSimulatorSettings::getFirstModelDirectoryOrDefault() const + QString CSpecializedSimulatorSettings::getFirstModelDirectoryOrDefault() const { static const QString empty; if (this->getModelDirectoriesOrDefault().isEmpty()) { return empty; } diff --git a/src/blackmisc/simulation/settings/simulatorsettings.h b/src/blackmisc/simulation/settings/simulatorsettings.h index 09068e0ac..0eba3de97 100644 --- a/src/blackmisc/simulation/settings/simulatorsettings.h +++ b/src/blackmisc/simulation/settings/simulatorsettings.h @@ -64,6 +64,9 @@ namespace BlackMisc //! Set single model directory void setModelDirectory(const QString &modelDirectory); + //! Add (if not exists) model directory + bool addModelDirectory(const QString &modelDirectory); + //! Model directory const QStringList &getModelDirectories() const; @@ -133,13 +136,13 @@ namespace BlackMisc const QString &getSimulatorDirectoryOrDefault() const; //! Model directories or default - const QStringList getModelDirectoriesOrDefault() const; + QStringList getModelDirectoriesOrDefault() const; //! Model directories - const QStringList getModelDirectoriesFromSimulatorDirectoy() const; + QStringList getModelDirectoriesFromSimulatorDirectoy() const; //! Model directories, then from simulator directory, then default - const QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const; + QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const; //! Model directories or empty if default const QStringList &getModelDirectoriesIfNotDefault() const; @@ -148,7 +151,7 @@ namespace BlackMisc const QStringList &getDefaultModelExcludeDirectoryPatterns() const; //! First model directoy - const QString getFirstModelDirectoryOrDefault() const; + QString getFirstModelDirectoryOrDefault() const; //! Model exclude patterns or empty if default const QStringList &getDefaultModelDirectories() const; @@ -247,6 +250,9 @@ namespace BlackMisc //! Set settings per simulator CStatusMessage setSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator); + //! Set model directory per simulator + CStatusMessage addModelDirectory(const QString &modelDirectory, const CSimulatorInfo &simulator); + //! Set settings per simulator CStatusMessage setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator); @@ -288,11 +294,20 @@ namespace BlackMisc //! \deprecated use CSpecializedSimulatorSettings::defaultSimulatorDirectory static const QString &defaultSimulatorDirectory(const CSimulatorInfo &simulator); + signals: + //! Simulator settings have been changed + void simulatorSettingsChanged(const BlackMisc::Simulation::CSimulatorInfo &simulator); + private: - CSetting m_simSettingsFsx {this}; //!< FSX settings - CSetting m_simSettingsFs9 {this}; //!< FS9 settings - CSetting m_simSettingsP3D {this}; //!< P3D settings - CSetting m_simSettingsXP {this}; //!< XP settings + CSetting m_simSettingsFsx { this, &CMultiSimulatorSettings::onFsxSettingsChanged }; //!< FSX settings + CSetting m_simSettingsFs9 { this, &CMultiSimulatorSettings::onFs9SettingsChanged }; //!< FS9 settings + CSetting m_simSettingsP3D { this, &CMultiSimulatorSettings::onP3DSettingsChanged }; //!< P3D settings + CSetting m_simSettingsXP { this, &CMultiSimulatorSettings::onXPSettingsChanged }; //!< XP settings + + void onFsxSettingsChanged(); + void onFs9SettingsChanged(); + void onP3DSettingsChanged(); + void onXPSettingsChanged(); }; //! Settings regarding message handling. diff --git a/src/blackmisc/simulation/xplane/xplaneutil.cpp b/src/blackmisc/simulation/xplane/xplaneutil.cpp index 47deb2c91..10781ec34 100644 --- a/src/blackmisc/simulation/xplane/xplaneutil.cpp +++ b/src/blackmisc/simulation/xplane/xplaneutil.cpp @@ -133,6 +133,7 @@ namespace BlackMisc QStringList CXPlaneUtil::modelDirectoriesFromSimDir(const QString &simulatorDir) { + if (simulatorDir.isEmpty()) { return QStringList(); } return QStringList({ simulatorDir }); } diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 56b2aba72..1f939d427 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -162,11 +162,11 @@ namespace BlackSimPlugin auto callback = std::bind(&CSimulatorXPlane::callbackReceivedRequestedElevation, this, _1, _2); // Request - m_trafficProxy->getEelevationAtPosition(callsign, - pos.latitude().value(CAngleUnit::deg()), - pos.longitude().value(CAngleUnit::deg()), - pos.geodeticHeight().value(CLengthUnit::m()), - callback); + m_trafficProxy->getElevationAtPosition(callsign, + pos.latitude().value(CAngleUnit::deg()), + pos.longitude().value(CAngleUnit::deg()), + pos.geodeticHeight().value(CLengthUnit::m()), + callback); emit this->requestedElevation(callsign); return true; } @@ -827,7 +827,7 @@ namespace BlackSimPlugin if (callsigns.isEmpty()) { return; } if (this->isShuttingDown()) { return; } const QStringList csStrings = callsigns.getCallsignStrings(); - m_trafficProxy->getRemoteAircraftsData(csStrings, [ = ](const QStringList & callsigns, const QDoubleList & latitudesDeg, const QDoubleList & longitudesDeg, const QDoubleList & elevationsM, const QDoubleList & verticalOffsets) + m_trafficProxy->getRemoteAircraftData(csStrings, [ = ](const QStringList & callsigns, const QDoubleList & latitudesDeg, const QDoubleList & longitudesDeg, const QDoubleList & elevationsM, const QDoubleList & verticalOffsets) { updateRemoteAircraftFromSimulator(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets); });