mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-13 15:45:42 +08:00
Ref T118, support multiple model directories
* this was recently discussed https://swift-project.slack.com/archives/C04J6J76N/p1508430536000065 * for config parser already implemented * for XP the loading from multiple dirs still needs to be implemented (see todo)
This commit is contained in:
@@ -324,7 +324,7 @@ namespace BlackGui
|
|||||||
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
||||||
if (!dir.isEmpty())
|
if (!dir.isEmpty())
|
||||||
{
|
{
|
||||||
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, dir);
|
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, QStringList(dir));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -350,7 +350,7 @@ namespace BlackGui
|
|||||||
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
||||||
if (!dir.isEmpty())
|
if (!dir.isEmpty())
|
||||||
{
|
{
|
||||||
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, dir);
|
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, QStringList(dir));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -376,7 +376,7 @@ namespace BlackGui
|
|||||||
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
||||||
if (!dir.isEmpty())
|
if (!dir.isEmpty())
|
||||||
{
|
{
|
||||||
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, dir);
|
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, QStringList(dir));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -401,7 +401,7 @@ namespace BlackGui
|
|||||||
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
const QString dir = CDbOwnModelsComponent::directorySelector(sim);
|
||||||
if (!dir.isEmpty())
|
if (!dir.isEmpty())
|
||||||
{
|
{
|
||||||
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, dir);
|
ownModelsComp->ps_requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, QStringList(dir));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -427,7 +427,7 @@ namespace BlackGui
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDbOwnModelsComponent::ps_loadInstalledModels(const CSimulatorInfo &simulator, IAircraftModelLoader::LoadMode mode, const QString &directory)
|
void CDbOwnModelsComponent::ps_loadInstalledModels(const CSimulatorInfo &simulator, IAircraftModelLoader::LoadMode mode, const QStringList &modelDirectories)
|
||||||
{
|
{
|
||||||
if (!this->initModelLoader(simulator))
|
if (!this->initModelLoader(simulator))
|
||||||
{
|
{
|
||||||
@@ -444,7 +444,7 @@ namespace BlackGui
|
|||||||
CLogMessage(this).info("Starting loading for '%1'") << simulator.toQString();
|
CLogMessage(this).info("Starting loading for '%1'") << simulator.toQString();
|
||||||
ui->tvp_OwnAircraftModels->showLoadIndicator();
|
ui->tvp_OwnAircraftModels->showLoadIndicator();
|
||||||
Q_ASSERT_X(sGui && sGui->getWebDataServices(), Q_FUNC_INFO, "missing web data services");
|
Q_ASSERT_X(sGui && sGui->getWebDataServices(), Q_FUNC_INFO, "missing web data services");
|
||||||
m_modelLoader->startLoading(mode, static_cast<int (*)(CAircraftModelList &, bool)>(&CDatabaseUtils::consolidateModelsWithDbData), directory);
|
m_modelLoader->startLoading(mode, static_cast<int (*)(CAircraftModelList &, bool)>(&CDatabaseUtils::consolidateModelsWithDbData), modelDirectories);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDbOwnModelsComponent::ps_onOwnModelsLoadingFinished(const CStatusMessage &status, const CSimulatorInfo &simulator, IAircraftModelLoader::LoadFinishedInfo info)
|
void CDbOwnModelsComponent::ps_onOwnModelsLoadingFinished(const CStatusMessage &status, const CSimulatorInfo &simulator, IAircraftModelLoader::LoadFinishedInfo info)
|
||||||
@@ -475,9 +475,9 @@ namespace BlackGui
|
|||||||
ui->comp_SimulatorSelector->setValue(simulator);
|
ui->comp_SimulatorSelector->setValue(simulator);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDbOwnModelsComponent::ps_requestSimulatorModels(const CSimulatorInfo &simulator, IAircraftModelLoader::LoadMode mode, const QString &directory)
|
void CDbOwnModelsComponent::ps_requestSimulatorModels(const CSimulatorInfo &simulator, IAircraftModelLoader::LoadMode mode, const QStringList &modelDirectories)
|
||||||
{
|
{
|
||||||
this->ps_loadInstalledModels(simulator, mode, directory);
|
this->ps_loadInstalledModels(simulator, mode, modelDirectories);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDbOwnModelsComponent::ps_requestSimulatorModelsWithCacheInBackground(const CSimulatorInfo &simulator)
|
void CDbOwnModelsComponent::ps_requestSimulatorModelsWithCacheInBackground(const CSimulatorInfo &simulator)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QScopedPointer>
|
#include <QScopedPointer>
|
||||||
#include <QString>
|
#include <QStringList>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
class QAction;
|
class QAction;
|
||||||
@@ -121,13 +121,13 @@ namespace BlackGui
|
|||||||
void ps_requestOwnModelsUpdate();
|
void ps_requestOwnModelsUpdate();
|
||||||
|
|
||||||
//! Load the models
|
//! Load the models
|
||||||
void ps_loadInstalledModels(const BlackMisc::Simulation::CSimulatorInfo &simulator, BlackMisc::Simulation::IAircraftModelLoader::LoadMode mode, const QString &directory = "");
|
void ps_loadInstalledModels(const BlackMisc::Simulation::CSimulatorInfo &simulator, BlackMisc::Simulation::IAircraftModelLoader::LoadMode mode, const QStringList &modelDirectories = {});
|
||||||
|
|
||||||
//! Model loading finished
|
//! Model loading finished
|
||||||
void ps_onOwnModelsLoadingFinished(const BlackMisc::CStatusMessage &status, const BlackMisc::Simulation::CSimulatorInfo &simulator, BlackMisc::Simulation::IAircraftModelLoader::LoadFinishedInfo info);
|
void ps_onOwnModelsLoadingFinished(const BlackMisc::CStatusMessage &status, const BlackMisc::Simulation::CSimulatorInfo &simulator, BlackMisc::Simulation::IAircraftModelLoader::LoadFinishedInfo info);
|
||||||
|
|
||||||
//! Request simulator models
|
//! Request simulator models
|
||||||
void ps_requestSimulatorModels(const BlackMisc::Simulation::CSimulatorInfo &simulator, BlackMisc::Simulation::IAircraftModelLoader::LoadMode mode, const QString &directory = "");
|
void ps_requestSimulatorModels(const BlackMisc::Simulation::CSimulatorInfo &simulator, BlackMisc::Simulation::IAircraftModelLoader::LoadMode mode, const QStringList &modelDirectories = {});
|
||||||
|
|
||||||
//! Request simulator models from cache
|
//! Request simulator models from cache
|
||||||
void ps_requestSimulatorModelsWithCacheInBackground(const BlackMisc::Simulation::CSimulatorInfo &simulator);
|
void ps_requestSimulatorModelsWithCacheInBackground(const BlackMisc::Simulation::CSimulatorInfo &simulator);
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ namespace BlackMisc
|
|||||||
return this->setCachedModels(CAircraftModelList());
|
return this->setCachedModels(CAircraftModelList());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IAircraftModelLoader::startLoading(LoadMode mode, const ModelConsolidation &modelConsolidation, const QString &directory)
|
void IAircraftModelLoader::startLoading(LoadMode mode, const ModelConsolidation &modelConsolidation, const QStringList &modelDirectories)
|
||||||
{
|
{
|
||||||
if (m_loadingInProgress) { return; }
|
if (m_loadingInProgress) { return; }
|
||||||
m_loadingInProgress = true;
|
m_loadingInProgress = true;
|
||||||
@@ -206,16 +206,18 @@ namespace BlackMisc
|
|||||||
}
|
}
|
||||||
|
|
||||||
// really load from disk?
|
// really load from disk?
|
||||||
if (m_skipLoadingEmptyModelDir && !CDirectoryUtils::existsUnemptyDirectory(directory))
|
const CSimulatorInfo simulator = this->getSimulator();
|
||||||
|
const QStringList modelDirs = this->getInitializedModelDirectories(modelDirectories, simulator);
|
||||||
|
if (m_skipLoadingEmptyModelDir && modelDirs.isEmpty())
|
||||||
{
|
{
|
||||||
const CStatusMessage status = CStatusMessage(this, CStatusMessage::SeverityWarning, "Empty or not existing %1 directory '%2', skipping read")
|
const CStatusMessage status = CStatusMessage(this, CStatusMessage::SeverityWarning, "Empty or not existing %1 directory '%2', skipping read")
|
||||||
<< this->getSimulator().toQString() << directory;
|
<< simulator.toQString() << modelDirectories.join(", ");
|
||||||
m_loadingMessages.push_back(status);
|
m_loadingMessages.push_back(status);
|
||||||
emit loadingFinished(status, this->getSimulator(), LoadingSkipped);
|
emit loadingFinished(status, simulator, LoadingSkipped);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->startLoadingFromDisk(mode, modelConsolidation, directory);
|
this->startLoadingFromDisk(mode, modelConsolidation, modelDirs);
|
||||||
}
|
}
|
||||||
|
|
||||||
const CSimulatorInfo IAircraftModelLoader::getSimulator() const
|
const CSimulatorInfo IAircraftModelLoader::getSimulator() const
|
||||||
|
|||||||
@@ -63,26 +63,24 @@ namespace BlackMisc
|
|||||||
if (m_parserWorker) { m_parserWorker->waitForFinished(); }
|
if (m_parserWorker) { m_parserWorker->waitForFinished(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftCfgParser::startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QString &directory)
|
void CAircraftCfgParser::startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QStringList &modelDirectories)
|
||||||
{
|
{
|
||||||
static const CStatusMessage statusLoadingOk(this, CStatusMessage::SeverityInfo, "Aircraft config parser loaded data");
|
static const CStatusMessage statusLoadingOk(this, CStatusMessage::SeverityInfo, "Aircraft config parser loaded data");
|
||||||
static const CStatusMessage statusLoadingError(this, CStatusMessage::SeverityError, "Aircraft config parser did not load data");
|
static const CStatusMessage statusLoadingError(this, CStatusMessage::SeverityError, "Aircraft config parser did not load data");
|
||||||
|
|
||||||
const CSimulatorInfo simulator = this->getSimulator();
|
const CSimulatorInfo simulator = this->getSimulator();
|
||||||
const QString modelDirectory = CFileUtils::fixWindowsUncPath(
|
const QStringList modelDirs = this->getInitializedModelDirectories(modelDirectories, simulator);
|
||||||
directory.isEmpty() ? m_settings.getFirstModelDirectoryOrDefault(simulator) : directory
|
|
||||||
); // expect only one directory
|
|
||||||
const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy
|
const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy
|
||||||
|
|
||||||
if (mode.testFlag(LoadInBackground))
|
if (mode.testFlag(LoadInBackground))
|
||||||
{
|
{
|
||||||
if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
|
if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
|
||||||
m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftCfgParser::changeDirectory",
|
m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftCfgParser::changeDirectory",
|
||||||
[this, modelDirectory, excludedDirectoryPatterns, simulator, modelConsolidation]()
|
[this, modelDirs, excludedDirectoryPatterns, simulator, modelConsolidation]()
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
CStatusMessageList msgs;
|
CStatusMessageList msgs;
|
||||||
const auto aircraftCfgEntriesList = this->performParsing(modelDirectory, excludedDirectoryPatterns, msgs, &ok);
|
const auto aircraftCfgEntriesList = this->performParsing(modelDirs, excludedDirectoryPatterns, msgs, &ok);
|
||||||
CAircraftModelList models;
|
CAircraftModelList models;
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
@@ -119,13 +117,13 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
bool ok;
|
bool ok;
|
||||||
CStatusMessageList msgs;
|
CStatusMessageList msgs;
|
||||||
m_parsedCfgEntriesList = performParsing(modelDirectory, excludedDirectoryPatterns, msgs, &ok);
|
m_parsedCfgEntriesList = performParsing(modelDirs, excludedDirectoryPatterns, msgs, &ok);
|
||||||
CAircraftModelList models(m_parsedCfgEntriesList.toAircraftModelList(simulator, true, msgs));
|
const CAircraftModelList models(m_parsedCfgEntriesList.toAircraftModelList(simulator, true, msgs));
|
||||||
m_loadingMessages = msgs;
|
m_loadingMessages = msgs;
|
||||||
const bool hasData = !models.isEmpty();
|
const bool hasData = !models.isEmpty();
|
||||||
if (hasData)
|
if (hasData)
|
||||||
{
|
{
|
||||||
this->setCachedModels(models); // not thread safe
|
this->setCachedModels(models);
|
||||||
}
|
}
|
||||||
// currently I treat no data as error
|
// currently I treat no data as error
|
||||||
emit this->loadingFinished(hasData ? statusLoadingOk : statusLoadingError, simulator, ParsedData);
|
emit this->loadingFinished(hasData ? statusLoadingOk : statusLoadingError, simulator, ParsedData);
|
||||||
@@ -137,6 +135,20 @@ namespace BlackMisc
|
|||||||
return !m_parserWorker || m_parserWorker->isFinished();
|
return !m_parserWorker || m_parserWorker->isFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAircraftCfgEntriesList CAircraftCfgParser::performParsing(const QStringList &directories, const QStringList &excludeDirectories, CStatusMessageList &messages, bool *ok)
|
||||||
|
{
|
||||||
|
CAircraftCfgEntriesList entries;
|
||||||
|
bool dirOk = false;
|
||||||
|
bool success = true;
|
||||||
|
for (const QString &dir : directories)
|
||||||
|
{
|
||||||
|
entries.push_back(performParsing(dir, excludeDirectories, messages, &dirOk));
|
||||||
|
success &= dirOk;
|
||||||
|
}
|
||||||
|
*ok = success;
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
CAircraftCfgEntriesList CAircraftCfgParser::performParsing(const QString &directory, const QStringList &excludeDirectories, CStatusMessageList &messages, bool *ok)
|
CAircraftCfgEntriesList CAircraftCfgParser::performParsing(const QString &directory, const QStringList &excludeDirectories, CStatusMessageList &messages, bool *ok)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ namespace BlackMisc
|
|||||||
protected:
|
protected:
|
||||||
//! \name Interface functions
|
//! \name Interface functions
|
||||||
//! @{
|
//! @{
|
||||||
virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QString &directory) override;
|
virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QStringList &modelDirectories) override;
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -72,7 +72,13 @@ namespace BlackMisc
|
|||||||
Unknown
|
Unknown
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Perform the parsing
|
//! Perform the parsing for all directories
|
||||||
|
//! \threadsafe
|
||||||
|
CAircraftCfgEntriesList performParsing(
|
||||||
|
const QStringList &directories, const QStringList &excludeDirectories,
|
||||||
|
BlackMisc::CStatusMessageList &messages, bool *ok);
|
||||||
|
|
||||||
|
//! Perform the parsing for one directory
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
CAircraftCfgEntriesList performParsing(
|
CAircraftCfgEntriesList performParsing(
|
||||||
const QString &directory, const QStringList &excludeDirectories,
|
const QString &directory, const QStringList &excludeDirectories,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "blackmisc/aviation/airlineicaocode.h"
|
#include "blackmisc/aviation/airlineicaocode.h"
|
||||||
#include "blackmisc/aviation/livery.h"
|
#include "blackmisc/aviation/livery.h"
|
||||||
#include "blackmisc/fileutils.h"
|
#include "blackmisc/fileutils.h"
|
||||||
|
#include "blackmisc/directoryutils.h"
|
||||||
#include "blackmisc/logmessage.h"
|
#include "blackmisc/logmessage.h"
|
||||||
#include "blackmisc/simulation/aircraftmodel.h"
|
#include "blackmisc/simulation/aircraftmodel.h"
|
||||||
#include "blackmisc/simulation/aircraftmodelutils.h"
|
#include "blackmisc/simulation/aircraftmodelutils.h"
|
||||||
@@ -122,17 +123,16 @@ namespace BlackMisc
|
|||||||
if (m_parserWorker) { m_parserWorker->waitForFinished(); }
|
if (m_parserWorker) { m_parserWorker->waitForFinished(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QString &directory)
|
void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QStringList &modelDirectories)
|
||||||
{
|
{
|
||||||
//! \todo KB/MS 2017-09 not high prio, but still needed: according to meeting XP needs to support multiple directories
|
|
||||||
const CSimulatorInfo simulator = this->getSimulator();
|
const CSimulatorInfo simulator = this->getSimulator();
|
||||||
const QString modelDirectory(!directory.isEmpty() ? directory : this->getFirstModelDirectoryOrDefault()); // directory
|
const QStringList modelDirs = this->getInitializedModelDirectories(modelDirectories, simulator);
|
||||||
const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy
|
const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy
|
||||||
|
|
||||||
if (modelDirectory.isEmpty())
|
if (modelDirs.isEmpty())
|
||||||
{
|
{
|
||||||
this->clearCache();
|
this->clearCache();
|
||||||
emit loadingFinished(CStatusMessage(this, CStatusMessage::SeverityError, "Model directory '%1' is empty") << modelDirectory, simulator, ParsedData);
|
emit loadingFinished(CStatusMessage(this, CStatusMessage::SeverityError, "Model directories '%1' are empty") << modelDirectories.join(", "), simulator, ParsedData);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,8 +140,11 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
|
if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
|
||||||
m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftModelLoaderXPlane::performParsing",
|
m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftModelLoaderXPlane::performParsing",
|
||||||
[this, modelDirectory, excludedDirectoryPatterns, modelConsolidation]()
|
[this, modelDirs, excludedDirectoryPatterns, modelConsolidation]()
|
||||||
{
|
{
|
||||||
|
//! \todo KB/MS 2017-09 not high prio, but still needed: according to meeting XP needs to support multiple directories
|
||||||
|
//! \todo KB with T118 now model directories are passed (changed signatures) but the code below needs to support multiple dirs
|
||||||
|
const QString modelDirectory = modelDirs.front();
|
||||||
auto models = performParsing(modelDirectory, excludedDirectoryPatterns);
|
auto models = performParsing(modelDirectory, excludedDirectoryPatterns);
|
||||||
if (modelConsolidation) { modelConsolidation(models, true); }
|
if (modelConsolidation) { modelConsolidation(models, true); }
|
||||||
return models;
|
return models;
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ namespace BlackMisc
|
|||||||
protected:
|
protected:
|
||||||
//! \name Interface functions
|
//! \name Interface functions
|
||||||
//! @{
|
//! @{
|
||||||
virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QString &directory) override;
|
virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QStringList &modelDirectories) override;
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user