mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-31 12:55:33 +08:00
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -133,6 +133,7 @@ namespace BlackMisc
|
||||
|
||||
QStringList CXPlaneUtil::modelDirectoriesFromSimDir(const QString &simulatorDir)
|
||||
{
|
||||
if (simulatorDir.isEmpty()) { return QStringList(); }
|
||||
return QStringList({ simulatorDir });
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user