Ref T246, utility for 1st model set directory

* remove empty enries in directories
* allow to add directory
* detect same directories and avoid duplicates
This commit is contained in:
Klaus Basan
2018-07-14 19:45:21 +02:00
parent 6f9d686b4d
commit 80cee12fdb
8 changed files with 117 additions and 34 deletions

View File

@@ -479,6 +479,15 @@ namespace BlackMisc
return CDirectoryUtils::isDirExisting(dir.absolutePath()); 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<QString> CDirectoryUtils::fileNamesToQSet(const QFileInfoList &fileInfoList) QSet<QString> CDirectoryUtils::fileNamesToQSet(const QFileInfoList &fileInfoList)
{ {
QSet<QString> sl; QSet<QString> sl;

View File

@@ -158,6 +158,9 @@ namespace BlackMisc
static bool isDirExisting(const QDir &dir); static bool isDirExisting(const QDir &dir);
//! @} //! @}
//! Same existing directories
static bool isSameExistingDirectory(const QString &dir1, const QString &dir2);
//! Result of directory comparison //! Result of directory comparison
struct DirComparison struct DirComparison
{ {

View File

@@ -38,6 +38,7 @@ namespace BlackMisc
// first connect is an internal connection to log info about load status // first connect is an internal connection to log info about load status
connect(this, &IAircraftModelLoader::loadingFinished, this, &IAircraftModelLoader::onLoadingFinished); connect(this, &IAircraftModelLoader::loadingFinished, this, &IAircraftModelLoader::onLoadingFinished);
connect(&m_caches, &IMultiSimulatorModelCaches::cacheChanged, this, &IAircraftModelLoader::onCacheChanged); connect(&m_caches, &IMultiSimulatorModelCaches::cacheChanged, this, &IAircraftModelLoader::onCacheChanged);
connect(&m_settings, &CMultiSimulatorSettings::simulatorSettingsChanged, this, &IAircraftModelLoader::simulatorSettingsChanged);
} }
QString IAircraftModelLoader::enumToString(IAircraftModelLoader::LoadFinishedInfo info) QString IAircraftModelLoader::enumToString(IAircraftModelLoader::LoadFinishedInfo info)

View File

@@ -156,6 +156,9 @@ namespace BlackMisc
//! Access to multi simulator settings //! Access to multi simulator settings
const Settings::CMultiSimulatorSettings &multiSimulatorSettings() const { return m_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) //! \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()); } 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); } virtual void updateModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) override { this->replaceOrAddCachedModels(models, simulator); }
//! @} //! @}
//! Create a loader and synchronize caches
static std::unique_ptr<IAircraftModelLoader> createModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simulator);
public slots:
//! Set cache from outside, this should only be used in special cases. //! 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. //! 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 //! 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 //! Normally used to consoidate data with DB data and write them back
BlackMisc::CStatusMessage replaceOrAddCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo()); BlackMisc::CStatusMessage replaceOrAddCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo());
//! Create a loader and synchronize caches
static std::unique_ptr<IAircraftModelLoader> createModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simulator);
signals: signals:
//! Parsing is finished or cache has been loaded //! Parsing is finished or cache has been loaded
void loadingFinished(const CStatusMessageList &status, const CSimulatorInfo &simulator, LoadFinishedInfo info); void loadingFinished(const CStatusMessageList &status, const CSimulatorInfo &simulator, LoadFinishedInfo info);
//! Corresponding Settings::CMultiSimulatorSettings::simulatorSettingsChange
void simulatorSettingsChanged(const CSimulatorInfo &simulator);
protected: protected:
//! Constructor //! Constructor
IAircraftModelLoader(const CSimulatorInfo &simulator); IAircraftModelLoader(const CSimulatorInfo &simulator);
@@ -207,12 +212,12 @@ namespace BlackMisc
//! Get model directories from settings if empty, otherwise checked and UNC path fixed //! Get model directories from settings if empty, otherwise checked and UNC path fixed
QStringList getInitializedModelDirectories(const QStringList &modelDirectories, const CSimulatorInfo &simulator) const; QStringList getInitializedModelDirectories(const QStringList &modelDirectories, const CSimulatorInfo &simulator) const;
std::atomic<bool> m_cancelLoading { false }; //!< flag, requesting to cancel loading std::atomic<bool> m_cancelLoading { false }; //!< flag, requesting to cancel loading
std::atomic<bool> m_loadingInProgress { false }; //!< Loading in progress std::atomic<bool> m_loadingInProgress { false }; //!< loading in progress
std::atomic<bool> m_skipLoadingEmptyModelDir { true }; //!< Loading empty model dirs might erase the cache, so normally we skip it std::atomic<bool> 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 CStatusMessageList m_loadingMessages; //!< loading messages
Settings::CMultiSimulatorSettings m_settings { this }; //!< settings Data::CModelCaches m_caches { false, this }; //!< caches used with this loader
CStatusMessageList m_loadingMessages; //!< loading messages Settings::CMultiSimulatorSettings m_settings { this }; //!< settings
}; };
} // ns } // ns
} // ns } // ns

