6 #include <QAbstractItemModel>
10 #include <QModelIndex>
12 #include <QPushButton>
13 #include <QStandardItemModel>
14 #include <QStringBuilder>
21 #include "ui_atcstationcomponent.h"
44 using namespace swift::gui::settings;
46 using namespace swift::misc::aviation;
47 using namespace swift::misc::network;
48 using namespace swift::misc::physical_quantities;
49 using namespace swift::misc::weather;
51 using namespace swift::core::context;
55 CAtcStationComponent::CAtcStationComponent(
QWidget *parent)
59 Q_ASSERT_X(
sGui, Q_FUNC_INFO,
"Need sGui");
61 ui->tw_Atc->setCurrentIndex(0);
62 ui->tw_Atc->tabBar()->setExpanding(
false);
63 ui->tw_Atc->tabBar()->setUsesScrollButtons(
true);
65 ui->le_AtcStationsOnlineMetar->setValidator(ucv);
68 ui->tb_AtcStationsAtisReload->setIcon(CIcons::atis());
69 ui->tb_AtcStationsAtisReload->setText(
"ATIS");
71 ui->tb_AtcStationsLoadMetar->setIcon(CIcons::metar());
72 ui->tb_AtcStationsLoadMetar->setText(
"METAR");
74 ui->tb_Audio->setIcon(CIcons::appAudio16());
75 ui->tb_Audio->setText(
"Audio");
77 ui->tb_TextMessageOverlay->setIcon(CIcons::appTextMessages16());
78 ui->tb_TextMessageOverlay->setText(
"Text");
82 ui->tvp_AtcStationsOnline->setStationMode(CAtcStationListModel::StationsOnline);
83 ui->tvp_AtcStationsOnlineTree->setColumns(ui->tvp_AtcStationsOnline->getColumns());
86 ui->tvp_AtcStationsOnline->menuRemoveItems(CAtcStationView::MenuClear);
90 &CAtcStationComponent::getMetarAsEntered);
94 &CAtcStationComponent::showOverlayInlineTextMessage);
96 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::objectClicked,
this,
98 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::objectSelected,
this,
100 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::testRequestDummyAtcOnlineStations,
this,
101 &CAtcStationComponent::testCreateDummyOnlineAtcStations);
102 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::requestUpdate,
this,
103 &CAtcStationComponent::requestOnlineStationsUpdate);
104 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::requestNewBackendData,
this,
105 &CAtcStationComponent::requestOnlineStationsUpdate);
106 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::requestComFrequency,
this,
107 &CAtcStationComponent::setComFrequency);
108 connect(ui->tvp_AtcStationsOnline, &CAtcStationView::requestTextMessageWidget,
this,
111 connect(ui->tvp_AtcStationsOnlineTree, &CAtcStationTreeView::requestComFrequency,
this,
112 &CAtcStationComponent::setComFrequency);
113 connect(ui->tvp_AtcStationsOnlineTree, &CAtcStationTreeView::objectSelected,
this,
115 connect(ui->tvp_AtcStationsOnlineTree, &CAtcStationTreeView::requestTextMessageWidget,
this,
137 ui->tvp_AtcStationsOnline->acceptClickSelection(
true);
138 ui->tvp_AtcStationsOnline->acceptRowSelection(
true);
146 ui->sp_AtcSplitter->setStretchFactor(0, 3);
147 ui->sp_AtcSplitter->setStretchFactor(1, 1);
153 &CAtcStationComponent::airportsRead);
154 this->airportsRead();
158 this->settingsChanged();
165 const int t =
static_cast<int>(tab);
166 ui->tw_Atc->setCurrentIndex(t);
176 Q_ASSERT_X(c, Q_FUNC_INFO,
"failed connect");
177 Q_ASSERT_X(parentDockableWidget, Q_FUNC_INFO,
"missing parent");
178 return c && parentDockableWidget;
183 using namespace std::chrono_literals;
184 if (!this->canAccessContext()) {
return; }
185 Q_ASSERT(ui->tvp_AtcStationsOnline);
192 ui->tvp_AtcStationsOnline->hideLoadIndicator();
200 if (m_timestampOnlineStationsChanged > m_timestampLastReadOnlineStations)
203 const int stationsCount = onlineStations.
sizeInt();
204 ui->tvp_AtcStationsOnline->updateContainerMaybeAsync(onlineStations);
206 m_timestampOnlineStationsChanged = m_timestampLastReadOnlineStations;
207 this->updateTreeView();
208 this->setOnlineTabs(stationsCount);
210 if (stationsCount < 1) { m_selectedCallsign.clear(); }
211 else if (!m_selectedCallsign.isEmpty() && onlineStations.
containsCallsign(m_selectedCallsign))
217 const CCallsign currentCs(ui->le_AtcStationsOnlineMetar->text());
220 this->triggerOnlineAtcStationSelected(lastSelected);
228 m_selectedCallsign.clear();
229 ui->tvp_AtcStationsOnline->clear();
230 this->updateTreeView();
231 this->setOnlineTabs(0);
235 void CAtcStationComponent::atcStationDisconnected(
const CAtcStation &station)
238 ui->tvp_AtcStationsOnline->changedAtcStationConnectionStatus(station,
false);
241 void CAtcStationComponent::getMetarAsEntered() { this->
getMetar(
""); }
245 if (!this->canAccessContext()) {
return; }
247 ui->le_AtcStationsOnlineMetar->text().trimmed().toUpper() :
249 ui->le_AtcStationsOnlineMetar->setText(icao.
asString());
255 ui->te_AtcStationsOnlineInfo->setText(metarText);
257 else { ui->te_AtcStationsOnlineInfo->clear(); }
260 void CAtcStationComponent::changedAtcStationsOnline()
272 ui->tvp_AtcStationsOnline->clear();
273 this->updateTreeView();
274 m_updateTimer.
start();
278 m_updateTimer.
stop();
279 this->clearOnlineViews();
284 void CAtcStationComponent::testCreateDummyOnlineAtcStations(
int number)
290 void CAtcStationComponent::requestOnlineStationsUpdate()
296 void CAtcStationComponent::infoAreaTabBarChanged(
int index)
311 void CAtcStationComponent::setOnlineTabs(
int count)
313 const int io = ui->tw_Atc->indexOf(ui->tb_AtcStationsOnline);
314 const int it = ui->tw_Atc->indexOf(ui->tb_AtcStationsOnlineTree);
315 static const QString o = ui->tw_Atc->tabBar()->tabText(io);
316 static const QString t = ui->tw_Atc->tabBar()->tabText(it);
317 const QString info = QStringLiteral(
" (%1)").
arg(count);
318 ui->tw_Atc->tabBar()->setTabText(io, o % info);
319 ui->tw_Atc->tabBar()->setTabText(it, t % info);
325 if (unit != CComSystem::Com1 && unit != CComSystem::Com2) {
return; }
326 if (!CComSystem::isValidComFrequency(frequency)) {
return; }
331 void CAtcStationComponent::settingsChanged()
333 if (!this->canAccessContext()) {
return; }
341 m_updateTimer.
start(ms);
344 else { m_updateTimer.
stop(); }
347 void CAtcStationComponent::airportsRead() { this->initCompleters(); }
349 void CAtcStationComponent::updateTreeView()
351 ui->tvp_AtcStationsOnlineTree->updateContainer(ui->tvp_AtcStationsOnline->container());
352 ui->tvp_AtcStationsOnlineTree->fullResizeToContents();
355 void CAtcStationComponent::initCompleters()
361 auto *airportCompleter =
new QCompleter(airports,
this);
362 const int w5chars = airportCompleter->popup()->fontMetrics().size(
Qt::TextSingleLine,
"FooBa").width();
363 airportCompleter->popup()->setMinimumWidth(w5chars * 5);
364 ui->le_AtcStationsOnlineMetar->setCompleter(airportCompleter);
368 void CAtcStationComponent::onOnlineAtcStationVariantSelected(
const CVariant &
object)
370 ui->te_AtcStationsOnlineInfo->setText(
"");
371 if (!
object.isValid() || !
object.canConvert<CAtcStation>()) {
return; }
373 this->onOnlineAtcStationSelected(station);
376 void CAtcStationComponent::triggerOnlineAtcStationSelected(
const CAtcStation &station)
381 if (myself) { myself->onOnlineAtcStationSelected(station); }
385 void CAtcStationComponent::onOnlineAtcStationSelected(
const CAtcStation &station)
393 ui->te_AtcStationsOnlineInfo->setText(infoMessage);
398 void CAtcStationComponent::requestAtisUpdates()
400 using namespace std::chrono_literals;
402 if (!this->canAccessContext()) {
return; }
404 if (ui->tw_Atc->currentIndex() == TabAtcOnline)
406 ui->tvp_AtcStationsOnline->showOverlayHTMLMessage(
"Requested ATIS update", 5s);
408 else { ui->tvp_AtcStationsOnlineTree->showOverlayHTMLMessage(
"Requested ATIS update", 5s); }
411 bool CAtcStationComponent::canAccessContext()
const
416 void CAtcStationComponent::clearOnlineViews()
418 ui->tvp_AtcStationsOnline->clear();
419 ui->tvp_AtcStationsOnlineTree->clear();
420 m_selectedCallsign.
clear();
423 void CAtcStationComponent::showOverlayInlineTextMessage()
429 void CAtcStationComponent::onDetailsToggled(
bool checked)
436 if (!m_splitterSizes.
isEmpty()) { ui->sp_AtcSplitter->setSizes(m_splitterSizes); }
440 m_splitterSizes = ui->sp_AtcSplitter->sizes();
441 if (m_splitterSizes.
size() > 1)
445 ui->sp_AtcSplitter->getRange(1, &min, &max);
449 ui->sp_AtcSplitter->setSizes(newSizes);
454 ui->te_AtcStationsOnlineInfo->setVisible(checked);
455 ui->le_AtcStationsOnlineMetar->setVisible(checked);
456 ui->tb_AtcStationsAtisReload->setVisible(checked);
457 ui->tb_AtcStationsLoadMetar->setVisible(checked);
458 ui->tb_TextMessageOverlay->setVisible(checked);
459 ui->tb_Audio->setVisible(checked);
464 auto *
layout = qobject_cast<QVBoxLayout *>(this->
layout());
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
const context::IContextOwnAircraft * getIContextOwnAircraft() const
Direct access to contexts if a CCoreFacade has been initialized.
bool hasWebDataServices() const
Web data services available?
const context::IContextNetwork * getIContextNetwork() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::aviation::CAirportList getAirports() const
Get airports.
virtual void testCreateDummyOnlineAtcStations(int number)=0
Create dummy ATC stations for performance tests etc.
virtual void requestAtisUpdates()=0
Request ATIS updates (for all stations)
virtual swift::misc::weather::CMetar getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &airportIcaoCode) const =0
Get METAR, if not available request it (code such as EDDF, KLAX)
virtual swift::misc::aviation::CAtcStationList getAtcStationsOnline(bool recalculateDistance) const =0
The ATC list with online ATC controllers.
virtual bool isConnected() const =0
Network connected?
virtual bool updateActiveComFrequency(const swift::misc::physical_quantities::CFrequency &frequency, swift::misc::aviation::CComSystem::ComUnit comUnit, const swift::misc::CIdentifier &originator)=0
Tune in a COM frequency (active)
virtual bool updateStandbyComFrequency(const swift::misc::physical_quantities::CFrequency &frequency, swift::misc::aviation::CComSystem::ComUnit comUnit, const swift::misc::CIdentifier &originator)=0
Tune in a COM frequency (standby)
void changedInfoAreaTabBarIndex(int index)
Tab bar changed.
void requestTextMessageWidget(const swift::misc::aviation::CCallsign &callsign)
Request a text message widget.
void requestTextMessageEntryTab(components::TextMessageTab tab)
Request an text message entry.
int countOnlineStations() const
Number of online stations.
void getMetar(const QString &airportIcaoCode)
Get METAR for given ICAO airport code.
~CAtcStationComponent()
Destructor.
bool setParentDockWidgetInfoArea(swift::gui::CDockWidgetInfoArea *parentDockableWidget)
Corresponding dockable widget in info area.
void setTab(AtcTab tab)
Set tab.
void update()
Update stations.
void requestAudioWidget()
Request audio widget.
Settings about view update rates.
const swift::misc::physical_quantities::CTime & getAtcUpdateTime() const
Get time.
T get() const
Get a copy of the current value.
Base class with a member CIdentifier to be inherited by a class which has an identity in the environm...
const CIdentifier & identifier() const
Get identifier.
int sizeInt() const
Avoid compiler warnings when using with int.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Value object encapsulating information of airport ICAO data.
bool hasValidIcaoCode(bool strict) const
Has valid code?
const QString & asString() const
Get code.
QStringList allIcaoCodes(bool sorted) const
All ICAO codes.
Value object encapsulating information about an ATC station.
const CCallsign & getCallsign() const
Get callsign.
bool hasAtis() const
Has ATIS?
const CInformationMessage & getMetar() const
Get METAR.
QString getCallsignAsString() const
Get callsign as string.
const CInformationMessage & getAtis() const
Get ATIS.
const physical_quantities::CFrequency & getFrequency() const
Get frequency.
bool hasMetar() const
Has METAR?
bool hasCallsign() const
Has callsign?
Value object for a list of ATC stations.
Value object encapsulating information of a callsign.
void clear()
Clear this callsign.
const QString & asString() const
Get callsign (normalized)
bool isEmpty() const
Is empty?
OBJ findFirstByCallsign(const CCallsign &callsign, const OBJ &ifNotFound={}) const
Find the first aircraft by callsign, if none return given one.
bool containsCallsign(const CCallsign &callsign) const
Contains callsign?
Value object encapsulating information about a connection status.
bool isConnected() const
Query status.
bool isDisconnected() const
Query status.
QString valueRoundedWithUnit(const MU &unit, int digits=-1, bool withGroupSeparator=false, bool i18n=false) const
Value to QString with the given unit, e.g. "5.00m".
int toMs() const
Convenience functions when used with timers etc.
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.
High level reusable GUI components.
Models to be used with views, mainly QTableView.
Views, mainly QTableView.
Free functions in swift::misc.
QDateTime currentDateTimeUtc()
void setMSecsSinceEpoch(qint64 msecs)
bool isEmpty() const const
void push_back(QList< T >::parameter_type value)
qsizetype size() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QString arg(Args &&... args) const const
bool isEmpty() const const
QString toUpper() const const
QString trimmed() const const
void setInterval(int msec)