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());
}
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> sl;

View File

@@ -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
{

View File

@@ -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)

View File

@@ -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<IAircraftModelLoader> 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<IAircraftModelLoader> 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<bool> m_cancelLoading { false }; //!< flag, requesting to cancel loading
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
Data::CModelCaches m_caches { false, this }; //!< caches used with this loader
Settings::CMultiSimulatorSettings m_settings { this }; //!< settings
CStatusMessageList m_loadingMessages; //!< loading messages
std::atomic<bool> m_cancelLoading { false }; //!< flag, requesting to cancel loading
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
CStatusMessageList m_loadingMessages; //!< loading messages
Data::CModelCaches m_caches { false, this }; //!< caches used with this loader
Settings::CMultiSimulatorSettings m_settings { this }; //!< settings
};
} // ns
} // ns

View File

@@ -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 <QStringBuilder>
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<int>(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; }

View File

@@ -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<Settings::TSimulatorFsx> m_simSettingsFsx {this}; //!< FSX settings
CSetting<Settings::TSimulatorFs9> m_simSettingsFs9 {this}; //!< FS9 settings
CSetting<Settings::TSimulatorP3D> m_simSettingsP3D {this}; //!< P3D settings
CSetting<Settings::TSimulatorXP> m_simSettingsXP {this}; //!< XP settings
CSetting<Settings::TSimulatorFsx> m_simSettingsFsx { this, &CMultiSimulatorSettings::onFsxSettingsChanged }; //!< FSX settings
CSetting<Settings::TSimulatorFs9> m_simSettingsFs9 { this, &CMultiSimulatorSettings::onFs9SettingsChanged }; //!< FS9 settings
CSetting<Settings::TSimulatorP3D> m_simSettingsP3D { this, &CMultiSimulatorSettings::onP3DSettingsChanged }; //!< P3D settings
CSetting<Settings::TSimulatorXP> m_simSettingsXP { this, &CMultiSimulatorSettings::onXPSettingsChanged }; //!< XP settings
void onFsxSettingsChanged();
void onFs9SettingsChanged();
void onP3DSettingsChanged();
void onXPSettingsChanged();
};
//! Settings regarding message handling.

View File

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

View File

@@ -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);
});