swift
matchingscript.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include "misc/stringutils.h"
7 
8 using namespace swift::misc::aviation;
9 
10 namespace swift::misc::simulation
11 {
12  MSInOutValues::MSInOutValues(const CCallsign &cs, const CAircraftIcaoCode &aircraftIcao,
13  const CAirlineIcaoCode &airlineIcao, const QString &livery, int liveryId)
14  : MSInOutValues(cs.asString(), cs.getStringAsSet(), cs.getFlightNumber(), aircraftIcao.getDesignator(),
15  aircraftIcao.getFamily(), aircraftIcao.getCombinedType(), aircraftIcao.getDbKey(),
16  airlineIcao.getDesignator(), airlineIcao.getVDesignator(), airlineIcao.getDbKey(), livery,
17  liveryId)
18  {}
19 
20  MSInOutValues::MSInOutValues(const CCallsign &cs, const CAircraftIcaoCode &aircraftIcao, const CLivery &livery)
21  : MSInOutValues(cs, aircraftIcao, livery.getAirlineIcaoCode(), livery.getCombinedCode(), livery.getDbKey())
22  {}
23 
25  : MSInOutValues(model.getCallsign(), model.getAircraftIcaoCode(), model.getLivery())
26  {}
27 
29  : MSInOutValues(sv.m_callsign, sv.m_callsignAsSet, sv.m_flightNumber, sv.getAircraftIcao(),
30  sv.getCombinedType(), sv.getAircraftFamily(), sv.getDbAircraftIcaoId(), sv.getAirlineIcao(),
31  sv.getVirtualAirlineIcao(), sv.getDbAirlineIcaoId(), sv.getLivery(), sv.getDbLiveryId(),
32  sv.m_logMessage, sv.isModified(), sv.isRerun())
33  {}
34 
35  void MSInOutValues::setCallsign(const QString &callsign)
36  {
37  if (m_callsign == callsign) { return; }
38  m_callsign = callsign;
39  emit this->callsignChanged();
40  }
41 
43  {
44  if (id == m_dbAircraftIcaoId) { return; }
45  m_dbAircraftIcaoId = id;
46  emit this->dbAircraftIcaoIdChanged();
47  }
48 
50  {
51  if (id == m_dbAirlineIcaoId) { return; }
52  m_dbAirlineIcaoId = id;
53  emit this->dbAirlineIcaoIdChanged();
54  }
55 
57  {
58  if (id == m_dbLiveryId) { return; }
59  m_dbLiveryId = id;
60  emit this->dbLiveryIdChanged();
61  }
62 
64  {
65  if (id == m_dbModelId) { return; }
66  m_dbModelId = id;
67  emit this->dbModelIdChanged();
68  }
69 
70  void MSInOutValues::setAircraftIcao(const QString &aircraftIcao)
71  {
72  if (aircraftIcao == m_aircraftIcao) { return; }
73  m_aircraftIcao = aircraftIcao;
74  emit this->aircraftIcaoChanged();
75  }
76 
77  void MSInOutValues::setAirlineIcao(const QString &airlineIcao)
78  {
79  if (airlineIcao == m_airlineIcao) { return; }
80  m_airlineIcao = airlineIcao;
81  emit this->airlineIcaoChanged();
82  }
83 
84  void MSInOutValues::setVirtualAirlineIcao(const QString &virtualAirlineIcao)
85  {
86  if (virtualAirlineIcao == m_vAirlineIcao) { return; }
87  m_vAirlineIcao = virtualAirlineIcao;
88  emit this->virtualAirlineIcaoChanged();
89  }
90 
91  void MSInOutValues::setLivery(const QString &livery)
92  {
93  if (livery == m_livery) { return; }
94  m_livery = livery;
95  emit this->liveryChanged();
96  }
97 
98  void MSInOutValues::setModelString(const QString &modelString)
99  {
100  if (modelString == m_modelString) { return; }
101  m_modelString = modelString;
102  emit this->modelStringChanged();
103  }
104 
105  void MSInOutValues::setCombinedType(const QString &type)
106  {
107  if (type == m_combinedType) { return; }
108  m_combinedType = type.trimmed().toUpper();
109  emit this->combinedTypeChanged();
110  }
111 
112  void MSInOutValues::setLogMessage(const QString &msg)
113  {
114  if (msg == m_logMessage) { return; }
115  m_logMessage = msg;
116  emit this->logMessageChanged();
117  }
118 
119  void MSInOutValues::setModified(bool modified)
120  {
121  if (modified == m_modified) { return; }
122  m_modified = modified;
123  emit this->modifiedChanged();
124  }
125 
126  void MSInOutValues::setRerun(bool rerun)
127  {
128  if (rerun == m_rerun) { return; }
129  m_rerun = rerun;
130  emit this->rerunChanged();
131  }
132 
134  {
135  m_modifiedAircraftDesignator = aircraft.getDesignator() != m_aircraftIcao;
136  m_modifiedAircraftFamily = aircraft.getFamily() != m_aircraftFamily;
137  if (airline.isVirtualAirline()) { m_modifiedAirlineDesignator = airline.getVDesignator() != m_vAirlineIcao; }
138  else { m_modifiedAirlineDesignator = airline.getDesignator() != m_airlineIcao; }
139  }
140 
142  {
143  if (aircraftIcao.hasValidDbKey() && aircraftIcao.getDbKey() != m_dbAircraftIcaoId) { return true; }
144  if (aircraftIcao.hasDesignator() && aircraftIcao.getDesignator() != m_aircraftIcao) { return true; }
145  return true;
146  }
147 
149  {
150  if (aircraftIcao.hasValidDbKey() && m_dbAircraftIcaoId >= 0)
151  {
152  // valid ids to be compared
153  return m_dbAircraftIcaoId != aircraftIcao.getDbKey();
154  }
155  return false;
156  }
157 
159  {
160  if (airlineIcao.hasValidDbKey() && airlineIcao.getDbKey() != m_dbAirlineIcaoId) { return true; }
161  if (airlineIcao.hasValidDesignator() && airlineIcao.getDesignator() != m_airlineIcao) { return true; }
162  if (airlineIcao.hasValidDesignator() && airlineIcao.getVDesignator() != m_vAirlineIcao) { return true; }
163  return false;
164  }
165 
167  {
168  if (airlineIcao.hasValidDbKey() && m_dbAirlineIcaoId >= 0)
169  {
170  // valid ids to be compared
171  return m_dbAirlineIcaoId != airlineIcao.getDbKey();
172  }
173  return false;
174  }
175 
176  bool MSInOutValues::hasChangedModelString(const QString &modelString) const
177  {
178  return !stringCompare(m_modelString, modelString, Qt::CaseInsensitive);
179  }
180 
181  bool MSInOutValues::hasChangedLiveryId(const CLivery &livery) const
182  {
183  if (livery.hasValidDbKey() && m_dbLiveryId >= 0)
184  {
185  // valid ids to be compared
186  return m_dbLiveryId != livery.getDbKey();
187  }
188  return false;
189  }
190 
192  {
193  if (model.hasValidDbKey() && m_dbModelId >= 0)
194  {
195  // valid ids to be compared
196  return m_dbModelId != model.getDbKey();
197  }
198  return false;
199  }
200 
202  {
203  return this->hasChangedModelString(model.getModelString()) || this->hasChangedModelId(model);
204  }
205 
206  void MSModelSet::setSimulator(const QString &simulator)
207  {
208  if (m_simulator == simulator) { return; }
209  m_simulator = simulator.trimmed().toUpper();
210  emit this->simulatorChanged();
211  }
212 
213  void MSModelSet::setAvailable(bool available)
214  {
215  if (m_available == available) { return; }
216  m_available = available;
217  emit this->availabilityChanged();
218  }
219 
221  {
222  if (m_inputAircraftAndAirlineCount == count) { return; }
223  m_inputAircraftAndAirlineCount = count;
225  }
226 
227  QString MSModelSet::findCombinedTypeWithClosestColorLivery(const QString &combinedType,
228  const QString &rgbColor) const
229  {
230  if (combinedType.isEmpty() || rgbColor.isEmpty()) { return QString(); }
231  CAircraftModelList models = m_modelSet.findByCombinedTypeWithColorLivery(combinedType);
232  if (models.isEmpty()) { return QString(); }
233  const CRgbColor color(rgbColor);
234  models = models.findClosestFuselageColorDistance(color);
235  return models.isEmpty() ? QString() : models.front().getModelString();
236  }
237 
239  const QString &rgbColor) const
240  {
241  QString ms = this->findCombinedTypeWithClosestColorLivery(combinedType, rgbColor);
242  if (!ms.isEmpty()) { return ms; }
243  if (combinedType.size() != 3) { return ms; }
244  QString wildCard(combinedType);
245  if (wildCard.size() != 3) { return QString(); }
246  wildCard[1] = '*';
247  return this->findCombinedTypeWithClosestColorLivery(wildCard, rgbColor);
248  }
249 
250  QString MSModelSet::findAircraftFamilyWithClosestColorLivery(const QString &family, const QString &rgbColor) const
251  {
252  if (family.isEmpty() || rgbColor.isEmpty()) { return QString(); }
253  CAircraftModelList models = m_modelSet.findByFamilyWithColorLivery(family);
254  if (models.isEmpty()) { return QString(); }
255  const CRgbColor color(rgbColor);
256  models = models.findClosestFuselageColorDistance(color);
257  return models.isEmpty() ? QString() : models.front().getModelString();
258  }
259 
260  MSModelSet::MSModelSet(const CAircraftModelList &modelSet) { this->initByModelSet(modelSet); }
261 
263  {
264  m_modelSet = modelSet;
265  m_available = !modelSet.isEmpty();
266  }
267 
269  {
270  if (m_modelSet.isEmpty() || !aircraft.hasDesignator() || !airline.hasValidDesignator())
271  {
272  m_inputAircraftAndAirlineCount = false;
273  return;
274  }
275 
276  const CAircraftModelList models = m_modelSet.findByAircraftAndAirline(aircraft, airline);
277  m_inputAircraftAndAirlineCount = models.size();
278  }
279 
280 } // namespace swift::misc::simulation
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Value object for ICAO classification.
bool hasDesignator() const
Aircraft designator?
const QString & getFamily() const
Family (e.g. A350)
const QString & getDesignator() const
Get ICAO designator, e.g. "B737".
Value object for ICAO classification.
bool isVirtualAirline() const
Virtual airline.
const QString & getDesignator() const
Get airline, e.g. "DLH".
bool hasValidDesignator() const
Airline designator available?
QString getVDesignator() const
Get airline, e.g. "DLH", but "VMVA" for virtual airlines.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object encapsulating information about an airpot.
Definition: livery.h:29
bool hasValidDbKey() const
Has valid DB key.
Definition: datastore.h:102
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
Value object encapsulating a list of aircraft models.
CAircraftModelList findByAircraftAndAirline(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CAirlineIcaoCode &airlineIcaoCode) const
Find by ICAO of aircraft and airline.
CAircraftModelList findByFamilyWithColorLivery(const QString &family) const
Models with aircraft family and color livery.
CAircraftModelList findByCombinedTypeWithColorLivery(const QString &combinedType) const
Combined type and color livery.
CAircraftModelList findClosestFuselageColorDistance(const CRgbColor &color) const
Find models with the closest color distance.
void combinedTypeChanged()
Livery, airline, aircraft, or model changed.
QString livery
MSNetworkValues properties.
void dbLiveryIdChanged()
DB id changed.
void setRerun(bool rerun)
Request re-run.
void dbAirlineIcaoIdChanged()
DB id changed.
void setDbAircraftIcaoId(int id)
Values found in DB?
bool hasChangedLiveryId(const swift::misc::aviation::CLivery &livery) const
Changed values.
QString callsign
MSNetworkValues properties.
void logMessageChanged()
Log. message has been changed.
void setCallsign(const QString &callsign)
Callsign values.
void liveryChanged()
Livery, airline, aircraft, or model changed.
void setDbAirlineIcaoId(int id)
Values found in DB?
bool hasChangedModel(const swift::misc::simulation::CAircraftModel &model) const
Changed values.
void aircraftIcaoChanged()
Livery, airline, aircraft, or model changed.
bool hasChangedModelString(const QString &modelString) const
Changed values.
bool hasChangedAircraftIcaoId(const swift::misc::aviation::CAircraftIcaoCode &aircraftIcao) const
Changed values.
bool hasChangedAirlineIcaoId(const swift::misc::aviation::CAirlineIcaoCode &airlineIcao) const
Changed values.
QString aircraftIcao
MSNetworkValues properties.
bool hasChangedAircraftIcao(const swift::misc::aviation::CAircraftIcaoCode &aircraftIcao) const
Changed values.
void setCombinedType(const QString &type)
Livery, airline, aircraft, model string.
void setAirlineIcao(const QString &airlineIcao)
Livery, airline, aircraft, model string.
void virtualAirlineIcaoChanged()
Livery, airline, aircraft, or model changed.
bool rerun
MSNetworkValues properties.
void modifiedChanged()
Modified changed.
void setModelString(const QString &modelString)
Livery, airline, aircraft, model string.
void setDbLiveryId(int id)
Values found in DB?
void dbAircraftIcaoIdChanged()
DB id changed.
void airlineIcaoChanged()
Livery, airline, aircraft, or model changed.
void setLogMessage(const QString &msg)
Log. message.
void setAircraftIcao(const QString &aircraftIcao)
Livery, airline, aircraft, model string.
QString virtualAirlineIcao
MSNetworkValues properties.
void setModified(bool modified)
Modified flag.
void setLivery(const QString &livery)
Livery, airline, aircraft, model string.
bool modified
MSNetworkValues properties.
bool hasChangedAirlineIcao(const swift::misc::aviation::CAirlineIcaoCode &airlineIcao) const
Changed values.
void modelStringChanged()
Livery, airline, aircraft, or model changed.
QString airlineIcao
MSNetworkValues properties.
bool hasChangedModelId(const swift::misc::simulation::CAircraftModel &model) const
Changed values.
void setVirtualAirlineIcao(const QString &virtualAirlineIcao)
Livery, airline, aircraft, model string.
QString modelString
MSNetworkValues properties.
void evaluateChanges(const swift::misc::aviation::CAircraftIcaoCode &aircraft, const swift::misc::aviation::CAirlineIcaoCode &airline)
Changed values such as modified values.
void callsignChanged()
Callsign changed.
void setDbModelId(int id)
Values found in DB?
void availabilityChanged()
Has been modified.
QString simulator
MSModelSet properties.
void initByModelSet(const swift::misc::simulation::CAircraftModelList &modelSet)
Init by model set.
void initByAircraftAndAirline(const swift::misc::aviation::CAircraftIcaoCode &aircraft, const swift::misc::aviation::CAirlineIcaoCode &airline)
Init by aircraft/airline.
Q_INVOKABLE QString findAircraftFamilyWithClosestColorLivery(const QString &family, const QString &rgbColor) const
Model string of model with closest color distance.
void inputAircraftAndAirlineCountChanged()
Aircraft and airline changed.
Q_INVOKABLE QString findCombinedTypeWithClosestColorLivery(const QString &combinedType, const QString &rgbColor) const
Model string of model with closest color distance.
void setAvailable(bool available)
Availablity flag.
bool available
MSModelSet properties.
void setInputAircraftAndAirlineCount(int count)
Input aircraft/airline available flag.
Q_INVOKABLE QString findClosestCombinedTypeWithClosestColorLivery(const QString &combinedType, const QString &rgbColor) const
Model string of model with closest color distance.
void setSimulator(const QString &simulator)
Set callsign.
void simulatorChanged()
Simulator changed.
SWIFT_MISC_EXPORT bool stringCompare(const QString &c1, const QString &c2, Qt::CaseSensitivity cs)
String compare.