swift
remoteaircraftselector.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 <QComboBox>
7 #include <QString>
8 #include <QStringBuilder>
9 #include <QStringList>
10 #include <QWidget>
11 #include <QtGlobal>
12 
13 #include "ui_remoteaircraftselector.h"
14 
16 #include "gui/guiapplication.h"
18 #include "misc/sequence.h"
20 
21 using namespace swift::misc;
22 using namespace swift::misc::aviation;
23 using namespace swift::misc::simulation;
24 using namespace swift::core;
25 using namespace swift::core::context;
26 
27 namespace swift::gui::components
28 {
29  CRemoteAircraftSelector::CRemoteAircraftSelector(QWidget *parent)
30  : QFrame(parent), ui(new Ui::CRemoteAircraftSelector)
31  {
32  ui->setupUi(this);
33  bool s = connect(sGui->getIContextNetwork(), &IContextNetwork::removedAircraft, this,
34  &CRemoteAircraftSelector::onRemovedAircraft, Qt::QueuedConnection);
35  Q_ASSERT(s);
36  s = connect(sGui->getIContextNetwork(), &IContextNetwork::addedAircraft, this,
37  &CRemoteAircraftSelector::onAddedAircraft, Qt::QueuedConnection);
38  Q_ASSERT(s);
39  s = connect(ui->cb_RemoteAircraftSelector, &QComboBox::currentTextChanged, this,
40  &CRemoteAircraftSelector::comboBoxChanged);
41  Q_UNUSED(s);
42  }
43 
45 
47  {
48  static const CCallsign empty {};
49  const int index = ui->cb_RemoteAircraftSelector->currentIndex();
50  if (index < 0 || index > m_aircraft.size()) { return empty; }
51  return m_aircraft[index].getCallsign();
52  }
53 
54  void CRemoteAircraftSelector::indicatePartsEnabled(bool indicate) { m_showPartsEnabled = indicate; }
55 
56  void CRemoteAircraftSelector::showEvent(QShowEvent *event)
57  {
58  // force new combobox when visible
59  m_dsFillComboBox.inputSignal(); // fill combo box
60  QWidget::showEvent(event);
61  }
62 
63  void CRemoteAircraftSelector::onAddedAircraft(const CSimulatedAircraft &aircraft)
64  {
65  CCallsign cs(aircraft.getCallsign());
66  if (cs.isEmpty()) { return; }
67  if (m_aircraft.containsCallsign(cs)) { return; }
68  m_dsFillComboBox.inputSignal(); // fill combo box
69  }
70 
71  void CRemoteAircraftSelector::onRemovedAircraft(const CCallsign &callsign)
72  {
73  if (callsign.isEmpty()) { return; }
74  if (m_aircraft.containsCallsign(callsign))
75  {
76  m_dsFillComboBox.inputSignal(); // fill combo box
77  }
78  }
79 
80  void CRemoteAircraftSelector::comboBoxChanged(const QString &text)
81  {
82  if (m_currentText == text) { return; }
83  m_currentText = text;
84  emit this->changedCallsign();
85  }
86 
87  void CRemoteAircraftSelector::fillComboBox()
88  {
89  if (!this->isVisible()) { return; } // for performance reasons
90  if (!sGui || sGui->isShuttingDown()) { return; }
91 
92  const CCallsign currentSelection(this->getSelectedCallsign());
94  ui->cb_RemoteAircraftSelector->clear();
95  if (m_aircraft.isEmpty()) { return; }
96 
97  QStringList items;
98  for (const CSimulatedAircraft &aircraft : m_aircraft)
99  {
100  if (aircraft.getCallsign().isEmpty()) { continue; }
101  QString i(aircraft.getCallsign().toQString());
102  if (aircraft.hasAircraftDesignator())
103  {
104  i += u" (" % aircraft.getAircraftIcaoCode().toQString(false) % u')';
105  }
106  if (aircraft.hasRealName()) { i += u" - " % aircraft.getPilotRealName(); }
107  if (m_showPartsEnabled)
108  {
109  if (aircraft.isPartsSynchronized()) { i += QStringLiteral(" [parts]"); }
110  }
111  items.append(i);
112  }
113 
114  // new combobox
115  ui->cb_RemoteAircraftSelector->addItems(items);
116 
117  // set old selection if possible
118  if (currentSelection.isEmpty()) { return; }
119  int index = m_aircraft.firstIndexOfCallsign(currentSelection);
120  if (index >= 0 && index < ui->cb_RemoteAircraftSelector->count())
121  {
122  ui->cb_RemoteAircraftSelector->setCurrentIndex(index);
123  }
124  }
125 } // namespace swift::gui::components
const context::IContextNetwork * getIContextNetwork() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
virtual swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const =0
Aircraft list.
swift::misc::aviation::CCallsign getSelectedCallsign() const
Selected callsign.
void indicatePartsEnabled(bool indicate)
Indicate if aircraft parts enabled aircraft.
void inputSignal()
Received input signal, or manually trigger.
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Value object encapsulating information of a callsign.
Definition: callsign.h:30
bool isEmpty() const
Is empty?
Definition: callsign.h:63
CONTAINER sortedByCallsign() const
Copy of list sorted by callsign.
bool containsCallsign(const CCallsign &callsign) const
Contains callsign?
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Comprehensive information of an aircraft.
bool hasRealName() const
Has valid realname?
bool isPartsSynchronized() const
Have parts been synchronized with a remote client?
QString getPilotRealName() const
Get user's real name.
const aviation::CCallsign & getCallsign() const
Get callsign.
bool hasAircraftDesignator() const
Valid designator?
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Get aircraft ICAO info.
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
Free functions in swift::misc.