17 using namespace swift::misc::simulation::data;
18 using namespace swift::misc::simulation::settings;
20 namespace swift::misc::simulation
30 static const QString loaded(
"cache loaded");
31 static const QString skipped(
"loading skipped");
32 static const QString parsed(
"parsed data");
33 static const QString failed(
"failed");
37 case CacheLoaded:
return loaded;
38 case ParsedData:
return parsed;
39 case LoadingSkipped:
return skipped;
40 case LoadingFailed:
return failed;
44 static const QString unknown(
"??");
50 static const QString notSet(
"not set");
51 static const QString directly(
"load directly");
52 static const QString background(
"load in background");
53 static const QString cacheFirst(
"cache first");
54 static const QString cacheSkipped(
"cache skipped");
55 static const QString cacheOnly(
"cacheOnly");
59 case NotSet:
return notSet;
60 case LoadDirectly:
return directly;
61 case LoadInBackground:
return background;
62 case CacheFirst:
return cacheFirst;
63 case CacheSkipped:
return cacheSkipped;
64 case CacheOnly:
return cacheOnly;
68 static const QString unknown(
"??");
75 if (mode.testFlag(NotSet)) { modes << enumToString(NotSet); }
76 if (mode.testFlag(LoadDirectly)) { modes << enumToString(LoadDirectly); }
77 if (mode.testFlag(LoadInBackground)) { modes << enumToString(LoadInBackground); }
78 if (mode.testFlag(CacheFirst)) { modes << enumToString(CacheFirst); }
79 if (mode.testFlag(CacheSkipped)) { modes << enumToString(CacheSkipped); }
80 return modes.join(
", ");
85 return mode.testFlag(CacheFirst) || mode.testFlag(CacheOnly);
89 : QObject(parent), m_simulator(simulator)
91 Q_ASSERT_X(simulator.
isSingleSimulator(), Q_FUNC_INFO,
"Only one simulator per loader");
93 Qt::QueuedConnection);
96 &CCentralMultiSimulatorModelCachesProvider::modelCachesInstance();
97 connect(centralCaches, &CCentralMultiSimulatorModelCachesProvider::cacheChanged,
this,
98 &IAircraftModelLoader::onCacheChanged, Qt::QueuedConnection);
99 this->setObjectInfo(simulator);
106 const QStringList &modelDirectories)
109 if (mode == NotSet) {
return; }
139 u
"Empty or not existing '%1' directory '%2', skipping read")
140 << simulator.
toQString() << modelDirectories.join(
", ");
147 this->setObjectInfo(simulator);
170 QStringList modelDirs =
178 void IAircraftModelLoader::setObjectInfo(
const CSimulatorInfo &simulatorInfo)
180 this->setObjectName(
"Model loader for: '" + simulatorInfo.
toQString(
true) +
"'");
183 void IAircraftModelLoader::onLoadingFinished(
const CStatusMessageList &statusMsgs,
const CSimulatorInfo &simulator,
187 this->setObjectInfo(simulator);
194 const int errors = counts.value(SeverityError);
195 const int warnings = counts.value(SeverityWarning);
200 u
"Message loading produced %1 error and %2 warning messages")
201 << errors << warnings;
210 void IAircraftModelLoader::onCacheChanged(
const CSimulatorInfo &simulator)
229 const qint64 now = QDateTime::currentMSecsSinceEpoch();
230 return m_loadingStartedTs > 0 && now > (m_loadingStartedTs + 5000);
236 const QStringList &modelDirectories)
239 Q_UNUSED(modelConsolidation);
240 Q_UNUSED(modelDirectories);
241 m_loadingStartedTs = QDateTime::currentMSecsSinceEpoch();
static QStringList getExistingUnemptyDirectories(const QStringList &directories)
Get the existing directories.
static QStringList fixWindowsUncPaths(const QStringList &filePaths)
Fix UNC file paths.
static const QString & modelLoader()
Model loader.
Class for emitting a log message.
Derived & log(StatusSeverity s, const char16_t(&m)[N])
Set the severity and format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
void push_back(const T &value)
Appends an element at the end of the sequence.
void clear()
Removes all elements in the sequence.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
constexpr static auto SeverityInfo
Status severities.
constexpr static auto SeverityWarning
Status severities.
Status messages, e.g. from Core -> GUI.
CStatusMessage::StatusSeverity worstSeverity() const
Find worst severity.
bool hasWarningOrErrorMessages() const
Warning or error messages.
QMap< int, int > countSeverities() const
Count number of messages per severity.
void freezeOrder()
Current order of list will be new order values.
QString toQString(bool i18n=false) const
Cast as QString.
Value object encapsulating a list of aircraft models.
CDummyModelLoader(const CSimulatorInfo &simulator, QObject *parent)
Dummy loader.
virtual bool isLoadingFinished() const
IAircraftModelLoader::isLoadingFinished.
virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories)
IAircraftModelLoader::startLoadingFromDisk.
Simple hardcoded info about the corresponding simulator.
bool isSingleSimulator() const
Single simulator selected.
Load the aircraft for a simulator.
std::function< int(swift::misc::simulation::CAircraftModelList &, bool)> ModelConsolidationCallback
Callback to consolidate data, normally with DB data.
virtual void setModels(const CAircraftModelList &models)
Set models.
const CSimulatorInfo & getSimulator() const
Simulator.
void cacheChanged(const CSimulatorInfo &simulator)
Relayed from centralized caches.
static const QString & enumToString(LoadFinishedInfo info)
Enum as string.
QStringList getInitializedModelDirectories(const QStringList &modelDirectories, const CSimulatorInfo &simulator) const
Get model directories from settings if empty, otherwise checked and UNC path fixed.
virtual int updateModels(const CAircraftModelList &models)
Update models.
void loadingFinished(const CStatusMessageList &status, const CSimulatorInfo &simulator, IAircraftModelLoader::LoadFinishedInfo info)
Parsing is finished or cache has been loaded.
const CSimulatorInfo m_simulator
related simulator
void startLoading(LoadMode mode=InBackgroundWithCache, const ModelConsolidationCallback &modelConsolidation={}, const QStringList &modelDirectories={})
Start the loading process from disk. Optional DB models can be passed and used for data consolidation...
QString getFirstModelDirectoryOrDefault() const
First directory, can be used when only 1 directory is expected.
static const QStringList & getLogCategories()
Log categories.
bool hasCachedData() const
Any cached data?
bool supportsSimulator(const CSimulatorInfo &simulator) const
Supported simulator.
settings::CMultiSimulatorSettings m_settings
settings
IAircraftModelLoader(const CSimulatorInfo &simulator, QObject *parent=nullptr)
Constructor.
std::atomic< bool > m_loadingInProgress
loading in progress
virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories)=0
Start the loading process from disk.
LoadFinishedInfo
Load mode.
@ CacheLoaded
cache was loaded
@ LoadingSkipped
loading skipped (empty directory)
CStatusMessageList m_loadingMessages
loading messages
@ CacheOnly
only read cache, never load from disk
@ CacheFirst
always use cache (if it has data)
@ CacheSkipped
ignore cache
virtual ~IAircraftModelLoader()
Destructor.
std::atomic< bool > m_skipLoadingEmptyModelDir
loading empty model dirs might erase the cache, so normally we skip it
static bool needsCacheSynchronized(LoadMode mode)
Is that mode needing caches synchronized?
void synchronizeCache(const CSimulatorInfo &simulator)
Look like IMultiSimulatorModelCaches interface.
void setModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set models.
int updateModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set models.
CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const
Look like IMultiSimulatorModelCaches interface.
One central instance of the model caches.
QString getFirstModelDirectoryOrDefault(const CSimulatorInfo &simulator) const
First model directoy.
QStringList getModelDirectoriesOrDefault(const CSimulatorInfo &simulator) const
Model directory or default model path per simulator.
Free functions in swift::misc.