swift
airport.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QCoreApplication>
7 #include <QStringBuilder>
8 #include <Qt>
9 #include <QtGlobal>
10 
11 #include "misc/pq/angle.h"
12 #include "misc/propertyindexref.h"
13 #include "misc/stringutils.h"
14 
15 using namespace swift::misc;
16 using namespace swift::misc::physical_quantities;
17 using namespace swift::misc::geo;
18 
19 SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::aviation, CAirport)
20 
21 namespace swift::misc::aviation
22 {
23  CAirport::CAirport(const QString &icao) : m_icao(icao) {}
24 
26  : m_icao(icao), m_position(position)
27  {}
28 
30  const QString &descriptiveName)
31  : m_descriptiveName(descriptiveName), m_icao(icao), m_position(position)
32  {}
33 
35  {
36  if (m_location.isEmpty()) { return this->getDescriptiveName(); }
37  if (m_descriptiveName.isEmpty()) { return this->getLocation(); }
38  if (this->getDescriptiveName() == this->getLocation()) { return this->getLocation(); }
39  return this->getLocation() % u" (" % this->getDescriptiveName() % u')';
40  }
41 
42  bool CAirport::matchesLocation(const QString &location) const
43  {
44  if (location.isEmpty()) { return false; }
45  return caseInsensitiveStringCompare(location, this->getLocation());
46  }
47 
48  bool CAirport::matchesDescriptiveName(const QString &name) const
49  {
50  if (name.isEmpty()) { return false; }
52  }
53 
55  {
56  if (!m_country.hasIsoCode() && airport.getCountry().hasIsoCode()) { m_country = airport.getCountry(); }
57  if (m_descriptiveName.isEmpty()) { m_descriptiveName = airport.getDescriptiveName(); }
58  }
59 
60  bool CAirport::isNull() const { return (m_icao.isEmpty() && m_descriptiveName.isEmpty()); }
61 
63  {
64  QString s = i18n ? QCoreApplication::translate("Aviation", "Airport") : "Airport";
65  if (!m_icao.isEmpty()) { s.append(' ').append(m_icao.toQString(i18n)); }
66 
67  // position
68  s.append(' ').append(m_position.toQString(i18n));
69  return s;
70 
71  // force strings for translation in resource files
72  (void)QT_TRANSLATE_NOOP("Aviation", "Airport");
73  }
74 
76  {
77  CAirport airport(json.value(prefix + "icao").toString());
78  airport.setDescriptiveName(json.value(prefix + "name").toString());
79  airport.setLocation(json.value(prefix + "location").toString());
80  const CCoordinateGeodetic pos(json.value(prefix + "latitude").toDouble(),
81  json.value(prefix + "longitude").toDouble(),
82  json.value(prefix + "altitude").toDouble());
83  airport.setPosition(pos);
84  airport.setOperating(json.value(prefix + "operating").toString() == QStringLiteral("Y"));
85 
86  const CCountry country = CCountry::fromDatabaseJson(json, "ctry_");
87  airport.setCountry(country);
88 
89  airport.setKeyVersionTimestampFromDatabaseJson(json, prefix);
90  return airport;
91  }
92 
94  {
95  if (index.isMyself()) { return QVariant::fromValue(*this); }
96  const auto i = index.frontCasted<ColumnIndex>();
97  switch (i)
98  {
99  case IndexIcao: return m_icao.propertyByIndex(index.copyFrontRemoved());
100  case IndexLocation: return { m_location };
101  case IndexDescriptiveName: return { m_descriptiveName };
102  case IndexPosition: return m_position.propertyByIndex(index.copyFrontRemoved());
103  case IndexElevation: return this->getElevation().propertyByIndex(index.copyFrontRemoved());
104  case IndexOperating: return QVariant::fromValue(this->isOperating());
105  default:
106  return (ICoordinateWithRelativePosition::canHandleIndex(index)) ?
107  ICoordinateWithRelativePosition::propertyByIndex(index) :
109  }
110  }
111 
113  {
114  if (index.isMyself())
115  {
116  (*this) = variant.value<CAirport>();
117  return;
118  }
119  const auto i = index.frontCasted<ColumnIndex>();
120  switch (i)
121  {
122  case IndexIcao: m_icao.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
123  case IndexLocation: this->setLocation(variant.toString()); break;
124  case IndexDescriptiveName: this->setDescriptiveName(variant.toString()); break;
125  case IndexPosition: m_position.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
126  case IndexOperating: this->setOperating(variant.toBool()); break;
127  default:
128  if (ICoordinateWithRelativePosition::canHandleIndex(index))
129  {
130  ICoordinateWithRelativePosition::setPropertyByIndex(index, variant);
131  }
132  else { CValueObject::setPropertyByIndex(index, variant); }
133  break;
134  }
135  }
136 
137  int CAirport::comparePropertyByIndex(CPropertyIndexRef index, const CAirport &compareValue) const
138  {
139  if (index.isMyself())
140  {
141  return m_icao.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getIcao());
142  }
143  const auto i = index.frontCasted<ColumnIndex>();
144  switch (i)
145  {
146  case IndexIcao: return m_icao.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.getIcao());
147  case IndexLocation: return m_location.compare(compareValue.getLocation(), Qt::CaseInsensitive);
148  case IndexDescriptiveName:
149  return m_descriptiveName.compare(compareValue.getDescriptiveName(), Qt::CaseInsensitive);
150  default:
151  if (ICoordinateWithRelativePosition::canHandleIndex(index))
152  {
153  return ICoordinateWithRelativePosition::comparePropertyByIndex(index, compareValue);
154  }
155  break;
156  }
157  Q_ASSERT_X(false, Q_FUNC_INFO, "Compare failed");
158  return 0;
159  }
160 } // namespace swift::misc::aviation
bool hasIsoCode() const
ISO code?
Definition: country.cpp:49
static CCountry fromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
From our database JSON format.
Definition: country.cpp:170
Non-owning reference to a CPropertyIndex with a subset of its features.
Q_REQUIRED_RESULT CPropertyIndexRef copyFrontRemoved() const
Copy with first element removed.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
Value object encapsulating information about an airpot.
Definition: airport.h:36
void setPosition(const swift::misc::geo::CCoordinateGeodetic &position)
Set position.
Definition: airport.h:97
bool matchesLocation(const QString &location) const
Matches location?
Definition: airport.cpp:42
void setLocation(const QString &location)
Set location.
Definition: airport.h:79
QString getLocationPlusOptionalName() const
Location plus optional name (if available and different from location)
Definition: airport.cpp:34
bool isNull() const
NULL airport?
Definition: airport.cpp:60
bool matchesDescriptiveName(const QString &name) const
Matches name?
Definition: airport.cpp:48
static CAirport fromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
Object from JSON.
Definition: airport.cpp:75
const QString & getLocation() const
Get location (e.g. "London")
Definition: airport.h:73
void setDescriptiveName(const QString &name)
Set descriptive name.
Definition: airport.h:88
CAirport()=default
Default constructor.
const CCountry & getCountry() const
Get the country.
Definition: airport.h:100
void setOperating(bool operating)
Sets the value of.
Definition: airport.h:120
QString convertToQString(bool i18n=false) const
Cast as QString.
Definition: airport.cpp:62
const swift::misc::aviation::CAltitude & getElevation() const
Elevation.
Definition: airport.h:107
int comparePropertyByIndex(CPropertyIndexRef index, const CAirport &compareValue) const
Compare by index.
Definition: airport.cpp:137
void updateMissingParts(const CAirport &airport)
Update the missing parts in airport.
Definition: airport.cpp:54
const QString & getDescriptiveName() const
Get descriptive name.
Definition: airport.h:85
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
Definition: airport.cpp:93
const CAirportIcaoCode & getIcao() const
Get ICAO code.
Definition: airport.h:64
ColumnIndex
Properties by index.
Definition: airport.h:40
bool isOperating() const
Is the airport still active?
Definition: airport.h:117
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: airport.cpp:112
void setCountry(const CCountry &country)
Set the country.
Definition: airport.h:103
Value object encapsulating information of airport ICAO data.
int comparePropertyByIndex(CPropertyIndexRef index, const CAirportIcaoCode &compareValue) const
Compare for index.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
void setKeyVersionTimestampFromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
Set key and timestamp values.
Definition: datastore.cpp:79
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: mixinindex.h:158
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:165
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:74
Free functions in swift::misc.
SWIFT_MISC_EXPORT bool caseInsensitiveStringCompare(const QString &c1, const QString &c2)
Case insensitive string compare.
QString translate(const char *context, const char *sourceText, const char *disambiguation, int n)
QJsonValue value(QLatin1StringView key) const const
double toDouble(double defaultValue) const const
QString toString() const const
QString & append(QChar ch)
int compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs)
bool isEmpty() const const
CaseInsensitive
QVariant fromValue(T &&value)
bool toBool() const const
QString toString() const const
T value() const &const
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67