swift
airlineicaoform.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 
6 #include <QCheckBox>
7 #include <QLabel>
8 #include <QLineEdit>
9 #include <QMetaType>
10 
11 #include "ui_airlineicaoform.h"
12 
13 #include "core/webdataservices.h"
17 #include "gui/dropsite.h"
19 #include "gui/guiapplication.h"
20 #include "gui/guiutility.h"
21 #include "gui/labelandicon.h"
23 #include "misc/icons.h"
25 
26 using namespace swift::misc;
27 using namespace swift::misc::aviation;
28 using namespace swift::gui::components;
29 
30 namespace swift::gui::editors
31 {
32  CAirlineIcaoForm::CAirlineIcaoForm(QWidget *parent) : CForm(parent), ui(new Ui::CAirlineIcaoForm)
33  {
34  ui->setupUi(this);
35  ui->le_Updated->setReadOnly(true);
36  ui->le_Id->setValidator(new QIntValidator(0, 999999, ui->le_Id));
37  ui->lai_Id->set(CIcons::appAirlineIcao16(), "Id:");
38 
39  ui->selector_AirlineDesignator->displayWithIcaoDescription(false);
40  connect(ui->selector_AirlineName, &CDbAirlineIcaoSelectorComponent::changedAirlineIcao, this,
41  &CAirlineIcaoForm::setValue, Qt::QueuedConnection);
42  connect(ui->selector_AirlineDesignator, &CDbAirlineIcaoSelectorComponent::changedAirlineIcao, this,
43  &CAirlineIcaoForm::setValue, Qt::QueuedConnection);
44 
45  // Id
46  connect(ui->le_Id, &QLineEdit::returnPressed, this, &CAirlineIcaoForm::onIdEntered);
47 
48  // drag and drop, paste
49  connect(ui->tb_Paste, &QToolButton::clicked, this, &CAirlineIcaoForm::pasted);
50  connect(ui->drop_DropData, &CDropSite::droppedValueObject, this, &CAirlineIcaoForm::onDroppedCode);
51  ui->drop_DropData->setInfoText("<drop airline ICAO code>");
52  ui->drop_DropData->setAcceptedMetaTypeIds(
53  { qMetaTypeId<CAirlineIcaoCode>(), qMetaTypeId<CAirlineIcaoCodeList>() });
54  }
55 
57 
59  {
60  if (m_currentCode == icao) { return; }
61  m_currentCode = icao;
62 
63  ui->selector_AirlineDesignator->setAirlineIcao(icao);
64  ui->selector_AirlineName->setAirlineIcao(icao);
65  ui->le_Id->setText(icao.getDbKeyAsString());
66  ui->le_TelephonyDesignator->setText(icao.getTelephonyDesignator());
67  ui->le_Updated->setText(icao.getFormattedUtcTimestampYmdhms());
68  ui->cb_Va->setChecked(icao.isVirtualAirline());
69  ui->cb_Military->setChecked(icao.isMilitary());
70  ui->country_Selector->setCountry(icao.getCountry());
71 
72  const QPixmap pm = CIcon(icao.toIcon());
73  if (pm.width() < 125) { ui->lbl_AirlineIcon->setPixmap(pm); }
74  else
75  {
76  ui->lbl_AirlineIcon->setTextFormat(Qt::RichText);
77  ui->lbl_AirlineIcon->setText(CGuiUtility::asSimpleHtmlImageHeight(icao.toIcon(), 25));
78  }
79 
80  // sometimes artefacts when icon is displayed
81  this->repaint();
82 
83  if (m_currentCode.hasCompleteData()) { emit this->airlineChanged(m_currentCode); }
84  }
85 
87  {
88  CAirlineIcaoCode code;
89  const QString id = ui->le_Id->text();
91  {
92  bool ok;
93  const int dbKey = id.toInt(&ok);
94  if (ok) { code = sGui->getWebDataServices()->getAirlineIcaoCodeForDbKey(dbKey); }
95  }
96 
97  if (code.hasValidDbKey()) { return code; }
98  code = m_currentCode;
99  code.setVirtualAirline(ui->cb_Va->isChecked());
100  code.setMilitary(ui->cb_Military->isChecked());
101  code.setCountry(ui->country_Selector->getCountry());
102  code.setName(ui->selector_AirlineName->getAirlineIcao().getName());
103  code.setTelephonyDesignator(ui->le_TelephonyDesignator->text());
104  return code;
105  }
106 
108  {
109  Q_UNUSED(nested);
110  CAirlineIcaoCode code(getValue());
111  CStatusMessageList msgs(code.validate());
112  if (this->isReadOnly())
113  {
114  // in readonly I cannot change the data anyway, so skip warnings
115  msgs.removeWarningsAndBelow();
116  }
117 
118  ui->val_Indicator->setState(msgs);
119  return msgs;
120  }
121 
122  void CAirlineIcaoForm::allowDrop(bool allowDrop) { ui->drop_DropData->allowDrop(allowDrop); }
123 
124  bool CAirlineIcaoForm::isDropAllowed() const { return ui->drop_DropData->isDropAllowed(); }
125 
126  void CAirlineIcaoForm::setReadOnly(bool readOnly)
127  {
128  ui->le_Id->setReadOnly(readOnly);
129  ui->selector_AirlineDesignator->setReadOnly(readOnly);
130  ui->selector_AirlineName->setReadOnly(readOnly);
131  ui->le_TelephonyDesignator->setReadOnly(readOnly);
132  ui->country_Selector->setReadOnly(readOnly);
133  ui->drop_DropData->setVisible(!readOnly);
134  ui->tb_Paste->setVisible(!readOnly);
135 
136  CGuiUtility::checkBoxReadOnly(ui->cb_Va, readOnly);
137  CGuiUtility::checkBoxReadOnly(ui->cb_Military, readOnly);
138 
139  this->forceStyleSheetUpdate();
140  }
141 
143  {
144  this->setReadOnly(true);
145  ui->le_Id->setReadOnly(false);
146  ui->selector_AirlineDesignator->setReadOnly(false);
147  ui->selector_AirlineName->setReadOnly(false);
148  ui->drop_DropData->setVisible(true);
149  ui->tb_Paste->setVisible(true);
150  }
151 
153 
154  void CAirlineIcaoForm::resetValue() { this->setValue(m_currentCode); }
155 
156  void CAirlineIcaoForm::jsonPasted(const QString &json)
157  {
158  if (json.isEmpty()) { return; } // avoid unnecessary conversions
159  try
160  {
161  CVariant jsonVariant;
162  jsonVariant.convertFromJson(json::jsonObjectFromString(json));
163  if (!jsonVariant.canConvert<CAirlineIcaoCodeList>()) { return; }
164  const CAirlineIcaoCodeList icaos = jsonVariant.value<CAirlineIcaoCodeList>();
165  if (!icaos.isEmpty()) { this->setValue(icaos.front()); }
166  }
167  catch (const CJsonException &ex)
168  {
169  Q_UNUSED(ex);
170  }
171  }
172 
174  {
175  CAirlineIcaoCode icao;
176  if (variantDropped.canConvert<CAirlineIcaoCode>()) { icao = variantDropped.value<CAirlineIcaoCode>(); }
177  else if (variantDropped.canConvert<CAirlineIcaoCodeList>())
178  {
179  const CAirlineIcaoCodeList icaoList(variantDropped.value<CAirlineIcaoCodeList>());
180  if (icaoList.isEmpty()) { return; }
181  icao = icaoList.front();
182  }
183  else { return; }
184  this->setValue(icao);
185  }
186 
188  {
189  if (!sGui || sGui->isShuttingDown() || !sGui->hasWebDataServices()) { return; }
190 
191  bool ok;
192  const int id = ui->le_Id->text().toInt(&ok);
194  if (ok && !icao.isLoadedFromDb())
195  {
196  ui->le_Id->undo();
197  return;
198  }
199  this->setValue(icao);
200  }
201 
203 } // namespace swift::gui::editors
bool hasWebDataServices() const
Web data services available?
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(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 QString asSimpleHtmlImageHeight(const swift::misc::CIcon &icon, int height=-1)
CIcon as simple HTML image code segment.
Definition: guiutility.cpp:859
void resetValue()
Reset value to current value.
void onDroppedCode(const swift::misc::CVariant &variantDropped)
Variant has been dropped.
void airlineChanged(const swift::misc::aviation::CAirlineIcaoCode &airlineIcao)
Airline has been changed.
void emitAirlineChangedDigest()
Emit the digest signal.
virtual void setSelectOnly()
Read only, but entity can be selected (normally used in mapping). Use setReadOnly to reset this very ...
swift::misc::aviation::CAirlineIcaoCode getValue() const
Get value.
void allowDrop(bool allowDrop)
Allow to drop.
virtual void setReadOnly(bool readonly)
Set editable.
void setValue(const swift::misc::aviation::CAirlineIcaoCode &icao=swift::misc::aviation::CAirlineIcaoCode())
Set value.
virtual swift::misc::CStatusMessageList validate(bool nested=false) const
Validate, empty list means OK.
virtual void jsonPasted(const QString &json)
JSON string has been pasted.
bool isDropAllowed() const
Is drop allowed?
void airlineChangedDigest(const swift::misc::aviation::CAirlineIcaoCode &airlineIcao)
Airline has been changed.
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 isReadOnly() const
Is read only?
Definition: form.h:54
Value object for icons. An icon is stored in the global icon repository and identified by its index....
Definition: icon.h:39
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.
void removeWarningsAndBelow()
Remove warnings and below.
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.
void setMilitary(bool military)
Military, air force or such?
bool isVirtualAirline() const
Virtual airline.
void setTelephonyDesignator(const QString &telephony)
Telephony designator such as "Speedbird".
bool isMilitary() const
Military, air force or such?
const QString & getTelephonyDesignator() const
Telephony designator such as "Speedbird".
void setVirtualAirline(bool va)
Virtual airline.
CStatusMessageList validate() const
Validate data.
bool hasCompleteData() const
Complete data.
void setName(const QString &name)
Set name.
void setCountry(const CCountry &country)
Set country.
CIcons::IconIndex toIcon() const
As icon, not implemented by all classes.
const CCountry & getCountry() const
Get country, e.g. "FRANCE".
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
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.