From 1d1815de4331abe4e167d50bad11dd4f692c519e Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 28 Aug 2016 23:26:11 +0200 Subject: [PATCH] refs #748, add airport completers * in flight plan * in login * utility functions --- src/blackcore/webdataservices.cpp | 6 + src/blackcore/webdataservices.h | 9 +- .../components/flightplancomponent.cpp | 168 +++++++-------- src/blackgui/components/logincomponent.cpp | 196 ++++++++++-------- src/blackgui/components/logincomponent.h | 1 + src/blackmisc/aviation/airport.h | 4 +- src/blackmisc/aviation/airportlist.cpp | 22 +- src/blackmisc/aviation/airportlist.h | 4 +- 8 files changed, 226 insertions(+), 184 deletions(-) diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 9d3058fda..be248bd17 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -509,6 +509,12 @@ namespace BlackCore return CCountry(); } + CAirportList CWebDataServices::getAirports() const + { + if (m_airportDataReader) { return m_airportDataReader->getAirports(); } + return CAirportList(); + } + CCountry CWebDataServices::getCountryForIsoCode(const QString &iso) const { if (m_icaoDataReader) { return m_icaoDataReader->getCountryForIsoCode(iso); } diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index 99c00f835..dc7669d04 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -45,7 +45,6 @@ #include #include - namespace BlackMisc { class CLogCategoryList; @@ -58,7 +57,7 @@ namespace BlackMisc namespace BlackCore { class CApplication; - + class CAirportDataReader; namespace Vatsim { class CVatsimBookingReader; @@ -76,8 +75,6 @@ namespace BlackCore class CInfoDataReader; } - class CAirportDataReader; - /*! * Encapsulates reading data from web sources */ @@ -281,6 +278,10 @@ namespace BlackCore //! \threadsafe BlackMisc::CCountry getCountryForName(const QString &name) const; + //! Get airports + //! \\threadsafe + BlackMisc::Aviation::CAirportList getAirports() const; + //! Get METARs //! \threadsafe BlackMisc::Weather::CMetarList getMetars() const; diff --git a/src/blackgui/components/flightplancomponent.cpp b/src/blackgui/components/flightplancomponent.cpp index 1018e512d..b4c0f62b0 100644 --- a/src/blackgui/components/flightplancomponent.cpp +++ b/src/blackgui/components/flightplancomponent.cpp @@ -15,7 +15,7 @@ #include "blackgui/components/selcalcodeselector.h" #include "blackgui/guiapplication.h" #include "blackmisc/aviation/aircrafticaocode.h" -#include "blackmisc/aviation/airporticaocode.h" +#include "blackmisc/aviation/airportlist.h" #include "blackmisc/aviation/altitude.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/logcategory.h" @@ -76,33 +76,33 @@ namespace BlackGui ui->le_OriginAirport->setValidator(ucv); // connect - connect(this->ui->pb_Send, &QPushButton::pressed, this, &CFlightPlanComponent::ps_sendFlightPlan); - connect(this->ui->pb_Load, &QPushButton::pressed, this, &CFlightPlanComponent::ps_loadFlightPlanFromNetwork); - connect(this->ui->pb_Reset, &QPushButton::pressed, this, &CFlightPlanComponent::ps_resetFlightPlan); - connect(this->ui->pb_ValidateFlightPlan, &QPushButton::pressed, this, &CFlightPlanComponent::ps_validateFlightPlan); + connect(ui->pb_Send, &QPushButton::pressed, this, &CFlightPlanComponent::ps_sendFlightPlan); + connect(ui->pb_Load, &QPushButton::pressed, this, &CFlightPlanComponent::ps_loadFlightPlanFromNetwork); + connect(ui->pb_Reset, &QPushButton::pressed, this, &CFlightPlanComponent::ps_resetFlightPlan); + connect(ui->pb_ValidateFlightPlan, &QPushButton::pressed, this, &CFlightPlanComponent::ps_validateFlightPlan); - connect(this->ui->cb_VoiceCapabilities, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); - connect(this->ui->cb_NavigationEquipment, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); - connect(this->ui->cb_PerformanceCategory, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); - connect(this->ui->cb_PilotRating, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); - connect(this->ui->cb_RequiredNavigationPerformance, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); + connect(ui->cb_VoiceCapabilities, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); + connect(ui->cb_NavigationEquipment, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); + connect(ui->cb_PerformanceCategory, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); + connect(ui->cb_PilotRating, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); + connect(ui->cb_RequiredNavigationPerformance, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); - connect(this->ui->pb_LoadDisk, &QPushButton::clicked, this, &CFlightPlanComponent::ps_loadFromDisk); - connect(this->ui->pb_SaveDisk, &QPushButton::clicked, this, &CFlightPlanComponent::ps_saveToDisk); + connect(ui->pb_LoadDisk, &QPushButton::clicked, this, &CFlightPlanComponent::ps_loadFromDisk); + connect(ui->pb_SaveDisk, &QPushButton::clicked, this, &CFlightPlanComponent::ps_saveToDisk); - bool c = connect(this->ui->le_AircraftRegistration, SIGNAL(textChanged(QString)), this, SLOT(ps_buildRemarksString())); + bool c = connect(ui->le_AircraftRegistration, SIGNAL(textChanged(QString)), this, SLOT(ps_buildRemarksString())); Q_ASSERT_X(c, Q_FUNC_INFO, "failed connect"); - c = connect(this->ui->cb_NoSidsStarts, SIGNAL(toggled(bool)), this, SLOT(ps_buildRemarksString())); + c = connect(ui->cb_NoSidsStarts, SIGNAL(toggled(bool)), this, SLOT(ps_buildRemarksString())); Q_ASSERT_X(c, Q_FUNC_INFO, "failed connect"); - c = connect(this->ui->le_AirlineOperator, SIGNAL(textChanged(QString)), this, SLOT(ps_buildRemarksString())); + c = connect(ui->le_AirlineOperator, SIGNAL(textChanged(QString)), this, SLOT(ps_buildRemarksString())); Q_ASSERT_X(c, Q_FUNC_INFO, "failed connect"); Q_UNUSED(c); - connect(this->ui->pte_AdditionalRemarks, &QPlainTextEdit::textChanged, this, &CFlightPlanComponent::ps_buildRemarksString); - connect(this->ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_buildRemarksString); - connect(this->ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_setSelcalInOwnAircraft); - connect(this->ui->pb_CopyOver, &QPushButton::pressed, this, &CFlightPlanComponent::ps_copyRemarks); - connect(this->ui->pb_RemarksGenerator, &QPushButton::clicked, this, &CFlightPlanComponent::ps_currentTabGenerator); + connect(ui->pte_AdditionalRemarks, &QPlainTextEdit::textChanged, this, &CFlightPlanComponent::ps_buildRemarksString); + connect(ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_buildRemarksString); + connect(ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_setSelcalInOwnAircraft); + connect(ui->pb_CopyOver, &QPushButton::pressed, this, &CFlightPlanComponent::ps_copyRemarks); + connect(ui->pb_RemarksGenerator, &QPushButton::clicked, this, &CFlightPlanComponent::ps_currentTabGenerator); // web services connect(sGui->getWebDataServices(), &CWebDataServices::allSwiftDbDataRead, this, &CFlightPlanComponent::ps_swiftDataRead); @@ -127,38 +127,38 @@ namespace BlackGui // only override with valid values if (CCallsign::isValidAircraftCallsign(ownAircraft.getCallsignAsString())) { - this->ui->le_Callsign->setText(ownAircraft.getCallsign().asString()); + ui->le_Callsign->setText(ownAircraft.getCallsign().asString()); } if (CAircraftIcaoCode::isValidDesignator(ownAircraft.getAircraftIcaoCodeDesignator())) { - this->ui->le_AircraftType->setText(ownAircraft.getAircraftIcaoCodeDesignator()); + ui->le_AircraftType->setText(ownAircraft.getAircraftIcaoCodeDesignator()); } if (ownAircraft.hasValidRealName()) { - this->ui->le_PilotsName->setText(ownAircraft.getPilot().getRealName()); + ui->le_PilotsName->setText(ownAircraft.getPilot().getRealName()); } } void CFlightPlanComponent::fillWithFlightPlanData(const BlackMisc::Aviation::CFlightPlan &flightPlan) { - this->ui->le_AlternateAirport->setText(flightPlan.getAlternateAirportIcao().asString()); - this->ui->le_DestinationAirport->setText(flightPlan.getDestinationAirportIcao().asString()); - this->ui->le_OriginAirport->setText(flightPlan.getOriginAirportIcao().asString()); - this->ui->pte_Route->setPlainText(flightPlan.getRoute()); - this->ui->pte_Remarks->setPlainText(flightPlan.getRemarks()); - this->ui->le_TakeOffTimePlanned->setText(flightPlan.getTakeoffTimePlannedHourMin()); - this->ui->le_FuelOnBoard->setText(flightPlan.getFuelTimeHourMin()); - this->ui->le_EstimatedTimeEnroute->setText(flightPlan.getEnrouteTimeHourMin()); - this->ui->le_CruiseTrueAirspeed->setText(flightPlan.getCruiseTrueAirspeed().valueRoundedWithUnit(BlackMisc::PhysicalQuantities::CSpeedUnit::kts(), 0)); + ui->le_AlternateAirport->setText(flightPlan.getAlternateAirportIcao().asString()); + ui->le_DestinationAirport->setText(flightPlan.getDestinationAirportIcao().asString()); + ui->le_OriginAirport->setText(flightPlan.getOriginAirportIcao().asString()); + ui->pte_Route->setPlainText(flightPlan.getRoute()); + ui->pte_Remarks->setPlainText(flightPlan.getRemarks()); + ui->le_TakeOffTimePlanned->setText(flightPlan.getTakeoffTimePlannedHourMin()); + ui->le_FuelOnBoard->setText(flightPlan.getFuelTimeHourMin()); + ui->le_EstimatedTimeEnroute->setText(flightPlan.getEnrouteTimeHourMin()); + ui->le_CruiseTrueAirspeed->setText(flightPlan.getCruiseTrueAirspeed().valueRoundedWithUnit(BlackMisc::PhysicalQuantities::CSpeedUnit::kts(), 0)); const CAltitude cruiseAlt = flightPlan.getCruiseAltitude(); if (cruiseAlt.isFlightLevel()) { - this->ui->le_CrusingAltitude->setText(cruiseAlt.toQString()); + ui->le_CrusingAltitude->setText(cruiseAlt.toQString()); } else { - this->ui->le_CrusingAltitude->setText(cruiseAlt.valueRoundedWithUnit(BlackMisc::PhysicalQuantities::CLengthUnit::ft(), 0)); + ui->le_CrusingAltitude->setText(cruiseAlt.valueRoundedWithUnit(BlackMisc::PhysicalQuantities::CLengthUnit::ft(), 0)); } } @@ -173,11 +173,11 @@ namespace BlackGui QString v; CFlightPlan::FlightRules rule = CFlightPlan::IFR; - if (this->ui->rb_TypeIfr->isChecked()) + if (ui->rb_TypeIfr->isChecked()) { rule = CFlightPlan::IFR; } - else if (this->ui->rb_TypeVfr->isChecked()) + else if (ui->rb_TypeVfr->isChecked()) { rule = CFlightPlan::VFR; } @@ -186,7 +186,7 @@ namespace BlackGui v = ui->le_Callsign->text().trimmed(); if (v.isEmpty()) { - messages.push_back(CLogMessage().validationWarning("Missing %1") << this->ui->lbl_Callsign->text()); + messages.push_back(CLogMessage().validationWarning("Missing %1") << ui->lbl_Callsign->text()); } v = ui->pte_Route->toPlainText().trimmed(); @@ -220,7 +220,7 @@ namespace BlackGui v = ui->le_EstimatedTimeEnroute->text(); if (v.isEmpty() || v == defaultTime()) { - messages.push_back(CLogMessage().validationWarning("Missing %1") << this->ui->lbl_EstimatedTimeEnroute->text()); + messages.push_back(CLogMessage().validationWarning("Missing %1") << ui->lbl_EstimatedTimeEnroute->text()); } else { @@ -230,7 +230,7 @@ namespace BlackGui v = ui->le_FuelOnBoard->text(); if (v.isEmpty() || v == defaultTime()) { - messages.push_back(CLogMessage().validationWarning("Missing %1") << this->ui->lbl_FuelOnBorad->text()); + messages.push_back(CLogMessage().validationWarning("Missing %1") << ui->lbl_FuelOnBorad->text()); } else { @@ -240,7 +240,7 @@ namespace BlackGui v = ui->le_TakeOffTimePlanned->text(); if (v.isEmpty() || v == defaultTime()) { - messages.push_back(CLogMessage().validationWarning("Missing %1") << this->ui->lbl_TakeOffTimePlanned->text()); + messages.push_back(CLogMessage().validationWarning("Missing %1") << ui->lbl_TakeOffTimePlanned->text()); } else { @@ -252,23 +252,23 @@ namespace BlackGui if (!v.isEmpty() && withUnit.indexIn(v) < 0) { v += "ft"; - this->ui->le_CrusingAltitude->setText(v); + ui->le_CrusingAltitude->setText(v); } CAltitude cruisingAltitude(v, CPqString::SeparatorsLocale); if (v.isEmpty() || cruisingAltitude.isNull()) { - messages.push_back(CLogMessage().validationWarning("Wrong %1") << this->ui->lbl_CrusingAltitude->text()); + messages.push_back(CLogMessage().validationWarning("Wrong %1") << ui->lbl_CrusingAltitude->text()); } else { flightPlan.setCruiseAltitude(cruisingAltitude); } - v = this->ui->le_DestinationAirport->text(); + v = ui->le_DestinationAirport->text(); if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive)) { - messages.push_back(CLogMessage().validationWarning("Missing %1") << this->ui->lbl_DestinationAirport->text()); + messages.push_back(CLogMessage().validationWarning("Missing %1") << ui->lbl_DestinationAirport->text()); flightPlan.setDestinationAirportIcao(QString("")); } else @@ -276,12 +276,12 @@ namespace BlackGui flightPlan.setDestinationAirportIcao(v); } - v = this->ui->le_CruiseTrueAirspeed->text(); + v = ui->le_CruiseTrueAirspeed->text(); BlackMisc::PhysicalQuantities::CSpeed cruiseTAS; cruiseTAS.parseFromString(v, CPqString::SeparatorsLocale); if (cruiseTAS.isNull()) { - messages.push_back(CLogMessage().validationWarning("Wrong TAS, %1") << this->ui->lbl_CruiseTrueAirspeed->text()); + messages.push_back(CLogMessage().validationWarning("Wrong TAS, %1") << ui->lbl_CruiseTrueAirspeed->text()); flightPlan.setDestinationAirportIcao(defaultIcao()); } else @@ -289,10 +289,10 @@ namespace BlackGui flightPlan.setCruiseTrueAirspeed(cruiseTAS); } - v = this->ui->le_OriginAirport->text(); + v = ui->le_OriginAirport->text(); if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive)) { - messages.push_back(CLogMessage().validationWarning("Missing %1") << this->ui->lbl_OriginAirport->text()); + messages.push_back(CLogMessage().validationWarning("Missing %1") << ui->lbl_OriginAirport->text()); flightPlan.setOriginAirportIcao(defaultIcao()); } else @@ -301,12 +301,12 @@ namespace BlackGui } // Optional fields - v = this->ui->le_AlternateAirport->text(); + v = ui->le_AlternateAirport->text(); if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive)) { if (!messages.hasWarningOrErrorMessages()) { - messages.push_back(CLogMessage().validationInfo("Missing %1") << this->ui->lbl_AlternateAirport->text()); + messages.push_back(CLogMessage().validationInfo("Missing %1") << ui->lbl_AlternateAirport->text()); } flightPlan.setAlternateAirportIcao(QString("")); } @@ -334,13 +334,13 @@ namespace BlackGui { flightPlan.setWhenLastSentOrLoaded(QDateTime::currentDateTimeUtc()); sGui->getIContextNetwork()->sendFlightPlan(flightPlan); - this->ui->le_LastSent->setText(flightPlan.whenLastSentOrLoaded().toString()); + ui->le_LastSent->setText(flightPlan.whenLastSentOrLoaded().toString()); CLogMessage(this).info("Sent flight plan"); } else { flightPlan.setWhenLastSentOrLoaded(QDateTime()); // empty - this->ui->le_LastSent->clear(); + ui->le_LastSent->clear(); CLogMessage(this).error("No errors, but not connected, cannot send flight plan"); } this->m_flightPlan = flightPlan; // last valid FP @@ -361,18 +361,18 @@ namespace BlackGui Q_ASSERT(sGui->getIContextNetwork()); Q_ASSERT(sGui->getIContextOwnAircraft()); if (sGui->getIContextOwnAircraft()) { this->prefillWithAircraftData(sGui->getIContextOwnAircraft()->getOwnAircraft()); } - this->ui->le_AircraftRegistration->clear(); - this->ui->le_AirlineOperator->clear(); - this->ui->le_CrusingAltitude->setText("FL70"); - this->ui->le_CruiseTrueAirspeed->setText("100 kts"); - this->ui->pte_Remarks->clear(); - this->ui->pte_Route->clear(); - this->ui->le_AlternateAirport->clear(); - this->ui->le_DestinationAirport->clear(); - this->ui->le_OriginAirport->clear(); - this->ui->le_FuelOnBoard->setText(defaultTime()); - this->ui->le_EstimatedTimeEnroute->setText(defaultTime()); - this->ui->le_TakeOffTimePlanned->setText(QDateTime::currentDateTimeUtc().addSecs(30 * 60).toString("hh:mm")); + ui->le_AircraftRegistration->clear(); + ui->le_AirlineOperator->clear(); + ui->le_CrusingAltitude->setText("FL70"); + ui->le_CruiseTrueAirspeed->setText("100 kts"); + ui->pte_Remarks->clear(); + ui->pte_Route->clear(); + ui->le_AlternateAirport->clear(); + ui->le_DestinationAirport->clear(); + ui->le_OriginAirport->clear(); + ui->le_FuelOnBoard->setText(defaultTime()); + ui->le_EstimatedTimeEnroute->setText(defaultTime()); + ui->le_TakeOffTimePlanned->setText(QDateTime::currentDateTimeUtc().addSecs(30 * 60).toString("hh:mm")); } void CFlightPlanComponent::ps_loadFromDisk() @@ -443,8 +443,8 @@ namespace BlackGui void CFlightPlanComponent::ps_setSelcalInOwnAircraft() { if (!sGui->getIContextOwnAircraft()) return; - if (!this->ui->frp_SelcalCode->hasValidCode()) return; - sGui->getIContextOwnAircraft()->updateSelcal(this->ui->frp_SelcalCode->getSelcal(), flightPlanIdentifier()); + if (!ui->frp_SelcalCode->hasValidCode()) return; + sGui->getIContextOwnAircraft()->updateSelcal(ui->frp_SelcalCode->getSelcal(), flightPlanIdentifier()); } void CFlightPlanComponent::ps_loadFlightPlanFromNetwork() @@ -476,65 +476,65 @@ namespace BlackGui void CFlightPlanComponent::ps_buildRemarksString() { QString rem; - QString v = this->ui->cb_VoiceCapabilities->currentText().toUpper(); + QString v = ui->cb_VoiceCapabilities->currentText().toUpper(); if (v.contains("TEXT")) { rem.append("/T/ "); } else if (v.contains("RECEIVE")) { rem.append("/R/ "); } else if (v.contains("VOICE")) { rem.append("/V/ "); } - v = this->ui->le_AirlineOperator->text().trimmed(); + v = ui->le_AirlineOperator->text().trimmed(); if (!v.isEmpty()) rem.append("OPR/").append(v).append(" "); - v = this->ui->le_AircraftRegistration->text().trimmed(); + v = ui->le_AircraftRegistration->text().trimmed(); if (!v.isEmpty()) rem.append("REG/").append(v).append(" "); - v = this->ui->cb_PilotRating->currentText().toUpper(); + v = ui->cb_PilotRating->currentText().toUpper(); if (v.contains("P1")) { rem.append("PR/P1 "); } else if (v.contains("P2")) { rem.append("PR/P2 "); } else if (v.contains("P3")) { rem.append("PR/P3 "); } else if (v.contains("P4")) { rem.append("PR/P4 "); } else if (v.contains("P5")) { rem.append("PR/P5 "); } - v = this->ui->cb_RequiredNavigationPerformance->currentText().toUpper(); + v = ui->cb_RequiredNavigationPerformance->currentText().toUpper(); if (v.contains("10")) { rem.append("RNP10 "); } else if (v.contains("4")) { rem.append("RNP4 "); } - v = this->ui->cb_NavigationEquipment->currentText().toUpper(); + v = ui->cb_NavigationEquipment->currentText().toUpper(); if (v.contains("VORS")) { rem.append("NAV/VORNDB "); } else if (v.contains("SIDS")) { rem.append("NAV/GPSRNAV "); } if (v.contains("DEFAULT")) { rem.append("NAV/GPS "); } else if (v.contains("OCEANIC")) { rem.append("NAV/GPSOCEANIC "); } - v = this->ui->cb_PerformanceCategory->currentText().toUpper(); + v = ui->cb_PerformanceCategory->currentText().toUpper(); if (v.startsWith("A")) { rem.append("PER/A "); } else if (v.startsWith("B")) { rem.append("PER/B "); } else if (v.startsWith("C")) { rem.append("PER/C "); } else if (v.startsWith("D")) { rem.append("PER/D "); } else if (v.startsWith("E")) { rem.append("PER/E "); } - if (this->ui->frp_SelcalCode->hasValidCode()) + if (ui->frp_SelcalCode->hasValidCode()) { - rem.append("SEL/").append(this->ui->frp_SelcalCode->getSelcalCode()); + rem.append("SEL/").append(ui->frp_SelcalCode->getSelcalCode()); rem.append(" "); } - if (this->ui->cb_NoSidsStarts->isChecked()) { rem.append("NO SID/STAR "); } + if (ui->cb_NoSidsStarts->isChecked()) { rem.append("NO SID/STAR "); } - v = this->ui->pte_AdditionalRemarks->toPlainText().trimmed(); + v = ui->pte_AdditionalRemarks->toPlainText().trimmed(); if (!v.isEmpty()) { rem.append(v); } rem = rem.simplified().trimmed(); - this->ui->pte_RemarksGenerated->setPlainText(rem); + ui->pte_RemarksGenerated->setPlainText(rem); } void CFlightPlanComponent::ps_copyRemarks() { - this->ui->pte_Remarks->setPlainText(this->ui->pte_RemarksGenerated->toPlainText()); + ui->pte_Remarks->setPlainText(ui->pte_RemarksGenerated->toPlainText()); CLogMessage(this).info("Copied remarks"); } void CFlightPlanComponent::ps_currentTabGenerator() { - this->setCurrentWidget(this->ui->tb_RemarksGenerator); + this->setCurrentWidget(ui->tb_RemarksGenerator); } void CFlightPlanComponent::ps_swiftDataRead() @@ -551,8 +551,14 @@ namespace BlackGui void CFlightPlanComponent::initCompleters() { if (!sGui || !sGui->getWebDataServices()) { return; } - QStringList aircraft = sGui->getWebDataServices()->getAircraftIcaoCodes().allIcaoCodes(); + const QStringList aircraft = sGui->getWebDataServices()->getAircraftIcaoCodes().allIcaoCodes(); ui->le_AircraftType->setCompleter(new QCompleter(aircraft, this)); + + const QStringList airports = sGui->getWebDataServices()->getAirports().allIcaoCodes(true); + QCompleter *airportCompleter = new QCompleter(airports, this); + ui->le_AlternateAirport->setCompleter(airportCompleter); + ui->le_DestinationAirport->setCompleter(airportCompleter); + ui->le_OriginAirport->setCompleter(airportCompleter); } QString CFlightPlanComponent::getDefaultFilename(bool load) diff --git a/src/blackgui/components/logincomponent.cpp b/src/blackgui/components/logincomponent.cpp index 4be72cf9b..6ed4f0dfa 100644 --- a/src/blackgui/components/logincomponent.cpp +++ b/src/blackgui/components/logincomponent.cpp @@ -75,28 +75,28 @@ namespace BlackGui ui->setupUi(this); this->m_logoffCountdownTimer = new QTimer(this); this->m_logoffCountdownTimer->setObjectName("CLoginComponent:m_logoffCountdownTimer"); - this->ui->pb_LogoffTimeout->setMaximum(LogoffIntervalSeconds); - this->ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); + ui->pb_LogoffTimeout->setMaximum(LogoffIntervalSeconds); + ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); connect(this->m_logoffCountdownTimer, &QTimer::timeout, this, &CLoginComponent::ps_logoffCountdown); setOkButtonString(false); - connect(this->ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CLoginComponent::ps_loginCancelled); - connect(this->ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CLoginComponent::ps_toggleNetworkConnection); - connect(this->ui->pb_OtherServersGotoSettings, &QPushButton::pressed, this, &CLoginComponent::requestNetworkSettings); + connect(ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CLoginComponent::ps_loginCancelled); + connect(ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CLoginComponent::ps_toggleNetworkConnection); + connect(ui->pb_OtherServersGotoSettings, &QPushButton::pressed, this, &CLoginComponent::requestNetworkSettings); - this->ui->comp_FsdDetails->showEnableInfo(true); - this->ui->comp_FsdDetails->setFsdSetupEnabled(false); + ui->comp_FsdDetails->showEnableInfo(true); + ui->comp_FsdDetails->setFsdSetupEnabled(false); - this->ui->lblp_SimulatorModel->setToolTips("available", "unavailable"); - this->ui->lblp_SimulatorModel->setPixmapUnticked(CIcons::empty()); - this->ui->lblp_AircraftCombinedType->setToolTips("ok", "wrong"); - this->ui->lblp_AircraftIcaoAirline->setToolTips("ok", "wrong"); - this->ui->lblp_AircraftIcaoDesignator->setToolTips("ok", "wrong"); - this->ui->lblp_Callsign->setToolTips("ok", "wrong"); - this->ui->lblp_VatsimHomeAirport->setToolTips("ok", "wrong"); - this->ui->lblp_VatsimId->setToolTips("ok", "wrong"); - this->ui->lblp_VatsimPassword->setToolTips("ok", "wrong"); - this->ui->lblp_VatsimRealName->setToolTips("ok", "wrong"); + ui->lblp_SimulatorModel->setToolTips("available", "unavailable"); + ui->lblp_SimulatorModel->setPixmapUnticked(CIcons::empty()); + ui->lblp_AircraftCombinedType->setToolTips("ok", "wrong"); + ui->lblp_AircraftIcaoAirline->setToolTips("ok", "wrong"); + ui->lblp_AircraftIcaoDesignator->setToolTips("ok", "wrong"); + ui->lblp_Callsign->setToolTips("ok", "wrong"); + ui->lblp_VatsimHomeAirport->setToolTips("ok", "wrong"); + ui->lblp_VatsimId->setToolTips("ok", "wrong"); + ui->lblp_VatsimPassword->setToolTips("ok", "wrong"); + ui->lblp_VatsimRealName->setToolTips("ok", "wrong"); // Stored data this->loadRememberedVatsimData(); @@ -105,36 +105,36 @@ namespace BlackGui // So I use no ranges in the CUpperCaseValidators, as this disables the signals for invalid values // VATSIM - this->ui->le_VatsimId->setValidator(new QIntValidator(100000, 9999999, this)); + ui->le_VatsimId->setValidator(new QIntValidator(100000, 9999999, this)); connect(ui->le_VatsimId, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateVatsimValues); - this->ui->le_VatsimHomeAirport->setValidator(new CUpperCaseValidator(this)); + ui->le_VatsimHomeAirport->setValidator(new CUpperCaseValidator(this)); connect(ui->le_VatsimHomeAirport, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateVatsimValues); connect(ui->le_VatsimPassword, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateVatsimValues); connect(ui->le_VatsimRealName, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateVatsimValues); // own aircraft - this->ui->le_Callsign->setMaxLength(LogoffIntervalSeconds); - this->ui->le_Callsign->setValidator(new CUpperCaseValidator(this)); + ui->le_Callsign->setMaxLength(LogoffIntervalSeconds); + ui->le_Callsign->setValidator(new CUpperCaseValidator(this)); connect(ui->le_Callsign, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); - this->ui->le_AircraftCombinedType->setMaxLength(3); - this->ui->le_AircraftCombinedType->setValidator(new CUpperCaseValidator(this)); + ui->le_AircraftCombinedType->setMaxLength(3); + ui->le_AircraftCombinedType->setValidator(new CUpperCaseValidator(this)); connect(ui->le_AircraftCombinedType, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); - this->ui->le_AirlineIcaoDesignator->setMaxLength(5); - this->ui->le_AirlineIcaoDesignator->setValidator(new CUpperCaseValidator(this)); + ui->le_AirlineIcaoDesignator->setMaxLength(5); + ui->le_AirlineIcaoDesignator->setValidator(new CUpperCaseValidator(this)); connect(ui->le_AirlineIcaoDesignator, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); - this->ui->le_AircraftIcaoDesignator->setMaxLength(5); - this->ui->le_AircraftIcaoDesignator->setValidator(new CUpperCaseValidator(this)); + ui->le_AircraftIcaoDesignator->setMaxLength(5); + ui->le_AircraftIcaoDesignator->setValidator(new CUpperCaseValidator(this)); connect(ui->le_AircraftIcaoDesignator, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); connect(ui->tb_SimulatorIcaoReverseLookup, &QToolButton::clicked, this, &CLoginComponent::ps_reverseLookupModel); // server GUI element - this->ui->frp_CurrentServer->setReadOnly(true); - this->ui->frp_CurrentServer->showPasswordField(false); + ui->frp_CurrentServer->setReadOnly(true); + ui->frp_CurrentServer->showPasswordField(false); connect(sGui->getIContextNetwork(), &IContextNetwork::webServiceDataRead, this, &CLoginComponent::ps_onWebServiceDataRead); @@ -150,7 +150,7 @@ namespace BlackGui otherServers.push_back(sGui->getGlobalSetup().getFsdTestServersPlusHardcodedServers()); CLogMessage(this).info("Added servers for testing"); } - this->ui->comp_OtherServers->setServers(otherServers); + ui->comp_OtherServers->setServers(otherServers); } CLoginComponent::~CLoginComponent() @@ -187,19 +187,19 @@ namespace BlackGui void CLoginComponent::ps_loginCancelled() { this->m_logoffCountdownTimer->stop(); - this->ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); + ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); emit loginOrLogoffCancelled(); } void CLoginComponent::ps_toggleNetworkConnection() { - if (this->ui->tw_Network->currentWidget() == this->ui->pg_FsdDetails) + if (ui->tw_Network->currentWidget() == ui->pg_FsdDetails) { CLogMessage(this).validationError("No login possible from this very tab, use VATSIM or other servers"); return; } const bool isConnected = sGui->getIContextNetwork()->isConnected(); - const bool vatsimLogin = (this->ui->tw_Network->currentWidget() == this->ui->pg_NetworkVatsim); + const bool vatsimLogin = (ui->tw_Network->currentWidget() == ui->pg_NetworkVatsim); CServer currentServer; // used for login CSimulatedAircraft ownAircraft; // used own aircraft CStatusMessage msg; @@ -281,7 +281,7 @@ namespace BlackGui currentServer.setFsdSetup(fsd); } - this->ui->frp_CurrentServer->setServer(currentServer); + ui->frp_CurrentServer->setServer(currentServer); sGui->getIContextOwnAircraft()->updateOwnAircraftPilot(currentServer.getUser()); // Login @@ -326,8 +326,8 @@ namespace BlackGui if (vatsimFsdServers.isEmpty()) { return; } vatsimFsdServers.sortBy(&CServer::getName); const CServer currentServer = this->m_currentVatsimServer.get(); - this->ui->comp_VatsimServer->setServers(vatsimFsdServers, true); - this->ui->comp_VatsimServer->preSelect(currentServer.getName()); + ui->comp_VatsimServer->setServers(vatsimFsdServers, true); + ui->comp_VatsimServer->preSelect(currentServer.getName()); } else { @@ -338,10 +338,10 @@ namespace BlackGui void CLoginComponent::setGuiValuesFromAircraft(const CSimulatedAircraft &ownAircraft) { const CAircraftIcaoCode aircraftIcao = ownAircraft.getAircraftIcaoCode(); - this->ui->le_Callsign->setText(ownAircraft.getCallsignAsString()); - this->ui->le_AircraftIcaoDesignator->setText(aircraftIcao.getDesignator()); - this->ui->le_AirlineIcaoDesignator->setText(ownAircraft.getAirlineIcaoCodeDesignator()); - this->ui->le_AircraftCombinedType->setText(aircraftIcao.getCombinedType()); + ui->le_Callsign->setText(ownAircraft.getCallsignAsString()); + ui->le_AircraftIcaoDesignator->setText(aircraftIcao.getDesignator()); + ui->le_AirlineIcaoDesignator->setText(ownAircraft.getAirlineIcaoCodeDesignator()); + ui->le_AircraftCombinedType->setText(aircraftIcao.getCombinedType()); } void CLoginComponent::loadRememberedVatsimData() @@ -350,41 +350,41 @@ namespace BlackGui const CUser lastUser = lastServer.getUser(); if (lastUser.hasValidCallsign()) { - this->ui->le_Callsign->setText(lastUser.getCallsign().asString()); - this->ui->le_VatsimId->setText(lastUser.getId()); - this->ui->le_VatsimPassword->setText(lastUser.getPassword()); - this->ui->le_VatsimHomeAirport->setText(lastUser.getHomebase().asString()); - this->ui->le_VatsimRealName->setText(lastUser.getRealName()); + ui->le_Callsign->setText(lastUser.getCallsign().asString()); + ui->le_VatsimId->setText(lastUser.getId()); + ui->le_VatsimPassword->setText(lastUser.getPassword()); + ui->le_VatsimHomeAirport->setText(lastUser.getHomebase().asString()); + ui->le_VatsimRealName->setText(lastUser.getRealName()); } else { - this->ui->le_Callsign->setText("SWIFT"); - this->ui->le_VatsimId->setText("1288459"); - this->ui->le_VatsimPassword->setText("4769"); - this->ui->le_VatsimHomeAirport->setText("LOWI"); - this->ui->le_VatsimRealName->setText("Black Swift"); + ui->le_Callsign->setText("SWIFT"); + ui->le_VatsimId->setText("1288459"); + ui->le_VatsimPassword->setText("4769"); + ui->le_VatsimHomeAirport->setText("LOWI"); + ui->le_VatsimRealName->setText("Black Swift"); } - this->ui->comp_OtherServers->preSelect(lastServer.getName()); + ui->comp_OtherServers->preSelect(lastServer.getName()); } CLoginComponent::CGuiAircraftValues CLoginComponent::getAircraftValuesFromGui() const { CGuiAircraftValues values; - values.ownCallsign = this->ui->le_Callsign->text().trimmed().toUpper(); - values.ownAircraftIcaoTypeDesignator = CAircraftIcaoCode::normalizeDesignator(this->ui->le_AircraftIcaoDesignator->text()); - values.ownAircraftIcaoAirline = CAirlineIcaoCode::normalizeDesignator(this->ui->le_AirlineIcaoDesignator->text()); - values.ownAircraftCombinedType = this->ui->le_AircraftCombinedType->text().trimmed().toUpper(); - values.ownAircraftSimulatorModel = this->ui->le_SimulatorModel->text().trimmed().toUpper(); + values.ownCallsign = ui->le_Callsign->text().trimmed().toUpper(); + values.ownAircraftIcaoTypeDesignator = CAircraftIcaoCode::normalizeDesignator(ui->le_AircraftIcaoDesignator->text()); + values.ownAircraftIcaoAirline = CAirlineIcaoCode::normalizeDesignator(ui->le_AirlineIcaoDesignator->text()); + values.ownAircraftCombinedType = ui->le_AircraftCombinedType->text().trimmed().toUpper(); + values.ownAircraftSimulatorModel = ui->le_SimulatorModel->text().trimmed().toUpper(); return values; } CLoginComponent::CVatsimValues CLoginComponent::getVatsimValuesFromGui() const { CVatsimValues values; - values.vatsimHomeAirport = this->ui->le_VatsimHomeAirport->text().trimmed().toUpper(); - values.vatsimId = this->ui->le_VatsimId->text().trimmed(); - values.vatsimPassword = this->ui->le_VatsimPassword->text().trimmed(); - values.vatsimRealName = this->ui->le_VatsimRealName->text().simplified().trimmed(); + values.vatsimHomeAirport = ui->le_VatsimHomeAirport->text().trimmed().toUpper(); + values.vatsimId = ui->le_VatsimId->text().trimmed(); + values.vatsimPassword = ui->le_VatsimPassword->text().trimmed(); + values.vatsimRealName = ui->le_VatsimRealName->text().simplified().trimmed(); return values; } @@ -398,37 +398,37 @@ namespace BlackGui CCallsign CLoginComponent::getCallsignFromGui() const { - CCallsign cs(this->ui->le_Callsign->text().trimmed().toUpper()); + CCallsign cs(ui->le_Callsign->text().trimmed().toUpper()); return cs; } CServer CLoginComponent::getCurrentVatsimServer() const { - return this->ui->comp_VatsimServer->currentServer(); + return ui->comp_VatsimServer->currentServer(); } CServer CLoginComponent::getCurrentOtherServer() const { - return this->ui->comp_OtherServers->currentServer(); + return ui->comp_OtherServers->currentServer(); } void CLoginComponent::setOkButtonString(bool connected) { QString s = connected ? "Disconnect" : "Connect"; - this->ui->bb_OkCancel->button(QDialogButtonBox::Ok)->setText(s); + ui->bb_OkCancel->button(QDialogButtonBox::Ok)->setText(s); } void CLoginComponent::setGuiVisibility(bool connected) { - this->ui->gbp_LoginMode->setVisible(!connected); - this->ui->gb_OwnAircraft->setVisible(!connected); - this->ui->gb_Network->setVisible(!connected); - this->ui->fr_LogoffConfirmation->setVisible(connected); + ui->gbp_LoginMode->setVisible(!connected); + ui->gb_OwnAircraft->setVisible(!connected); + ui->gb_Network->setVisible(!connected); + ui->fr_LogoffConfirmation->setVisible(connected); } void CLoginComponent::startLogoffTimerCountdown() { - this->ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); + ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); this->m_logoffCountdownTimer->setInterval(1000); this->m_logoffCountdownTimer->start(); } @@ -444,7 +444,7 @@ namespace BlackGui if (simulating) { model = sGui->getIContextOwnAircraft()->getOwnAircraft().getModel(); - this->ui->le_SimulatorModel->setText(model.getModelString()); + ui->le_SimulatorModel->setText(model.getModelString()); } else { @@ -453,8 +453,8 @@ namespace BlackGui CAircraftIcaoCode("C172", "L1P", "Cessna", "172", "L", true, false, false, 0)); model = this->m_currentAircraftModel.get(); if (!model.hasAircraftDesignator()) { model = defaultModel; } - this->ui->gbp_LoginMode->setLoginMode(INetwork::LoginNormal); //! \todo Set observer mode without simulator, currently not working in OBS mode - this->ui->le_SimulatorModel->setText("No simulator"); + ui->gbp_LoginMode->setLoginMode(INetwork::LoginNormal); //! \todo Set observer mode without simulator, currently not working in OBS mode + ui->le_SimulatorModel->setText("No simulator"); } if (model.hasAircraftDesignator()) @@ -465,17 +465,17 @@ namespace BlackGui void CLoginComponent::setGuiIcaoValues(const CAircraftModel &model, bool onlyIfEmpty) { - if (!onlyIfEmpty || this->ui->le_AircraftIcaoDesignator->text().trimmed().isEmpty()) + if (!onlyIfEmpty || ui->le_AircraftIcaoDesignator->text().trimmed().isEmpty()) { - this->ui->le_AircraftIcaoDesignator->setText(model.getAircraftIcaoCode().getDesignator()); + ui->le_AircraftIcaoDesignator->setText(model.getAircraftIcaoCode().getDesignator()); } - if (!onlyIfEmpty || this->ui->le_AirlineIcaoDesignator->text().trimmed().isEmpty()) + if (!onlyIfEmpty || ui->le_AirlineIcaoDesignator->text().trimmed().isEmpty()) { - this->ui->le_AirlineIcaoDesignator->setText(model.getAirlineIcaoCode().getDesignator()); + ui->le_AirlineIcaoDesignator->setText(model.getAirlineIcaoCode().getDesignator()); } - if (!onlyIfEmpty || this->ui->le_AircraftCombinedType->text().trimmed().isEmpty()) + if (!onlyIfEmpty || ui->le_AircraftCombinedType->text().trimmed().isEmpty()) { - this->ui->le_AircraftCombinedType->setText(model.getAircraftIcaoCode().getCombinedType()); + ui->le_AircraftCombinedType->setText(model.getAircraftIcaoCode().getCombinedType()); } this->ps_validateAircraftValues(); } @@ -485,19 +485,19 @@ namespace BlackGui CGuiAircraftValues values = getAircraftValuesFromGui(); const bool validCombinedType = CAircraftIcaoCode::isValidCombinedType(values.ownAircraftCombinedType); - this->ui->lblp_AircraftCombinedType->setTicked(validCombinedType); + ui->lblp_AircraftCombinedType->setTicked(validCombinedType); const bool validAirlineDesignator = values.ownAircraftIcaoAirline.isEmpty() || CAircraftIcaoCode::isValidDesignator(values.ownAircraftIcaoAirline); - this->ui->lblp_AircraftIcaoAirline->setTicked(validAirlineDesignator); + ui->lblp_AircraftIcaoAirline->setTicked(validAirlineDesignator); const bool validIcaoDesignator = CAircraftIcaoCode::isValidDesignator(values.ownAircraftIcaoTypeDesignator); - this->ui->lblp_AircraftIcaoDesignator->setTicked(validIcaoDesignator); + ui->lblp_AircraftIcaoDesignator->setTicked(validIcaoDesignator); const bool validCallsign = CCallsign::isValidAircraftCallsign(values.ownCallsign); - this->ui->lblp_Callsign->setTicked(validCallsign); + ui->lblp_Callsign->setTicked(validCallsign); const bool validSimulatorModel = !values.ownAircraftSimulatorModel.isEmpty(); - this->ui->lblp_SimulatorModel->setTicked(validSimulatorModel); + ui->lblp_SimulatorModel->setTicked(validSimulatorModel); // model intentionally ignored return validCombinedType && validAirlineDesignator && validIcaoDesignator && validCallsign; @@ -508,16 +508,16 @@ namespace BlackGui CVatsimValues values = getVatsimValuesFromGui(); const bool validVatsimId = CUser::isValidVatsimId(values.vatsimId); - this->ui->lblp_VatsimId->setTicked(validVatsimId); + ui->lblp_VatsimId->setTicked(validVatsimId); const bool validHomeAirport = values.vatsimHomeAirport.isEmpty() || CAirportIcaoCode::isValidIcaoDesignator(values.vatsimHomeAirport); - this->ui->lblp_VatsimHomeAirport->setTicked(validHomeAirport); + ui->lblp_VatsimHomeAirport->setTicked(validHomeAirport); const bool validVatsimPassword = !values.vatsimPassword.isEmpty(); - this->ui->lblp_VatsimPassword->setTicked(validVatsimPassword); + ui->lblp_VatsimPassword->setTicked(validVatsimPassword); const bool validRealUserName = !values.vatsimRealName.isEmpty(); - this->ui->lblp_VatsimRealName->setTicked(validRealUserName); + ui->lblp_VatsimRealName->setTicked(validRealUserName); return validVatsimId && validHomeAirport && validVatsimPassword && validRealUserName; } @@ -525,15 +525,15 @@ namespace BlackGui void CLoginComponent::ps_reloadSettings() { CServerList otherServers(this->m_otherTrafficNetworkServers.getThreadLocal()); - this->ui->comp_OtherServers->setServers(otherServers); + ui->comp_OtherServers->setServers(otherServers); } void CLoginComponent::ps_logoffCountdown() { - int v = this->ui->pb_LogoffTimeout->value(); + int v = ui->pb_LogoffTimeout->value(); v -= 1; if (v < 0) { v = 0; } - this->ui->pb_LogoffTimeout->setValue(v); + ui->pb_LogoffTimeout->setValue(v); if (v <= 0) { this->m_logoffCountdownTimer->stop(); @@ -564,8 +564,6 @@ namespace BlackGui // completers where possible if (sGui && sGui->getWebDataServices()) { - //! \todo fill in when airports are ready - if (entity.testFlag(CEntityFlags::AircraftIcaoEntity) && !ui->le_AircraftIcaoDesignator->completer()) { const QStringList aircraftDesignators = sGui->getWebDataServices()->getAircraftIcaoCodes().toCompleterStrings(); @@ -593,6 +591,20 @@ namespace BlackGui completer->popup()->setMinimumWidth(175); } } + + if (entity.testFlag(CEntityFlags::AirportEntity) && !ui->le_VatsimHomeAirport->completer()) + { + const QStringList airports = sGui->getWebDataServices()->getAirports().allIcaoCodes(true); + if (!airports.isEmpty()) + { + QCompleter *completer = new QCompleter(airports, this); + QStyledItemDelegate *itemDelegate = new QStyledItemDelegate(completer); + completer->popup()->setItemDelegate(itemDelegate); + ui->le_AirlineIcaoDesignator->setCompleter(completer); + completer->popup()->setObjectName("AirportCompleter"); + completer->popup()->setMinimumWidth(175); + } + } } } } // namespace diff --git a/src/blackgui/components/logincomponent.h b/src/blackgui/components/logincomponent.h index 0f460b73c..ef8db7784 100644 --- a/src/blackgui/components/logincomponent.h +++ b/src/blackgui/components/logincomponent.h @@ -159,6 +159,7 @@ namespace BlackGui //! Set ICAO values void setGuiIcaoValues(const BlackMisc::Simulation::CAircraftModel &model, bool onlyIfEmpty); + //! Completers void initCompleters(BlackMisc::Network::CEntityFlags::Entity entity); QScopedPointer ui; diff --git a/src/blackmisc/aviation/airport.h b/src/blackmisc/aviation/airport.h index 27fa17503..c729b8694 100644 --- a/src/blackmisc/aviation/airport.h +++ b/src/blackmisc/aviation/airport.h @@ -63,7 +63,7 @@ namespace BlackMisc const CAirportIcaoCode &getIcao() const { return m_icao; } //! Get ICAO code as string. - QString getIcaoAsString() const { return m_icao.asString(); } + const QString &getIcaoAsString() const { return m_icao.asString(); } //! Set ICAO code. void setIcao(const CAirportIcaoCode &icao) { m_icao = icao; } @@ -81,7 +81,7 @@ namespace BlackMisc void setPosition(const BlackMisc::Geo::CCoordinateGeodetic &position) { this->m_position = position; } //! Get the country - const CCountry& getCountry() const { return m_country; } + const CCountry &getCountry() const { return m_country; } //! Set the country void setCountry(const CCountry &country) { this->m_country = country; } diff --git a/src/blackmisc/aviation/airportlist.cpp b/src/blackmisc/aviation/airportlist.cpp index 57bbee206..77c8c140e 100644 --- a/src/blackmisc/aviation/airportlist.cpp +++ b/src/blackmisc/aviation/airportlist.cpp @@ -21,7 +21,6 @@ namespace BlackMisc { namespace Aviation { - CAirportList::CAirportList() { } CAirportList::CAirportList(const CSequence &other) : @@ -44,11 +43,27 @@ namespace BlackMisc return this->findFirstByOrDefault(&CAirport::getIcao, icao, ifNotFound); } + QStringList CAirportList::allIcaoCodes(bool sorted) const + { + QStringList icaos; + for (const CAirport &airport : *this) + { + if (!airport.getIcaoAsString().isEmpty()) + { + icaos.push_back(airport.getIcaoAsString()); + } + } + if (sorted) + { + icaos.sort(); + } + return icaos; + } + void CAirportList::convertFromDatabaseJson(const QJsonArray &json) { clear(); - - for (const QJsonValue& value: json) + for (const QJsonValue &value : json) { QJsonObject object = value.toObject(); CAirport airport; @@ -56,6 +71,5 @@ namespace BlackMisc push_back(airport); } } - } // namespace } // namespace diff --git a/src/blackmisc/aviation/airportlist.h b/src/blackmisc/aviation/airportlist.h index ba4946d6f..3d6421c4b 100644 --- a/src/blackmisc/aviation/airportlist.h +++ b/src/blackmisc/aviation/airportlist.h @@ -50,9 +50,11 @@ namespace BlackMisc //! Find first station by callsign, if not return given value / default CAirport findFirstByIcao(const CAirportIcaoCode &icao, const CAirport &ifNotFound = CAirport()) const; + //! All ICAO codes + QStringList allIcaoCodes(bool sorted) const; + //! Reads the airport list from database JSON void convertFromDatabaseJson(const QJsonArray& json); - }; } //namespace } // namespace