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 
62  QString CAirport::convertToQString(bool i18n) const
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 
75  CAirport CAirport::fromDatabaseJson(const QJsonObject &json, const QString &prefix)
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 ColumnIndex i = index.frontCasted<ColumnIndex>();
97  switch (i)
98  {
99  case IndexIcao: return m_icao.propertyByIndex(index.copyFrontRemoved());
100  case IndexLocation: return QVariant(m_location);
101  case IndexDescriptiveName: return QVariant(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 ColumnIndex 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 ColumnIndex 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
virtual 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:160
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:167
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Free functions in swift::misc.
SWIFT_MISC_EXPORT bool caseInsensitiveStringCompare(const QString &c1, const QString &c2)
Case insensitive string compare.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67