swift
airportcompleter.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 
4 #include "airportcompleter.h"
5 
6 #include <QCompleter>
7 
8 #include "ui_airportcompleter.h"
9 
10 #include "core/webdataservices.h"
11 #include "gui/guiapplication.h"
12 #include "gui/uppercasevalidator.h"
14 
15 using namespace swift::core;
16 using namespace swift::misc::aviation;
17 
18 namespace swift::gui::components
19 {
20  CAirportCompleter::CAirportCompleter(QWidget *parent) : QFrame(parent), ui(new Ui::CAirportCompleter)
21  {
22  ui->setupUi(this);
23  ui->le_Icao->setValidator(new CUpperCaseValidator(ui->le_Icao));
24 
25  connect(sGui->getWebDataServices(), &CWebDataServices::swiftDbAllDataRead, this,
26  &CAirportCompleter::onAirportsChanged);
27  connect(ui->le_Icao, &QLineEdit::editingFinished, this, &CAirportCompleter::onIcaoChanged);
28  connect(ui->le_Name, &QLineEdit::editingFinished, this, &CAirportCompleter::onNameChanged);
29  connect(ui->le_Location, &QLineEdit::editingFinished, this, &CAirportCompleter::onLocationChanged);
30  this->onAirportsChanged();
31  }
32 
34 
36  {
37  if (m_current == airport) { return; }
38  m_current = airport;
39  if (airport.getIcaoAsString() != ui->le_Icao->text()) { ui->le_Icao->setText(airport.getIcaoAsString()); }
40  if (airport.getDescriptiveName() != ui->le_Name->text()) { ui->le_Name->setText(airport.getDescriptiveName()); }
41  if (airport.getLocation() != ui->le_Location->text()) { ui->le_Location->setText(airport.getLocation()); }
42  emit this->changedAirport(m_current);
43  }
44 
45  QString CAirportCompleter::getIcaoText() const { return ui->le_Icao->text().trimmed().toUpper(); }
46 
47  void CAirportCompleter::setReadOnly(bool readOnly)
48  {
49  ui->le_Icao->setReadOnly(readOnly);
50  ui->le_Location->setReadOnly(readOnly);
51  ui->le_Name->setReadOnly(readOnly);
52  }
53 
55  {
56  m_current = CAirport();
57  ui->le_Icao->clear();
58  ui->le_Location->clear();
59  ui->le_Name->clear();
60  }
61 
62  void CAirportCompleter::onIcaoChanged()
63  {
64  const QString icao(this->getIcaoText());
65  if (m_current.getIcaoAsString() == icao) { return; }
67  this->setAirport(airport);
68  }
69 
70  void CAirportCompleter::onNameChanged()
71  {
72  const QString name(ui->le_Name->text());
73  if (m_current.getDescriptiveName() == name) { return; }
75  this->setAirport(airport);
76  }
77 
78  void CAirportCompleter::onLocationChanged()
79  {
80  const QString location(ui->le_Location->text());
81  if (m_current.getLocation() == location) { return; }
82  const CAirport airport(sGui->getWebDataServices()->getAirportForNameOrLocation(location));
83  this->setAirport(airport);
84  }
85 
86  void CAirportCompleter::onAirportsChanged()
87  {
88  if (!sGui || !sGui->hasWebDataServices()) { return; }
89  const CAirportList airports = sGui->getWebDataServices()->getAirports();
90  ui->le_Icao->setCompleter(new QCompleter(airports.allIcaoCodes(true), ui->le_Icao));
91  ui->le_Name->setCompleter(new QCompleter(airports.allDescriptivesNames(true), ui->le_Name));
92  ui->le_Location->setCompleter(
93  new QCompleter(airports.allLocationsPlusOptionalDescription(true), ui->le_Location));
94 
95  if (ui->le_Icao->completer()->popup())
96  {
97  ui->le_Icao->completer()->setCaseSensitivity(Qt::CaseInsensitive);
98  ui->le_Icao->completer()->popup()->setObjectName("AirportCompleter.Icao");
99  const int w5chars =
100  ui->le_Icao->completer()->popup()->fontMetrics().size(Qt::TextSingleLine, "FooBa").width();
101  ui->le_Icao->completer()->popup()->setMinimumWidth(w5chars * 5);
102  }
103  if (ui->le_Name->completer()->popup())
104  {
105  ui->le_Name->completer()->setCaseSensitivity(Qt::CaseInsensitive);
106  ui->le_Name->completer()->popup()->setObjectName("AirportCompleter.Name");
107  const int w5chars =
108  ui->le_Name->completer()->popup()->fontMetrics().size(Qt::TextSingleLine, "FooBa").width();
109  ui->le_Name->completer()->popup()->setMinimumWidth(w5chars * 10);
110  }
111  if (ui->le_Location->completer()->popup())
112  {
113  ui->le_Location->completer()->setCaseSensitivity(Qt::CaseInsensitive);
114  ui->le_Location->completer()->popup()->setObjectName("AirportCompleter.Location");
115  const int w5chars =
116  ui->le_Location->completer()->popup()->fontMetrics().size(Qt::TextSingleLine, "FooBa").width();
117  ui->le_Location->completer()->popup()->setMinimumWidth(w5chars * 10);
118  }
119 
120  // turn into airport when it was not possible before
121  if (m_current.isNull())
122  {
123  const QString icao = this->getIcaoText();
124  if (CAirportIcaoCode::isValidIcaoDesignator(icao, true))
125  {
127  if (!airport.isNull()) { this->setAirport(airport); }
128  }
129  }
130  }
131 } // 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.
swift::misc::aviation::CAirport getAirportForNameOrLocation(const QString &nameOrLocation) const
Get airport for name of location.
Airport completer, UI element so select by ICAO, name or location.
void setReadOnly(bool readOnly)
Read only.
void setAirport(const swift::misc::aviation::CAirport &airport)
Set airport.
void changedAirport(const swift::misc::aviation::CAirport &airport)
Airport has been changed.
QString getIcaoText() const
The raw ICAO code text.
Value object encapsulating information about an airpot.
Definition: airport.h:36
virtual bool isNull() const
NULL airport?
Definition: airport.cpp:60
const QString & getLocation() const
Get location (e.g. "London")
Definition: airport.h:73
const QString & getDescriptiveName() const
Get descriptive name.
Definition: airport.h:85
const QString & getIcaoAsString() const
Get ICAO code as string.
Definition: airport.h:67
Value object for a list of airports.
Definition: airportlist.h:29
QStringList allIcaoCodes(bool sorted) const
All ICAO codes.
Definition: airportlist.cpp:63
QStringList allDescriptivesNames(bool sorted) const
All names.
Definition: airportlist.cpp:75
QStringList allLocationsPlusOptionalDescription(bool sorted) const
All locations plus optional description.
Definition: airportlist.cpp:99
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