refs #676, allow 1..n model directories

* adjusted loaders
* changed settings
This commit is contained in:
Klaus Basan
2016-06-18 00:27:15 +02:00
parent 8b39e6f9c3
commit 554d1add79
9 changed files with 87 additions and 66 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -102,9 +102,9 @@ namespace BlackMisc
else { return {}; }
}
QString CXPlaneUtil::xplaneModelDirectory()
QStringList CXPlaneUtil::xplaneModelDirectories()
{
return xplaneRootDir();
return QStringList({ xplaneRootDir() });
}
QStringList CXPlaneUtil::xplaneModelExcludeDirectoryPatterns()

View File

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