mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-07 02:35:33 +08:00
refs #676, allow 1..n model directories
* adjusted loaders * changed settings
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -102,9 +102,9 @@ namespace BlackMisc
|
||||
else { return {}; }
|
||||
}
|
||||
|
||||
QString CXPlaneUtil::xplaneModelDirectory()
|
||||
QStringList CXPlaneUtil::xplaneModelDirectories()
|
||||
{
|
||||
return xplaneRootDir();
|
||||
return QStringList({ xplaneRootDir() });
|
||||
}
|
||||
|
||||
QStringList CXPlaneUtil::xplaneModelExcludeDirectoryPatterns()
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user