swift
dbairlineicaoselectorbase.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 <QCompleter>
7 #include <QDragEnterEvent>
8 #include <QDragLeaveEvent>
9 #include <QDragMoveEvent>
10 #include <QDropEvent>
11 #include <QMetaType>
12 #include <QPalette>
13 #include <QPointer>
14 #include <QtGlobal>
15 
16 #include "core/webdataservices.h"
17 #include "gui/guiapplication.h"
21 #include "misc/variant.h"
22 
23 using namespace swift::gui;
24 using namespace swift::core;
25 using namespace swift::misc;
26 using namespace swift::misc::db;
27 using namespace swift::misc::network;
28 using namespace swift::misc::aviation;
29 using namespace swift::misc::network;
30 
31 namespace swift::gui::components
32 {
33  CDbAirlineIcaoSelectorBase::CDbAirlineIcaoSelectorBase(QWidget *parent) : QFrame(parent)
34  {
35  this->setAcceptDrops(true);
36  this->setAcceptedMetaTypeIds({ qMetaTypeId<CAirlineIcaoCode>(), qMetaTypeId<CAirlineIcaoCodeList>() });
37 
38  connect(sGui->getWebDataServices(), &CWebDataServices::dataRead, this, &CDbAirlineIcaoSelectorBase::onCodesRead,
39  Qt::QueuedConnection);
40 
41  // when we already have data, init completers. This can not be done directly in the
42  // constructor due to virtual functions
44  if (c > 0)
45  {
46  QPointer<CDbAirlineIcaoSelectorBase> myself(this);
47  QTimer::singleShot(500, [=]() {
48  if (!sGui || sGui->isShuttingDown()) { return; }
49  if (!myself) { return; }
50  this->onCodesRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFinished, c, {});
51  });
52  }
53  }
54 
56 
58  {
59  if (icao == m_currentIcao) { return false; }
60  if (icao.isLoadedFromDb()) { m_currentIcao = icao; }
63  return true;
64  }
65 
67  {
69  if (!icao.hasCompleteData()) { return false; }
70  this->setAirlineIcao(icao);
71  return true;
72  }
73 
75  {
76  const CAirlineIcaoCode icao(this->getAirlineIcao());
77  return icao.isLoadedFromDb() || icao.hasCompleteData();
78  }
79 
80  void CDbAirlineIcaoSelectorBase::dragEnterEvent(QDragEnterEvent *event)
81  {
82  if (!event || !acceptDrop(event->mimeData())) { return; }
83  this->setBackgroundRole(QPalette::Highlight);
84  event->acceptProposedAction();
85  }
86 
87  void CDbAirlineIcaoSelectorBase::dragMoveEvent(QDragMoveEvent *event)
88  {
89  if (!event || !acceptDrop(event->mimeData())) { return; }
90  event->acceptProposedAction();
91  }
92 
93  void CDbAirlineIcaoSelectorBase::dragLeaveEvent(QDragLeaveEvent *event)
94  {
95  if (!event) { return; }
96  event->accept();
97  }
98 
99  void CDbAirlineIcaoSelectorBase::dropEvent(QDropEvent *event)
100  {
101  if (!event || !acceptDrop(event->mimeData())) { return; }
102  const CVariant valueVariant(toCVariant(event->mimeData()));
103  if (valueVariant.isValid())
104  {
105  if (valueVariant.canConvert<CAirlineIcaoCode>())
106  {
107  const CAirlineIcaoCode icao(valueVariant.value<CAirlineIcaoCode>());
108  if (!icao.hasValidDbKey()) { return; }
109  this->setAirlineIcao(icao);
110  }
111  else if (valueVariant.canConvert<CAirlineIcaoCodeList>())
112  {
113  const CAirlineIcaoCodeList icaos(valueVariant.value<CAirlineIcaoCodeList>());
114  if (icaos.isEmpty()) { return; }
115  this->setAirlineIcao(icaos.front());
116  }
117  }
118  }
119 
120  void CDbAirlineIcaoSelectorBase::onCodesRead(CEntityFlags::Entity entity, CEntityFlags::ReadState readState,
121  int count, const QUrl &url)
122  {
123  Q_UNUSED(url)
124 
125  if (!sGui) { return; }
126  if (entity.testFlag(CEntityFlags::AirlineIcaoEntity) && CEntityFlags::isFinishedReadState(readState))
127  {
128  if (count > 0)
129  {
130  QCompleter *c = this->createCompleter();
131  Q_ASSERT_X(c, Q_FUNC_INFO, "missing converter");
132  connect(c, qOverload<const QString &>(&QCompleter::activated), this,
133  &CDbAirlineIcaoSelectorBase::onCompleterActivated);
134  m_completer.reset(c); // deletes any old completer
135  }
136  else { m_completer.reset(nullptr); }
137  }
138  }
139 
140  void CDbAirlineIcaoSelectorBase::onCompleterActivated(const QString &icaoString)
141  {
142  const int dbKey = CDatastoreUtility::extractIntegerKey(icaoString);
143  if (dbKey < 0) { return; }
144  this->setAirlineIcao(dbKey);
145  }
146 } // namespace swift::gui::components
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.
swift::misc::aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const swift::misc::aviation::CAirlineIcaoCode &code, const swift::misc::aviation::CCallsign &callsign=swift::misc::aviation::CCallsign()) const
Smart airline selector.
int getAirlineIcaoCodesCount() const
Airline ICAO codes count.
bool acceptDrop(const QMimeData *mime) const
Accept drop?
Definition: dropbase.cpp:24
swift::misc::CVariant toCVariant(const QMimeData *mime) const
Mime data to CVariant (normally encapsulating a value object)
Definition: dropbase.cpp:43
void setAcceptedMetaTypeIds(const QList< int > &ids)
Accepted ids.
Definition: dropbase.cpp:20
virtual QCompleter * createCompleter()=0
Create a new completer.
const swift::misc::aviation::CAirlineIcaoCode & getAirlineIcao() const
Airline ICAO.
virtual bool setAirlineIcao(const swift::misc::aviation::CAirlineIcaoCode &icao)
Current airline ICAO.
swift::misc::aviation::CAirlineIcaoCode m_currentIcao
current ICAO object
QScopedPointer< QCompleter > m_completer
completer used
void changedAirlineIcao(const swift::misc::aviation::CAirlineIcaoCode &icao)
ICAO was changed.
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
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
bool isValid() const
True if this variant is valid.
Definition: variant.h:252
bool canConvert(int typeId) const
True if this variant can be converted to the type with the given metatype ID.
Value object for ICAO classification.
bool hasCompleteData() const
Complete data.
Value object encapsulating a list of ICAO codes.
bool isLoadedFromDb() const
Loaded from DB.
Definition: datastore.cpp:49
bool hasValidDbKey() const
Has valid DB key.
Definition: datastore.h:102
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
GUI related classes.
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...
Definition: threadutils.h:30