View File

@@ -12,9 +12,10 @@
#include "blackmisc/simulation/fscommon/fscommonutil.h" #include "blackmisc/simulation/fscommon/fscommonutil.h"
#include "blackmisc/simulation/xplane/xplaneutil.h" #include "blackmisc/simulation/xplane/xplaneutil.h"
#include "blackmisc/stringutils.h" #include "blackmisc/stringutils.h"
#include "blackconfig/buildconfig.h"
#include <QStringBuilder> #include <QStringBuilder>
using namespace BlackMisc; using namespace BlackConfig;
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::FsCommon;
using namespace BlackMisc::Simulation::XPlane; using namespace BlackMisc::Simulation::XPlane;
@@ -41,6 +42,8 @@ namespace BlackMisc
void CSimulatorSettings::setModelDirectories(const QStringList &modelDirectories) void CSimulatorSettings::setModelDirectories(const QStringList &modelDirectories)
{ {
m_modelDirectories = modelDirectories; m_modelDirectories = modelDirectories;
m_modelDirectories.removeAll({});
m_modelDirectories.removeDuplicates();
} }
void CSimulatorSettings::setModelDirectory(const QString &modelDirectory) void CSimulatorSettings::setModelDirectory(const QString &modelDirectory)
@@ -48,6 +51,16 @@ namespace BlackMisc
m_modelDirectories = QStringList({ modelDirectory }); 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 const QStringList &CSimulatorSettings::getModelDirectories() const
{ {
return m_modelDirectories; return m_modelDirectories;
@@ -56,6 +69,8 @@ namespace BlackMisc
void CSimulatorSettings::setModelExcludeDirectories(const QStringList &excludeDirectories) void CSimulatorSettings::setModelExcludeDirectories(const QStringList &excludeDirectories)
{ {
m_excludeDirectoryPatterns = excludeDirectories; m_excludeDirectoryPatterns = excludeDirectories;
m_excludeDirectoryPatterns.removeAll({});
m_excludeDirectoryPatterns.removeDuplicates();
} }
const QStringList &CSimulatorSettings::getModelExcludeDirectoryPatterns() const const QStringList &CSimulatorSettings::getModelExcludeDirectoryPatterns() const
@@ -153,6 +168,16 @@ namespace BlackMisc
return CStatusMessage({ CLogCategory::settings() }, CStatusMessage::SeverityError, "wrong simulator"); 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) CStatusMessage CMultiSimulatorSettings::setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator)
{ {
Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator");
@@ -249,6 +274,26 @@ namespace BlackMisc
return CSpecializedSimulatorSettings::defaultSimulatorDirectory(simulator); 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) void CSimulatorMessagesSettings::setTechnicalLogSeverity(CStatusMessage::StatusSeverity severity)
{ {
m_technicalLogLevel = static_cast<int>(severity); m_technicalLogLevel = static_cast<int>(severity);
@@ -422,29 +467,33 @@ namespace BlackMisc
CSpecializedSimulatorSettings::defaultSimulatorDirectory(m_simulator); CSpecializedSimulatorSettings::defaultSimulatorDirectory(m_simulator);
} }
const QStringList CSpecializedSimulatorSettings::getModelDirectoriesOrDefault() const QStringList CSpecializedSimulatorSettings::getModelDirectoriesOrDefault() const
{ {
return m_genericSettings.hasModelDirectories() ? return m_genericSettings.hasModelDirectories() ?
m_genericSettings.getModelDirectories() : m_genericSettings.getModelDirectories() :
this->getModelDirectoriesFromSimulatorDirectoryOrDefault(); this->getModelDirectoriesFromSimulatorDirectoryOrDefault();
} }
const QStringList CSpecializedSimulatorSettings::getModelDirectoriesFromSimulatorDirectoy() const QStringList CSpecializedSimulatorSettings::getModelDirectoriesFromSimulatorDirectoy() const
{ {
if (!m_genericSettings.hasSimulatorDirectory()) { return QStringList(); } if (!m_genericSettings.hasSimulatorDirectory()) { return QStringList(); }
const QString s(m_genericSettings.getSimulatorDirectory()); const QString s(m_genericSettings.getSimulatorDirectory());
QStringList dirs;
switch (m_simulator.getSimulator()) switch (m_simulator.getSimulator())
{ {
case CSimulatorInfo::FS9: return QStringList({CFsCommonUtil::fs9AircraftDirFromSimDir(s)}); case CSimulatorInfo::FS9: dirs = QStringList({CFsCommonUtil::fs9AircraftDirFromSimDir(s)}); break;
case CSimulatorInfo::FSX: return QStringList({CFsCommonUtil::fsxSimObjectsDirFromSimDir(s)}); case CSimulatorInfo::FSX: dirs = QStringList({CFsCommonUtil::fsxSimObjectsDirFromSimDir(s)}); break;
case CSimulatorInfo::P3D: return QStringList({CFsCommonUtil::p3dSimObjectsDirFromSimDir(s)}); case CSimulatorInfo::P3D: dirs = QStringList({CFsCommonUtil::p3dSimObjectsDirFromSimDir(s)}); break;
case CSimulatorInfo::XPLANE: return QStringList({CXPlaneUtil::modelDirectoriesFromSimDir(s)}); case CSimulatorInfo::XPLANE: dirs = QStringList({CXPlaneUtil::modelDirectoriesFromSimDir(s)}); break;
default: 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); } if (!m_genericSettings.hasSimulatorDirectory()) { return CSpecializedSimulatorSettings::defaultModelDirectories(m_simulator); }
return this->getModelDirectoriesFromSimulatorDirectoy(); return this->getModelDirectoriesFromSimulatorDirectoy();
@@ -466,7 +515,7 @@ namespace BlackMisc
return CSpecializedSimulatorSettings::defaultModelExcludeDirectoryPatterns(m_simulator); return CSpecializedSimulatorSettings::defaultModelExcludeDirectoryPatterns(m_simulator);
} }
const QString CSpecializedSimulatorSettings::getFirstModelDirectoryOrDefault() const QString CSpecializedSimulatorSettings::getFirstModelDirectoryOrDefault() const
{ {
static const QString empty; static const QString empty;
if (this->getModelDirectoriesOrDefault().isEmpty()) { return empty; } if (this->getModelDirectoriesOrDefault().isEmpty()) { return empty; }

View File

@@ -64,6 +64,9 @@ namespace BlackMisc
//! Set single model directory //! Set single model directory
void setModelDirectory(const QString &modelDirectory); void setModelDirectory(const QString &modelDirectory);
//! Add (if not exists) model directory
bool addModelDirectory(const QString &modelDirectory);
//! Model directory //! Model directory
const QStringList &getModelDirectories() const; const QStringList &getModelDirectories() const;
@@ -133,13 +136,13 @@ namespace BlackMisc
const QString &getSimulatorDirectoryOrDefault() const; const QString &getSimulatorDirectoryOrDefault() const;
//! Model directories or default //! Model directories or default
const QStringList getModelDirectoriesOrDefault() const; QStringList getModelDirectoriesOrDefault() const;
//! Model directories //! Model directories
const QStringList getModelDirectoriesFromSimulatorDirectoy() const; QStringList getModelDirectoriesFromSimulatorDirectoy() const;
//! Model directories, then from simulator directory, then default //! Model directories, then from simulator directory, then default
const QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const; QStringList getModelDirectoriesFromSimulatorDirectoryOrDefault() const;
//! Model directories or empty if default //! Model directories or empty if default
const QStringList &getModelDirectoriesIfNotDefault() const; const QStringList &getModelDirectoriesIfNotDefault() const;
@@ -148,7 +151,7 @@ namespace BlackMisc
const QStringList &getDefaultModelExcludeDirectoryPatterns() const; const QStringList &getDefaultModelExcludeDirectoryPatterns() const;
//! First model directoy //! First model directoy
const QString getFirstModelDirectoryOrDefault() const; QString getFirstModelDirectoryOrDefault() const;
//! Model exclude patterns or empty if default //! Model exclude patterns or empty if default
const QStringList &getDefaultModelDirectories() const; const QStringList &getDefaultModelDirectories() const;
@@ -247,6 +250,9 @@ namespace BlackMisc
//! Set settings per simulator //! Set settings per simulator
CStatusMessage setSettings(const CSimulatorSettings &settings, const CSimulatorInfo &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 //! Set settings per simulator
CStatusMessage setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator); CStatusMessage setAndSaveSettings(const CSimulatorSettings &settings, const CSimulatorInfo &simulator);
@@ -288,11 +294,20 @@ namespace BlackMisc
//! \deprecated use CSpecializedSimulatorSettings::defaultSimulatorDirectory //! \deprecated use CSpecializedSimulatorSettings::defaultSimulatorDirectory
static const QString &defaultSimulatorDirectory(const CSimulatorInfo &simulator); static const QString &defaultSimulatorDirectory(const CSimulatorInfo &simulator);
signals:
//! Simulator settings have been changed
void simulatorSettingsChanged(const BlackMisc::Simulation::CSimulatorInfo &simulator);
private: private:
CSetting<Settings::TSimulatorFsx> m_simSettingsFsx {this}; //!< FSX settings CSetting<Settings::TSimulatorFsx> m_simSettingsFsx { this, &CMultiSimulatorSettings::onFsxSettingsChanged }; //!< FSX settings
CSetting<Settings::TSimulatorFs9> m_simSettingsFs9 {this}; //!< FS9 settings CSetting<Settings::TSimulatorFs9> m_simSettingsFs9 { this, &CMultiSimulatorSettings::onFs9SettingsChanged }; //!< FS9 settings
CSetting<Settings::TSimulatorP3D> m_simSettingsP3D {this}; //!< P3D settings CSetting<Settings::TSimulatorP3D> m_simSettingsP3D { this, &CMultiSimulatorSettings::onP3DSettingsChanged }; //!< P3D settings
CSetting<Settings::TSimulatorXP> m_simSettingsXP {this}; //!< XP settings CSetting<Settings::TSimulatorXP> m_simSettingsXP { this, &CMultiSimulatorSettings::onXPSettingsChanged }; //!< XP settings
void onFsxSettingsChanged();
void onFs9SettingsChanged();
void onP3DSettingsChanged();
void onXPSettingsChanged();
}; };
//! Settings regarding message handling. //! Settings regarding message handling.

View File

@@ -133,6 +133,7 @@ namespace BlackMisc
QStringList CXPlaneUtil::modelDirectoriesFromSimDir(const QString &simulatorDir) QStringList CXPlaneUtil::modelDirectoriesFromSimDir(const QString &simulatorDir)
{ {
if (simulatorDir.isEmpty()) { return QStringList(); }
return QStringList({ simulatorDir }); return QStringList({ simulatorDir });
} }

View File

@@ -162,11 +162,11 @@ namespace BlackSimPlugin
auto callback = std::bind(&CSimulatorXPlane::callbackReceivedRequestedElevation, this, _1, _2); auto callback = std::bind(&CSimulatorXPlane::callbackReceivedRequestedElevation, this, _1, _2);
// Request // Request
m_trafficProxy->getEelevationAtPosition(callsign, m_trafficProxy->getElevationAtPosition(callsign,
pos.latitude().value(CAngleUnit::deg()), pos.latitude().value(CAngleUnit::deg()),
pos.longitude().value(CAngleUnit::deg()), pos.longitude().value(CAngleUnit::deg()),
pos.geodeticHeight().value(CLengthUnit::m()), pos.geodeticHeight().value(CLengthUnit::m()),
callback); callback);
emit this->requestedElevation(callsign); emit this->requestedElevation(callsign);
return true; return true;
} }
@@ -827,7 +827,7 @@ namespace BlackSimPlugin
if (callsigns.isEmpty()) { return; } if (callsigns.isEmpty()) { return; }
if (this->isShuttingDown()) { return; } if (this->isShuttingDown()) { return; }
const QStringList csStrings = callsigns.getCallsignStrings(); 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); updateRemoteAircraftFromSimulator(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
}); });