diff --git a/src/blackgui/atcstationcomponent.cpp b/src/blackgui/atcstationcomponent.cpp new file mode 100644 index 000000000..ba434e861 --- /dev/null +++ b/src/blackgui/atcstationcomponent.cpp @@ -0,0 +1,134 @@ +#include "blackmisc/avinformationmessage.h" +#include "atcstationcomponent.h" +#include "ui_atcstationcomponent.h" + +using namespace BlackMisc::Aviation; +using namespace BlackCore; + +namespace BlackGui +{ + + CAtcStationComponent::CAtcStationComponent(QWidget *parent) : + QTabWidget(parent), CRuntimeBasedComponent(nullptr, false), ui(new Ui::CAtcStationComponent), m_timerComponent(nullptr) + { + ui->setupUi(this); + this->m_timerComponent = new CTimerBasedComponent(SLOT(update()), this); + this->ui->tvp_AtcStationsBooked->setStationMode(CAtcStationListModel::StationsBooked); + + // Signal / Slots + bool connected = this->connect(this->ui->le_AtcStationsOnlineMetar, SIGNAL(returnPressed()), this, SLOT(getMetar())); + Q_ASSERT(connected); + connected = this->connect(this->ui->pb_AtcStationsLoadMetar, SIGNAL(clicked()), this, SLOT(getMetar())); + Q_ASSERT(connected); + this->connect(this, &QTabWidget::currentChanged, this, &CAtcStationComponent::atcStationsTabChanged); + this->connect(this->ui->pb_ReloadAtcStationsBooked, &QPushButton::clicked, this, &CAtcStationComponent::reloadAtcStationsBooked); + this->connect(this->ui->tvp_AtcStationsOnline, &QTableView::clicked, this, &CAtcStationComponent::onlineAtcStationSelected); + this->connect(this->ui->pb_AtcStationsAtisReload, &QPushButton::clicked, this, &CAtcStationComponent::requestAtis); + } + + CAtcStationComponent::~CAtcStationComponent() + { + delete ui; + } + + void CAtcStationComponent::runtimeHasBeenSet() + { + Q_ASSERT(this->getRuntime()); + Q_ASSERT(this->getIContextNetwork()); + this->connect(this->getIContextNetwork(), &IContextNetwork::changedAtcStationsOnline, this, &CAtcStationComponent::changedAtcStationsOnline); + this->connect(this->getIContextNetwork(), &IContextNetwork::changedAtcStationsBooked, this, &CAtcStationComponent::changedAtcStationsBooked); + } + + void CAtcStationComponent::update() + { + Q_ASSERT(this->ui->tvp_AtcStationsBooked); + Q_ASSERT(this->ui->tvp_AtcStationsOnline); + Q_ASSERT(this->getIContextNetwork()); + + if (this->getIContextNetwork()->isConnected()) + { + // initial read for bookings + if (this->ui->tvp_AtcStationsBooked->isEmpty()) this->reloadAtcStationsBooked(); + + // update + if (this->m_timestampOnlineStationsChanged.isNull() || this->m_timestampLastReadOnlineStations.isNull() || + (this->m_timestampOnlineStationsChanged > this->m_timestampLastReadOnlineStations)) + { + this->ui->tvp_AtcStationsOnline->update(this->getIContextNetwork()->getAtcStationsOnline()); + this->m_timestampLastReadOnlineStations = QDateTime::currentDateTimeUtc(); + this->m_timestampOnlineStationsChanged = this->m_timestampLastReadOnlineStations; + } + } + else + { + this->ui->le_AtcStationsOnlineMetar->clear(); + } + } + + void CAtcStationComponent::reloadAtcStationsBooked() + { + Q_ASSERT(this->ui->tvp_AtcStationsBooked); + Q_ASSERT(this->getIContextNetwork()); + + if (this->getIContextNetwork()->isConnected()) + { + this->ui->tvp_AtcStationsBooked->update(this->getIContextNetwork()->getAtcStationsBooked()); + this->m_timestampLastReadBookedStations = QDateTime::currentDateTimeUtc(); + } + } + + void CAtcStationComponent::changedAtcStationsOnline() + { + this->m_timestampOnlineStationsChanged = QDateTime::currentDateTimeUtc(); + } + + void CAtcStationComponent::changedAtcStationsBooked() + { + this->reloadAtcStationsBooked(); + } + + void CAtcStationComponent::getMetar(const QString &airportIcaoCode) + { + if (!this->getIContextNetwork()->isConnected()) return; + QString icao = airportIcaoCode.isEmpty() ? this->ui->le_AtcStationsOnlineMetar->text().trimmed().toUpper() : airportIcaoCode.trimmed().toUpper(); + this->ui->le_AtcStationsOnlineMetar->setText(icao); + if (icao.length() != 4) return; + CInformationMessage metar = this->getIContextNetwork()->getMetar(icao); + if (metar.getType() != CInformationMessage::METAR) return; + if (metar.isEmpty()) return; + this->ui->te_AtcStationsOnlineInfo->setText(metar.getMessage()); + } + + void CAtcStationComponent::onlineAtcStationSelected(QModelIndex index) + { + this->ui->te_AtcStationsOnlineInfo->setText(""); // reset + const CAtcStation stationClicked = this->ui->tvp_AtcStationsOnline->derivedModel()->at(index); + QString infoMessage; + + if (stationClicked.hasAtis()) + { + infoMessage.append(stationClicked.getAtis().getMessage()); + } + if (stationClicked.hasMetar()) + { + if (!infoMessage.isEmpty()) infoMessage.append("\n\n"); + infoMessage.append(stationClicked.getMetar().getMessage()); + } + this->ui->te_AtcStationsOnlineInfo->setText(infoMessage); + } + + void CAtcStationComponent::atcStationsTabChanged() + { + if (this->currentWidget() == this->ui->tb_AtcStationsOnline) + { + if (this->m_timestampLastReadBookedStations.isNull()) + this->reloadAtcStationsBooked(); + } + } + + void CAtcStationComponent::requestAtis() + { + if (!this->getIContextNetwork()->isConnected()) return; + this->getIContextNetwork()->requestAtisUpdates(); + } +} diff --git a/src/blackgui/atcstationcomponent.h b/src/blackgui/atcstationcomponent.h new file mode 100644 index 000000000..d9d646684 --- /dev/null +++ b/src/blackgui/atcstationcomponent.h @@ -0,0 +1,78 @@ +#ifndef BLACKGUI_ATCSTATIONCOMPONENT_H +#define BLACKGUI_ATCSTATIONCOMPONENT_H + +#include "blackgui/runtimebasedcomponent.h" +#include "blackgui/timerbasedcomponent.h" +#include +#include + +namespace Ui { class CAtcStationComponent; } + +namespace BlackGui +{ + /*! + * \brief ATC stations component + */ + class CAtcStationComponent : public QTabWidget, public CRuntimeBasedComponent + { + Q_OBJECT + + public: + //! Constructor + explicit CAtcStationComponent(QWidget *parent = nullptr); + + //! Destructor + ~CAtcStationComponent(); + + //! Timer for updating + CTimerBasedComponent *getTimerComponent() { return this->m_timerComponent; } + + protected: + //! \copydoc CRuntimeBasedComponent::runtimeHasBeenSet + void runtimeHasBeenSet() override; + + public slots: + //! Update users + void update(); + + //! \copydoc CTimerBasedComponent::setUpdateIntervalSeconds + void setUpdateIntervalSeconds(int seconds) { Q_ASSERT(this->m_timerComponent); this->m_timerComponent->setUpdateIntervalSeconds(seconds); } + + //! \copydoc CTimerBasedComponent::setUpdateInterval + void setUpdateInterval(int milliSeconds) { Q_ASSERT(this->m_timerComponent); this->m_timerComponent->setUpdateInterval(milliSeconds); } + + //! \copydoc CTimerBasedComponent::stopTimer + void stopTimer() { Q_ASSERT(this->m_timerComponent); this->m_timerComponent->stopTimer(); } + + //! Get METAR for given ICAO airport code + void getMetar(const QString &airportIcaoCode = ""); + + private slots: + + //! Request new ATIS + void requestAtis(); + + //! Online ATC station selected + void onlineAtcStationSelected(QModelIndex index); + + //! Tab changed + void atcStationsTabChanged(); + + //! Booked stations + void reloadAtcStationsBooked(); + + //! Booked stations changed + void changedAtcStationsBooked(); + + //! Online stations changed + void changedAtcStationsOnline(); + + private: + Ui::CAtcStationComponent *ui; + CTimerBasedComponent *m_timerComponent; + QDateTime m_timestampLastReadOnlineStations; + QDateTime m_timestampOnlineStationsChanged; + QDateTime m_timestampLastReadBookedStations; + }; +} +#endif // guard diff --git a/src/blackgui/atcstationcomponent.ui b/src/blackgui/atcstationcomponent.ui new file mode 100644 index 000000000..2e4d2a747 --- /dev/null +++ b/src/blackgui/atcstationcomponent.ui @@ -0,0 +1,299 @@ + + + CAtcStationComponent + + + + 0 + 0 + 400 + 501 + + + + TabWidget + + + 0 + + + + Online + + + + 3 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + true + + + false + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 110 + + + + Info (ATIS, METAR, ...) + + + + 0 + + + 0 + + + 12 + + + 0 + + + 2 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 100 + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 25 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + QLayout::SetDefaultConstraint + + + 5 + + + 0 + + + 2 + + + 0 + + + + + + 0 + 0 + + + + Load METAR + + + + + + + + 0 + 0 + + + + Reload ATIS + + + + + + + + 0 + 0 + + + + + 60 + 16777215 + + + + + + + EDDF + + + 5 + + + true + + + + + + + + + + + Booked + + + + 3 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 1 + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + true + + + true + + + false + + + + + + + Reload + + + + + + + + + BlackGui::CAtcStationView + QTableView +
blackgui/atcstationview.h
+
+
+ + +