swift
aircrafticaoform.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 
4 #include "aircrafticaoform.h"
5 
6 #include <QCheckBox>
7 #include <QComboBox>
8 #include <QLineEdit>
9 #include <QMetaType>
10 #include <QString>
11 
12 #include "ui_aircrafticaoform.h"
13 
14 #include "core/webdataservices.h"
17 #include "gui/dropsite.h"
20 #include "gui/guiapplication.h"
21 #include "gui/guiutility.h"
22 #include "gui/labelandicon.h"
24 #include "misc/db/datastore.h"
25 #include "misc/icons.h"
27 
28 using namespace swift::misc;
29 using namespace swift::misc::aviation;
30 using namespace swift::misc::db;
31 using namespace swift::gui::components;
32 
33 namespace swift::gui::editors
34 {
35  CAircraftIcaoForm::CAircraftIcaoForm(QWidget *parent) : CForm(parent), ui(new Ui::CAircraftIcaoForm)
36  {
37  ui->setupUi(this);
38  this->setFocusProxy(ui->le_Id);
39  ui->lai_Id->set(CIcons::appAircraftIcao16(), "Id:");
40  ui->le_Updated->setReadOnly(true);
41  ui->le_Id->setValidator(new QIntValidator(0, 999999, ui->le_Id));
42  ui->aircraft_Selector->displayWithIcaoDescription(false);
43  connect(ui->aircraft_Selector, &CDbAircraftIcaoSelectorComponent::changedAircraftIcao, this,
45 
46  // Id
47  connect(ui->le_Id, &QLineEdit::returnPressed, this, &CAircraftIcaoForm::idEntered);
48 
49  // drag and drop, pasted
50  connect(ui->drop_DropData, &CDropSite::droppedValueObject, this, &CAircraftIcaoForm::droppedCode);
51  connect(ui->tb_Paste, &QToolButton::clicked, this, &CAircraftIcaoForm::pasted);
52  ui->drop_DropData->setInfoText("<drop aircraft ICAO code>");
53  ui->drop_DropData->setAcceptedMetaTypeIds(
54  { qMetaTypeId<CAircraftIcaoCode>(), qMetaTypeId<CAircraftIcaoCodeList>() });
55  }
56 
58 
60  {
61  if (icao == m_originalCode) { return false; }
62  m_originalCode = icao;
63 
64  ui->le_Id->setText(icao.getDbKeyAsString());
65  ui->aircraft_Selector->setAircraftIcao(icao);
66  ui->le_Manufacturer->setText(icao.getManufacturer());
67  ui->le_ModelDescription->setText(icao.getModelDescription());
68  ui->le_Family->setText(icao.getFamily());
69  ui->le_Iata->setText(icao.getIataCode());
70 
71  ui->cb_Legacy->setChecked(icao.isLegacyAircraft());
72  ui->cb_Military->setChecked(icao.isMilitary());
73  ui->cb_RealWorld->setChecked(icao.isRealWorld());
74  ui->combined_TypeSelector->setCombinedType(icao.getCombinedType());
75 
76  QString rank(icao.getRankString());
77  QString wtc(icao.getWtc().toQString());
78  CGuiUtility::setComboBoxValueByStartingString(ui->cb_Rank, rank, "unspecified");
79  CGuiUtility::setComboBoxValueByStartingString(ui->cb_Wtc, wtc, "unspecified");
80 
81  ui->le_Updated->setText(icao.getFormattedUtcTimestampYmdhms());
82  return true;
83  }
84 
85  void CAircraftIcaoForm::jsonPasted(const QString &json)
86  {
87  if (json.isEmpty()) { return; } // avoid unnecessary conversions
88  try
89  {
90  CVariant jsonVariant;
92  if (!jsonVariant.canConvert<CAircraftIcaoCodeList>()) { return; }
93  const CAircraftIcaoCodeList icaos = jsonVariant.value<CAircraftIcaoCodeList>();
94  if (!icaos.isEmpty()) { this->setValue(icaos.front()); }
95  }
96  catch (const CJsonException &ex)
97  {
98  Q_UNUSED(ex);
99  }
100  }
101 
103  {
104  CAircraftIcaoCode icao(ui->aircraft_Selector->getAircraftIcao());
105  if (!icao.hasValidDbKey() && sGui && sGui->getWebDataServices())
106  {
107  // not based on DB yet, do we have a DB key
108  int k = this->getDbKeyFromGui();
109  if (k >= 0)
110  {
111  // we got an id, we get the DB object for it
113  if (fromDb.getDesignator() == icao.getDesignator())
114  {
115  // we replace by DB object
116  icao = fromDb;
117  }
118  }
119  }
120 
121  const QString manufacturer(ui->le_Manufacturer->text().trimmed().toUpper());
122  const QString modelDescription(ui->le_ModelDescription->text().trimmed());
123  const QString iata(ui->le_Iata->text().trimmed().toUpper());
124  const QString family(ui->le_Family->text().trimmed().toUpper());
125  const QString wtc(ui->cb_Wtc->currentText().left(1));
126  const QString combined(ui->combined_TypeSelector->getCombinedType());
127  bool ok;
128  int rank = ui->cb_Rank->currentText().toInt(&ok);
129  if (!ok) { rank = 10; }
130  bool legacy = ui->cb_Legacy->isChecked();
131  bool military = ui->cb_Military->isChecked();
132  bool realWorld = ui->cb_RealWorld->isChecked();
133  icao.setManufacturer(manufacturer);
134  icao.setModelDescription(modelDescription);
135  icao.setWtc(wtc.isEmpty() ? CWakeTurbulenceCategory() : CWakeTurbulenceCategory(wtc.at(0)));
136  icao.setCodeFlags(military, legacy, realWorld);
137  icao.setRank(rank);
138  icao.setCombinedType(combined);
139  icao.setFamily(family);
140  icao.setIataCode(iata);
141  return icao;
142  }
143 
145  {
146  Q_UNUSED(nested);
147  const CAircraftIcaoCode code(this->getValue());
148  const CStatusMessageList msgs(code.validate());
149  ui->val_Indicator->setState(msgs);
150  return msgs;
151  }
152 
153  void CAircraftIcaoForm::allowDrop(bool allowDrop) { ui->drop_DropData->allowDrop(allowDrop); }
154 
155  bool CAircraftIcaoForm::isDropAllowed() const { return ui->drop_DropData->isDropAllowed(); }
156 
157  void CAircraftIcaoForm::setReadOnly(bool readOnly)
158  {
159  m_readOnly = readOnly;
160  ui->aircraft_Selector->setReadOnly(readOnly);
161  ui->le_Manufacturer->setReadOnly(readOnly);
162  ui->le_ModelDescription->setReadOnly(readOnly);
163  ui->le_Family->setReadOnly(readOnly);
164  ui->le_Iata->setReadOnly(readOnly);
165  ui->le_Id->setReadOnly(readOnly);
166  ui->tb_Paste->setVisible(!readOnly);
167 
168  CGuiUtility::checkBoxReadOnly(ui->cb_Legacy, readOnly);
169  CGuiUtility::checkBoxReadOnly(ui->cb_Military, readOnly);
170  CGuiUtility::checkBoxReadOnly(ui->cb_RealWorld, readOnly);
171 
172  ui->cb_Wtc->setEnabled(!readOnly);
173  ui->cb_Rank->setEnabled(!readOnly);
174  ui->drop_DropData->setVisible(!readOnly);
175  ui->combined_TypeSelector->setReadOnly(readOnly);
176 
177  this->forceStyleSheetUpdate();
178  }
179 
181  {
182  this->setReadOnly(true);
183  ui->tb_Paste->setVisible(true);
184  ui->aircraft_Selector->setReadOnly(false);
185  ui->le_Id->setReadOnly(false);
186  ui->drop_DropData->setVisible(true);
187  }
188 
190 
191  void CAircraftIcaoForm::resetValue() { this->setValue(m_originalCode); }
192 
193  void CAircraftIcaoForm::droppedCode(const swift::misc::CVariant &variantDropped)
194  {
195  CAircraftIcaoCode icao;
196  if (variantDropped.canConvert<CAircraftIcaoCode>()) { icao = variantDropped.value<CAircraftIcaoCode>(); }
197  else if (variantDropped.canConvert<CAircraftIcaoCodeList>())
198  {
199  const CAircraftIcaoCodeList icaoList(variantDropped.value<CAircraftIcaoCodeList>());
200  if (icaoList.isEmpty()) { return; }
201  icao = icaoList.front();
202  }
203  else { return; }
204  this->setValue(icao);
205  }
206 
207  void CAircraftIcaoForm::idEntered()
208  {
209  if (!sGui || !sGui->hasWebDataServices())
210  {
211  ui->le_Id->undo();
212  return;
213  }
214 
215  const int id = ui->le_Id->text().toInt();
217  if (!icao.isLoadedFromDb())
218  {
219  ui->le_Id->undo();
220  return;
221  }
222  this->setValue(icao);
223  }
224 
225  int CAircraftIcaoForm::getDbKeyFromGui() const
226  {
227  QString key(ui->le_Id->text().trimmed());
228  return IDatastoreObjectWithIntegerKey::stringToDbKey(key);
229  }
230 } // namespace swift::gui::editors
bool hasWebDataServices() const
Web data services available?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int id) const
ICAO code for id.
void droppedValueObject(const swift::misc::CVariant &droppedObject)
Dropped value object.
static void checkBoxReadOnly(QCheckBox *checkBox, bool readOnly)
Pseudo readonly state for checkbox.
Definition: guiutility.cpp:450
static bool setComboBoxValueByStartingString(QComboBox *box, const QString &candidate, const QString &unspecified=QString())
Find best match in comboBox.
Definition: guiutility.cpp:297
virtual void setSelectOnly()
Read only, but entity can be selected (normally used in mapping). Use setReadOnly to reset this very ...
void allowDrop(bool allowDrop)
Allow to drop.
swift::misc::aviation::CAircraftIcaoCode getValue() const
Get value.
void resetValue()
Reset value to current value.
virtual swift::misc::CStatusMessageList validate(bool nested=false) const
Validate, empty list means OK.
bool isDropAllowed() const
Is drop allowed?
virtual void jsonPasted(const QString &json)
JSON string has been pasted.
virtual void setReadOnly(bool readonly)
Set editable.
bool setValue(const swift::misc::aviation::CAircraftIcaoCode &icao)
Set value.
Form base class.
Definition: form.h:27
void forceStyleSheetUpdate()
Forces a stylesheet update.
Definition: form.cpp:47
void pasted()
Pasted from clipboard.
Definition: form.cpp:39
bool m_readOnly
read only
Definition: form.h:67
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
Definition: jsonexception.h:24
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Status messages, e.g. from Core -> GUI.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
T value() const
Return the value converted to the type T.
Definition: variant.h:169
void convertFromJson(const QJsonObject &json)
Assign from JSON object.
bool canConvert(int typeId) const
True if this variant can be converted to the type with the given metatype ID.
QString getFormattedUtcTimestampYmdhms() const
As yyyy MM dd HH mm ss.
Value object for ICAO classification.
CWakeTurbulenceCategory getWtc() const
Get WTC.
bool isRealWorld() const
Real world aircraft?
const QString & getFamily() const
Family (e.g. A350)
void setCodeFlags(bool military, bool legacy, bool realWorld)
Flags.
const QString & getDesignator() const
Get ICAO designator, e.g. "B737".
const QString & getModelDescription() const
Get IACO model description, e.g. "A-330-200".
void setIataCode(const QString &iata)
Set IATA code.
void setWtc(CWakeTurbulenceCategory wtc)
Set WTC.
void setManufacturer(const QString &manufacturer)
Set the manufacturer.
const QString & getIataCode() const
IATA code.
void setCombinedType(const QString &type)
Set type.
CStatusMessageList validate() const
Validate data.
void setModelDescription(const QString &modelDescription)
Set the model description (ICAO description)
const QString & getCombinedType() const
Get type, e.g. "L2J".
bool isLegacyAircraft() const
Legacy aircraft (no current ICAO code)
void setFamily(const QString &family)
Set family.
const QString & getManufacturer() const
Get manufacturer, e.g. "Airbus".
Value object encapsulating a list of ICAO codes.
QString getDbKeyAsString() const
DB key as string.
Definition: datastore.cpp:30
bool isLoadedFromDb() const
Loaded from DB.
Definition: datastore.cpp:49
bool hasValidDbKey() const
Has valid DB key.
Definition: datastore.h:102
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat)
JSON Object from string.
Definition: json.cpp:413
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Free functions in swift::misc.