swift
aircraftmodelfilter.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
8 #include "misc/aviation/livery.h"
10 
11 using namespace swift::misc::simulation;
12 
13 namespace swift::gui::models
14 {
15  CAircraftModelFilter::CAircraftModelFilter(int id, const QString &modelKey, const QString &description,
16  CAircraftModel::ModelModeFilter modelMode,
17  swift::misc::db::DbKeyStateFilter dbKeyFilter, Qt::CheckState military,
18  Qt::CheckState colorLiveries, const QString &aircraftIcao,
19  const QString &aircraftManufacturer, const QString &airlineIcao,
20  const QString &airlineName, const QString &liveryCode,
21  const QString &fileName, const QString &combinedType,
22  const CSimulatorInfo &simInfo, const CDistributor &distributor)
23  : m_id(id), m_modelKey(modelKey.trimmed().toUpper()), m_description(description.trimmed()),
24  m_modelMode(modelMode), m_dbKeyFilter(dbKeyFilter), m_military(military), m_colorLiveries(colorLiveries),
25  m_aircraftIcao(aircraftIcao.trimmed().toUpper()),
26  m_aircraftManufacturer(aircraftManufacturer.trimmed().toUpper()),
27  m_airlineIcao(airlineIcao.trimmed().toUpper()), m_airlineName(airlineName.trimmed().toUpper()),
28  m_liveryCode(liveryCode.trimmed().toUpper()), m_fileName(fileName), m_combinedType(combinedType),
29  m_simulatorInfo(simInfo), m_distributor(distributor)
30  {
31  m_valid = this->valid();
32  }
33 
35  {
36  if (!this->isEnabled()) { return inContainer; }
37  CAircraftModelList outContainer;
38  for (const CAircraftModel &model : inContainer)
39  {
40  if (m_id >= 0)
41  {
42  // search only for id
43  if (model.isLoadedFromDb() && model.getDbKey() == m_id)
44  {
45  outContainer.push_back(model);
46  break;
47  }
48  continue;
49  }
50 
51  if (!m_simulatorInfo.isAllSimulators())
52  {
53  if (!m_simulatorInfo.matchesAny(model.getSimulator())) { continue; }
54  }
55 
56  if (!m_modelKey.isEmpty())
57  {
58  if (!this->stringMatchesFilterExpression(model.getModelString(), m_modelKey)) { continue; }
59  }
60 
61  if (m_military != Qt::PartiallyChecked)
62  {
63  if (m_military == Qt::Checked)
64  {
65  // military only
66  if (!model.isMilitary()) { continue; }
67  }
68  else if (m_military == Qt::Unchecked)
69  {
70  // civilian only
71  if (model.isMilitary()) { continue; }
72  }
73  }
74 
75  if (m_colorLiveries != Qt::PartiallyChecked)
76  {
77  if (m_colorLiveries == Qt::Checked)
78  {
79  // only color liveries
80  if (!model.getLivery().isColorLivery()) { continue; }
81  }
82  else if (m_colorLiveries == Qt::Unchecked)
83  {
84  // Only airline liveries
85  if (model.getLivery().isColorLivery()) { continue; }
86  }
87  }
88 
89  if (!m_description.isEmpty())
90  {
91  if (!this->stringMatchesFilterExpression(model.getDescription(), m_description)) { continue; }
92  }
93 
94  if (m_modelMode != CAircraftModel::All && m_modelMode != CAircraftModel::Undefined)
95  {
96  if (!model.matchesMode(m_modelMode)) { continue; }
97  }
98 
99  if (m_dbKeyFilter != swift::misc::db::All && m_dbKeyFilter != swift::misc::db::Undefined)
100  {
101  if (!model.matchesDbKeyState(m_dbKeyFilter)) { continue; }
102  }
103 
104  if (!m_fileName.isEmpty())
105  {
106  if (!this->stringMatchesFilterExpression(model.getFileName(), m_fileName)) { continue; }
107  }
108 
109  if (!m_aircraftIcao.isEmpty())
110  {
111  if (!this->stringMatchesFilterExpression(model.getAircraftIcaoCodeDesignator(), m_aircraftIcao))
112  {
113  continue;
114  }
115  }
116 
117  if (!m_aircraftManufacturer.isEmpty())
118  {
119  if (!this->stringMatchesFilterExpression(model.getAircraftIcaoCode().getManufacturer(),
120  m_aircraftManufacturer))
121  {
122  continue;
123  }
124  }
125 
126  if (!m_airlineIcao.isEmpty())
127  {
128  if (!this->stringMatchesFilterExpression(model.getAirlineIcaoCodeDesignator(), m_airlineIcao))
129  {
130  continue;
131  }
132  }
133 
134  if (!m_airlineName.isEmpty())
135  {
136  if (!this->stringMatchesFilterExpression(model.getAirlineIcaoCode().getName(), m_airlineName))
137  {
138  continue;
139  }
140  }
141 
142  if (!m_liveryCode.isEmpty())
143  {
144  if (!this->stringMatchesFilterExpression(model.getLivery().getCombinedCode(), m_liveryCode))
145  {
146  continue;
147  }
148  }
149 
150  if (m_distributor.hasValidDbKey())
151  {
152  if (!model.getDistributor().matchesKeyOrAlias(m_distributor)) { continue; }
153  }
154 
155  if (!m_combinedType.isEmpty())
156  {
157  if (!model.getAircraftIcaoCode().matchesCombinedType(m_combinedType)) { continue; }
158  }
159 
160  outContainer.push_back(model);
161  }
162  return outContainer;
163  }
164 
165  bool CAircraftModelFilter::valid() const
166  {
167  const bool allEmpty = m_id < 0 && m_modelKey.isEmpty() && m_description.isEmpty() &&
168  m_aircraftManufacturer.isEmpty() && m_aircraftIcao.isEmpty() && m_airlineIcao.isEmpty() &&
169  m_airlineName.isEmpty() && m_liveryCode.isEmpty() && m_fileName.isEmpty() &&
170  m_combinedType.isEmpty();
171  if (!allEmpty) { return true; }
172  const bool noSim = m_simulatorInfo.isNoSimulator() || m_simulatorInfo.isAllSimulators();
173  const bool noModelMode = (m_modelMode == CAircraftModel::Undefined || m_modelMode == CAircraftModel::All);
174  const bool noDbState = (m_dbKeyFilter == swift::misc::db::Undefined || m_dbKeyFilter == swift::misc::db::All);
175  const bool noKey = !m_distributor.hasValidDbKey();
176  const bool noColorRestriction = (m_colorLiveries == Qt::PartiallyChecked);
177  const bool noMilitary = (m_military == Qt::PartiallyChecked);
178  return !(noSim && noModelMode && noDbState && noKey && noMilitary && noColorRestriction);
179  }
180 } // namespace swift::gui::models
virtual swift::misc::simulation::CAircraftModelList filter(const swift::misc::simulation::CAircraftModelList &inContainer) const
Used container data.
bool stringMatchesFilterExpression(const QString &value, const QString &filter, Qt::CaseSensitivity cs=Qt::CaseInsensitive) const
Standard string search supporting wildcard at begin and end: "*xyz", "abc*".
Definition: modelfilter.cpp:31
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
bool hasValidDbKey() const
Has valid DB key.
Definition: datastore.h:195
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Value object encapsulating a list of aircraft models.
Value object encapsulating information of software distributor.
Definition: distributor.h:33
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
bool isAllSimulators() const
Is all simulators?
bool isNoSimulator() const
No simulator?
bool matchesAny(const CSimulatorInfo &otherInfo) const
Matches any simulator.
Models to be used with views, mainly QTableView.