swift
airportsmallcompleter.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QCompleter>
7 
8 #include "ui_airportsmallcompleter.h"
9 
10 #include "core/webdataservices.h"
12 #include "gui/guiapplication.h"
13 #include "gui/guiutility.h"
14 #include "gui/uppercasevalidator.h"
16 
17 using namespace swift::core;
18 using namespace swift::misc::aviation;
19 
20 namespace swift::gui::components
21 {
22  CAirportSmallCompleter::CAirportSmallCompleter(QWidget *parent) : QFrame(parent), ui(new Ui::CAirportSmallCompleter)
23  {
24  ui->setupUi(this);
25  ui->le_Icao->setValidator(new CUpperCaseValidator(ui->le_Icao));
26  this->setFocusProxy(ui->le_Icao);
27 
28  connect(sGui->getWebDataServices(), &CWebDataServices::swiftDbAllDataRead, this,
29  &CAirportSmallCompleter::onAirportsChanged);
30  connect(ui->le_Icao, &QLineEdit::editingFinished, this, &CAirportSmallCompleter::onIcaoChanged);
31  connect(ui->le_Icao, &QLineEdit::editingFinished, this, &CAirportSmallCompleter::editingFinished);
32  connect(ui->pb_Dialog, &QPushButton::clicked, this, &CAirportSmallCompleter::showAirportsDialog);
33  this->onAirportsChanged();
34  }
35 
37 
39  {
40  if (m_current == airport) { return; }
41  m_current = airport;
42  if (airport.getIcaoAsString() != ui->le_Icao->text()) { ui->le_Icao->setText(airport.getIcaoAsString()); }
43  emit this->changedAirport(m_current);
44  }
45 
47  {
48  if (sGui && sGui->hasWebDataServices())
49  {
50  const CAirport airport = sGui->getWebDataServices()->getAirportForIcaoDesignator(airportCode.asString());
51  if (!airport.isNull())
52  {
53  this->setAirport(airport);
54  return;
55  }
56  }
57  if (ui->le_Icao->text() != airportCode.asString()) { ui->le_Icao->setText(airportCode.asString()); }
58  }
59 
61  {
62  if (m_current.hasValidIcaoCode()) { return m_current.getIcao(); }
63  return CAirportIcaoCode(this->getIcaoText());
64  }
65 
66  QString CAirportSmallCompleter::getIcaoText() const { return ui->le_Icao->text().trimmed().toUpper(); }
67 
68  bool CAirportSmallCompleter::isEmpty() const { return ui->le_Icao->text().isEmpty(); }
69 
71  {
72  ui->le_Icao->setReadOnly(readOnly);
73  ui->pb_Dialog->setVisible(!readOnly);
74  }
75 
77  {
78  ui->le_Icao->clear();
79  m_current = CAirport();
80  }
81 
82  void CAirportSmallCompleter::clearIfInvalidCode(bool strictValidation)
83  {
84  const CAirportIcaoCode icao = this->getAirportIcaoCode();
85  if (!icao.hasValidIcaoCode(strictValidation)) { this->clear(); }
86  }
87 
88  void CAirportSmallCompleter::onIcaoChanged()
89  {
90  if (!sGui || !sGui->hasWebDataServices()) { return; }
92  if (!airport.isNull()) { this->setAirport(airport); }
93  }
94 
95  void CAirportSmallCompleter::onAirportsChanged()
96  {
97  if (!sGui || !sGui->hasWebDataServices()) { return; }
98  const CAirportList airports = sGui->getWebDataServices()->getAirports();
99  ui->le_Icao->setCompleter(new QCompleter(airports.allIcaoCodes(true), ui->le_Icao));
100 
101  if (ui->le_Icao->completer()->popup())
102  {
103  ui->le_Icao->completer()->popup()->setObjectName("AirportSmallCompleter.ICAO");
104  ui->le_Icao->completer()->popup()->setMinimumWidth(75);
105  ui->le_Icao->completer()->setCaseSensitivity(Qt::CaseInsensitive);
106  }
107 
108  // turn into airport when it was not possible before
109  if (m_current.isNull())
110  {
111  const QString icao = this->getIcaoText();
112  if (CAirportIcaoCode::isValidIcaoDesignator(icao, true))
113  {
115  if (!airport.isNull()) { this->setAirport(airport); }
116  }
117  }
118  }
119 
120  void CAirportSmallCompleter::showAirportsDialog()
121  {
122  if (!m_airportsDialog)
123  {
124  m_airportsDialog.reset(new CAirportDialog(this));
125  m_airportsDialog->setModal(true);
126  }
127  m_airportsDialog->setAirport(this->getAirport());
128  const int rv = m_airportsDialog->exec();
129  if (rv != QDialog::Accepted) { return; }
130 
131  const CAirport airport = m_airportsDialog->getAirport();
132  if (airport.isNull()) { return; }
133  this->setAirport(airport);
134  }
135 } // namespace swift::gui::components
bool hasWebDataServices() const
Web data services available?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::aviation::CAirport getAirportForIcaoDesignator(const QString &icao) const
Get airport for ICAO designator.
swift::misc::aviation::CAirportList getAirports() const
Get airports.
Smaller version of CAirportCompleter, using a CAirportDialog.
void setAirportIcaoCode(const swift::misc::aviation::CAirportIcaoCode &airportCode)
Set airport.
const swift::misc::aviation::CAirport & getAirport() const
Get airport.
QString getIcaoText() const
The raw ICAO code text.
void clearIfInvalidCode(bool strictValidation)
Clear if code not valid.
swift::misc::aviation::CAirportIcaoCode getAirportIcaoCode() const
Get airport ICAO code.
void setAirport(const swift::misc::aviation::CAirport &airport)
Set airport.
void changedAirport(const swift::misc::aviation::CAirport &airport)
Airport has been changed.
Value object encapsulating information about an airpot.
Definition: airport.h:36
virtual bool isNull() const
NULL airport?
Definition: airport.cpp:60
bool hasValidIcaoCode() const
Valid ICAO code.
Definition: airport.h:132
const CAirportIcaoCode & getIcao() const
Get ICAO code.
Definition: airport.h:64
const QString & getIcaoAsString() const
Get ICAO code as string.
Definition: airport.h:67
Value object encapsulating information of airport ICAO data.
bool hasValidIcaoCode(bool strict) const
Has valid code?
const QString & asString() const
Get code.
Value object for a list of airports.
Definition: airportlist.h:29
QStringList allIcaoCodes(bool sorted) const
All ICAO codes.
Definition: airportlist.cpp:63
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
High level reusable GUI components.
Definition: aboutdialog.cpp:13