4 #include "misc/simulation/flightgear/aircraftmodelloaderflightgear.h"
6 #include <QDirIterator>
9 namespace swift::misc::simulation::flightgear
14 return !m_parserWorker || m_parserWorker->isFinished();
25 if (m_parserWorker) { m_parserWorker->waitForFinished(); }
36 CAircraftModelList CAircraftModelLoaderFlightgear::parseFlyableAirplanes(
const QString &rootDirectory,
37 const QStringList &excludeDirectories)
39 Q_UNUSED(excludeDirectories);
40 if (rootDirectory.isEmpty()) {
return {}; }
41 CAircraftModelList installedModels;
43 QDir searchPath(rootDirectory);
44 searchPath.setNameFilters(QStringList() <<
"*-set.xml");
45 QDirIterator aircraftIt(searchPath, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
47 while (aircraftIt.hasNext())
54 if (aircraftIt.filePath().contains(
"/AI/Aircraft")) {
continue; }
56 QString modelName = aircraftIt.fileName();
57 modelName = modelName.remove(
"-set.xml");
58 model.setName(modelName);
59 model.setModelString(getModelString(aircraftIt.fileName(),
false));
62 model.setFileDetailsAndTimestamp(aircraftIt.fileInfo());
63 model.setModelMode(CAircraftModel::Exclude);
64 addUniqueModel(model, installedModels);
67 return installedModels;
70 CAircraftModelList CAircraftModelLoaderFlightgear::parseAIAirplanes(
const QString &rootDirectory,
71 const QStringList &excludeDirectories)
73 Q_UNUSED(excludeDirectories);
74 if (rootDirectory.isEmpty()) {
return {}; }
76 CAircraftModelList installedModels;
78 QDir searchPath(rootDirectory);
79 searchPath.setNameFilters(QStringList() <<
"*.xml");
80 QDirIterator aircraftIt(searchPath, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
82 while (aircraftIt.hasNext())
90 QString modelName = aircraftIt.fileName();
91 modelName = modelName.remove(
".xml");
92 model.setName(modelName);
93 model.setModelString(getModelString(aircraftIt.filePath(),
true));
96 model.setFileDetailsAndTimestamp(aircraftIt.fileInfo());
97 model.setModelMode(CAircraftModel::Include);
98 addUniqueModel(model, installedModels);
101 return installedModels;
104 void CAircraftModelLoaderFlightgear::addUniqueModel(
const CAircraftModel &model, CAircraftModelList &models)
107 models.push_back(model);
110 CAircraftModelList CAircraftModelLoaderFlightgear::performParsing(
const QStringList &rootDirectories,
111 const QStringList &excludeDirectories)
113 CAircraftModelList allModels;
114 for (
const QString &rootDirectory : rootDirectories)
116 QString dir = rootDirectory;
117 dir.replace(
'\\',
'/');
118 if (dir.contains(
"/AI/Aircraft")) { allModels.push_back(parseAIAirplanes(dir, excludeDirectories)); }
119 else { allModels.push_back(parseFlyableAirplanes(dir, excludeDirectories)); }
127 const QStringList &modelDirectories)
131 const QStringList excludedDirectoryPatterns(
136 if (m_parserWorker && !m_parserWorker->isFinished()) {
return; }
139 m_parserWorker =
CWorker::fromTask(
this,
"CAircraftModelLoaderFlightgear::performParsing",
140 [
this, modelDirs, excludedDirectoryPatterns, modelConsolidation]() {
142 this->performParsing(modelDirs, excludedDirectoryPatterns);
143 if (modelConsolidation) { modelConsolidation(models,
true); }
155 CAircraftModelList models(this->performParsing(modelDirs, excludedDirectoryPatterns));
160 QString CAircraftModelLoaderFlightgear::getModelString(
const QString &fileName,
bool ai)
162 QString modelString =
"FG ";
166 modelString.append(
"AI ");
167 f = fileName.mid(fileName.indexOf(
"Aircraft") + 9);
173 f.remove(
"-set.xml");
176 modelString.append(f);
static bool isExcludedDirectory(const QDir &directory, const QStringList &excludeDirectories, Qt::CaseSensitivity cs=osFileNameCaseSensitivity())
Directory to be excluded?
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
Streamable status message, e.g.
constexpr static auto SeverityInfo
Status severities.
static CWorker * fromTask(QObject *owner, const QString &name, F &&task)
Returns a new worker object which lives in a new thread.
void freezeOrder()
Current order of list will be new order values.
@ TypeOwnSimulatorModel
represents own simulator model (AI model, model on disk)
Value object encapsulating a list of aircraft models.
Simple hardcoded info about the corresponding simulator.
static const CSimulatorInfo & fg()
Const simulator info objects.
Load the aircraft for a simulator.
std::function< int(swift::misc::simulation::CAircraftModelList &, bool)> ModelConsolidationCallback
Callback to consolidate data, normally with DB data.
QStringList getInitializedModelDirectories(const QStringList &modelDirectories, const CSimulatorInfo &simulator) const
Get model directories from settings if empty, otherwise checked and UNC path fixed.
void loadingFinished(const CStatusMessageList &status, const CSimulatorInfo &simulator, IAircraftModelLoader::LoadFinishedInfo info)
Parsing is finished or cache has been loaded.
void diskLoadingStarted(const CSimulatorInfo &simulator, IAircraftModelLoader::LoadMode loadMode)
Disk loading started.
settings::CMultiSimulatorSettings m_settings
settings
CStatusMessageList m_loadingMessages
loading messages
@ LoadInBackground
load in background, asyncronously
@ LoadDirectly
load synchronously (blocking), normally for testing
void setModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set models.
CAircraftModelLoaderFlightgear(QObject *parent=nullptr)
Constructor.
void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories)
Start the loading process from disk.
~CAircraftModelLoaderFlightgear()
Virtual destructor.
void updateInstalledModels(const CAircraftModelList &models)
Parsed or injected models.
bool isLoadingFinished() const
Loading finished?
QStringList getModelExcludeDirectoryPatternsOrDefault(const CSimulatorInfo &simulator) const
Model exclude patterns per simulator.