swift
modelsetbuilder.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2016 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "core/modelsetbuilder.h"
5 
6 #include <QStringList>
7 #include <Qt>
8 #include <QtGlobal>
9 
10 #include "core/application.h"
11 #include "core/db/databaseutils.h"
12 #include "core/webdataservices.h"
15 
16 using namespace swift::misc::simulation;
17 using namespace swift::core::db;
18 
19 namespace swift::core
20 {
21  CModelSetBuilder::CModelSetBuilder(QObject *parent) : QObject(parent)
22  {
23  // void
24  }
25 
27  const CAircraftModelList &models,
28  const CAircraftModelList &currentSet, Builder options,
29  const CDistributorList &distributors) const
30  {
31  if (models.isEmpty()) { return CAircraftModelList(); }
32  CAircraftModelList modelSet;
33 
34  // Select by distributor:
35  // I avoid an empty distributor set because it wipes out everything
36  if (options.testFlag(GivenDistributorsOnly) && !distributors.isEmpty())
37  {
38  modelSet = models.findByDistributors(distributors);
39  }
40  else { modelSet = models; }
41 
42  // Only DB data?
43  if (options.testFlag(OnlyDbData)) { modelSet.removeObjectsWithoutDbKey(); }
44  else if (options.testFlag(OnlyDbIcaoCodes))
45  {
46  Q_ASSERT_X(sApp->hasWebDataServices(), Q_FUNC_INFO, "No web data services");
47  const QSet<QString> designators(sApp->getWebDataServices()->getAircraftIcaoCodes().allDesignators());
48  modelSet = modelSet.findWithAircraftDesignator(designators);
49  }
50  else
51  {
52  // without any information we can not use them
53  modelSet = modelSet.findWithKnownAircraftDesignator();
54  }
55 
56  // Include only
57  modelSet = modelSet.matchesSimulator(simulator);
58  modelSet.setModelMode(CAircraftModel::Include); // in sets we only include, exclude means not present in set
59 
60  if (options.testFlag(Incremental))
61  {
62  if (!currentSet.isEmpty())
63  {
64  // update in full set
65  CAircraftModelList copy(currentSet);
66  copy.replaceOrAddModelsWithString(modelSet, Qt::CaseInsensitive);
67  modelSet = copy;
68  }
69  }
70 
71  // sort by preferences if applicable
72  modelSet.resetOrder();
73  if (options.testFlag(SortByDistributors))
74  {
75  modelSet.updateDistributorOrder(distributors);
77  }
78 
79  // DB consolidation
80  if (options.testFlag(ConsolidateWithDb)) { CDatabaseUtils::consolidateModelsWithDbData(modelSet, true); }
81 
82  // result
83  return modelSet;
84  }
85 } // namespace swift::core
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
Definition: application.cpp:71
bool hasWebDataServices() const
Web data services available?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::simulation::CAircraftModelList buildModelSet(const swift::misc::simulation::CSimulatorInfo &simulator, const swift::misc::simulation::CAircraftModelList &models, const swift::misc::simulation::CAircraftModelList &currentSet, Builder options, const swift::misc::simulation::CDistributorList &distributors={}) const
Build a model set.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const
Aircraft ICAO codes.
void sortBy(K1 key1, Keys... keys)
In-place sort by some particular key(s).
Definition: sequence.h:576
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
void resetOrder(int offset=0)
Set order member to current order.
Definition: orderablelist.h:34
QSet< QString > allDesignators(bool noUnspecified=true) const
All ICAO codes, no duplicates.
int removeObjectsWithoutDbKey()
Remove objects without key.
int getDistributorOrder() const
Get distributor`s order value.
Value object encapsulating a list of aircraft models.
CAircraftModelList findWithAircraftDesignator() const
Models with aircraft ICAO code set.
CAircraftModelList findByDistributors(const CDistributorList &distributors) const
All models from given distributors.
int replaceOrAddModelsWithString(const CAircraftModelList &addOrReplaceList, Qt::CaseSensitivity sensitivity)
Replace or add based on model string.
CAircraftModelList findWithKnownAircraftDesignator() const
Models with a known aircraft ICAO code set.
CAircraftModelList matchesSimulator(const CSimulatorInfo &simulator) const
Find for given simulator.
int setModelMode(CAircraftModel::ModelMode mode)
Set mode for all elements.
int updateDistributorOrder(const CDistributorList &distributors)
From given CDistributorList update the model`s distributor order.
Value object encapsulating a list of distributors.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
Classes interacting with the swift database (aka "datastore").
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7