refs #748, add airport completers

* in flight plan
* in login
* utility functions
This commit is contained in:
Klaus Basan
2016-08-28 23:26:11 +02:00
parent eeea9db9c9
commit 1d1815de43
8 changed files with 226 additions and 184 deletions

View File

@@ -509,6 +509,12 @@ namespace BlackCore
return CCountry(); return CCountry();
} }
CAirportList CWebDataServices::getAirports() const
{
if (m_airportDataReader) { return m_airportDataReader->getAirports(); }
return CAirportList();
}
CCountry CWebDataServices::getCountryForIsoCode(const QString &iso) const CCountry CWebDataServices::getCountryForIsoCode(const QString &iso) const
{ {
if (m_icaoDataReader) { return m_icaoDataReader->getCountryForIsoCode(iso); } if (m_icaoDataReader) { return m_icaoDataReader->getCountryForIsoCode(iso); }

View File

@@ -45,7 +45,6 @@
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
namespace BlackMisc namespace BlackMisc
{ {
class CLogCategoryList; class CLogCategoryList;
@@ -58,7 +57,7 @@ namespace BlackMisc
namespace BlackCore namespace BlackCore
{ {
class CApplication; class CApplication;
class CAirportDataReader;
namespace Vatsim namespace Vatsim
{ {
class CVatsimBookingReader; class CVatsimBookingReader;
@@ -76,8 +75,6 @@ namespace BlackCore
class CInfoDataReader; class CInfoDataReader;
} }
class CAirportDataReader;
/*! /*!
* Encapsulates reading data from web sources * Encapsulates reading data from web sources
*/ */
@@ -281,6 +278,10 @@ namespace BlackCore
//! \threadsafe //! \threadsafe
BlackMisc::CCountry getCountryForName(const QString &name) const; BlackMisc::CCountry getCountryForName(const QString &name) const;
//! Get airports
//! \\threadsafe
BlackMisc::Aviation::CAirportList getAirports() const;
//! Get METARs //! Get METARs
//! \threadsafe //! \threadsafe
BlackMisc::Weather::CMetarList getMetars() const; BlackMisc::Weather::CMetarList getMetars() const;

View File

@@ -15,7 +15,7 @@
#include "blackgui/components/selcalcodeselector.h" #include "blackgui/components/selcalcodeselector.h"
#include "blackgui/guiapplication.h" #include "blackgui/guiapplication.h"
#include "blackmisc/aviation/aircrafticaocode.h" #include "blackmisc/aviation/aircrafticaocode.h"
#include "blackmisc/aviation/airporticaocode.h" #include "blackmisc/aviation/airportlist.h"
#include "blackmisc/aviation/altitude.h" #include "blackmisc/aviation/altitude.h"
#include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/callsign.h"
#include "blackmisc/logcategory.h" #include "blackmisc/logcategory.h"
@@ -76,33 +76,33 @@ namespace BlackGui
ui->le_OriginAirport->setValidator(ucv); ui->le_OriginAirport->setValidator(ucv);
// connect // connect
connect(this->ui->pb_Send, &QPushButton::pressed, this, &CFlightPlanComponent::ps_sendFlightPlan); connect(ui->pb_Send, &QPushButton::pressed, this, &CFlightPlanComponent::ps_sendFlightPlan);
connect(this->ui->pb_Load, &QPushButton::pressed, this, &CFlightPlanComponent::ps_loadFlightPlanFromNetwork); connect(ui->pb_Load, &QPushButton::pressed, this, &CFlightPlanComponent::ps_loadFlightPlanFromNetwork);
connect(this->ui->pb_Reset, &QPushButton::pressed, this, &CFlightPlanComponent::ps_resetFlightPlan); connect(ui->pb_Reset, &QPushButton::pressed, this, &CFlightPlanComponent::ps_resetFlightPlan);
connect(this->ui->pb_ValidateFlightPlan, &QPushButton::pressed, this, &CFlightPlanComponent::ps_validateFlightPlan); connect(ui->pb_ValidateFlightPlan, &QPushButton::pressed, this, &CFlightPlanComponent::ps_validateFlightPlan);
connect(this->ui->cb_VoiceCapabilities, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); connect(ui->cb_VoiceCapabilities, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks);
connect(this->ui->cb_NavigationEquipment, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); connect(ui->cb_NavigationEquipment, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks);
connect(this->ui->cb_PerformanceCategory, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); connect(ui->cb_PerformanceCategory, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks);
connect(this->ui->cb_PilotRating, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks); connect(ui->cb_PilotRating, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::ps_currentTextChangedToBuildRemarks);
connect(this->ui->cb_RequiredNavigationPerformance, &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(ui->pb_LoadDisk, &QPushButton::clicked, this, &CFlightPlanComponent::ps_loadFromDisk);
connect(this->ui->pb_SaveDisk, &QPushButton::clicked, this, &CFlightPlanComponent::ps_saveToDisk); 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"); 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"); 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_ASSERT_X(c, Q_FUNC_INFO, "failed connect");
Q_UNUSED(c); Q_UNUSED(c);
connect(this->ui->pte_AdditionalRemarks, &QPlainTextEdit::textChanged, this, &CFlightPlanComponent::ps_buildRemarksString); connect(ui->pte_AdditionalRemarks, &QPlainTextEdit::textChanged, this, &CFlightPlanComponent::ps_buildRemarksString);
connect(this->ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_buildRemarksString); connect(ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_buildRemarksString);
connect(this->ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_setSelcalInOwnAircraft); connect(ui->frp_SelcalCode, &CSelcalCodeSelector::valueChanged, this, &CFlightPlanComponent::ps_setSelcalInOwnAircraft);
connect(this->ui->pb_CopyOver, &QPushButton::pressed, this, &CFlightPlanComponent::ps_copyRemarks); connect(ui->pb_CopyOver, &QPushButton::pressed, this, &CFlightPlanComponent::ps_copyRemarks);
connect(this->ui->pb_RemarksGenerator, &QPushButton::clicked, this, &CFlightPlanComponent::ps_currentTabGenerator); connect(ui->pb_RemarksGenerator, &QPushButton::clicked, this, &CFlightPlanComponent::ps_currentTabGenerator);
// web services // web services
connect(sGui->getWebDataServices(), &CWebDataServices::allSwiftDbDataRead, this, &CFlightPlanComponent::ps_swiftDataRead); connect(sGui->getWebDataServices(), &CWebDataServices::allSwiftDbDataRead, this, &CFlightPlanComponent::ps_swiftDataRead);
@@ -127,38 +127,38 @@ namespace BlackGui
// only override with valid values // only override with valid values
if (CCallsign::isValidAircraftCallsign(ownAircraft.getCallsignAsString())) 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())) if (CAircraftIcaoCode::isValidDesignator(ownAircraft.getAircraftIcaoCodeDesignator()))
{ {
this->ui->le_AircraftType->setText(ownAircraft.getAircraftIcaoCodeDesignator()); ui->le_AircraftType->setText(ownAircraft.getAircraftIcaoCodeDesignator());
} }
if (ownAircraft.hasValidRealName()) 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) void CFlightPlanComponent::fillWithFlightPlanData(const BlackMisc::Aviation::CFlightPlan &flightPlan)
{ {
this->ui->le_AlternateAirport->setText(flightPlan.getAlternateAirportIcao().asString()); ui->le_AlternateAirport->setText(flightPlan.getAlternateAirportIcao().asString());
this->ui->le_DestinationAirport->setText(flightPlan.getDestinationAirportIcao().asString()); ui->le_DestinationAirport->setText(flightPlan.getDestinationAirportIcao().asString());
this->ui->le_OriginAirport->setText(flightPlan.getOriginAirportIcao().asString()); ui->le_OriginAirport->setText(flightPlan.getOriginAirportIcao().asString());
this->ui->pte_Route->setPlainText(flightPlan.getRoute()); ui->pte_Route->setPlainText(flightPlan.getRoute());
this->ui->pte_Remarks->setPlainText(flightPlan.getRemarks()); ui->pte_Remarks->setPlainText(flightPlan.getRemarks());
this->ui->le_TakeOffTimePlanned->setText(flightPlan.getTakeoffTimePlannedHourMin()); ui->le_TakeOffTimePlanned->setText(flightPlan.getTakeoffTimePlannedHourMin());
this->ui->le_FuelOnBoard->setText(flightPlan.getFuelTimeHourMin()); ui->le_FuelOnBoard->setText(flightPlan.getFuelTimeHourMin());
this->ui->le_EstimatedTimeEnroute->setText(flightPlan.getEnrouteTimeHourMin()); ui->le_EstimatedTimeEnroute->setText(flightPlan.getEnrouteTimeHourMin());
this->ui->le_CruiseTrueAirspeed->setText(flightPlan.getCruiseTrueAirspeed().valueRoundedWithUnit(BlackMisc::PhysicalQuantities::CSpeedUnit::kts(), 0)); ui->le_CruiseTrueAirspeed->setText(flightPlan.getCruiseTrueAirspeed().valueRoundedWithUnit(BlackMisc::PhysicalQuantities::CSpeedUnit::kts(), 0));
const CAltitude cruiseAlt = flightPlan.getCruiseAltitude(); const CAltitude cruiseAlt = flightPlan.getCruiseAltitude();
if (cruiseAlt.isFlightLevel()) if (cruiseAlt.isFlightLevel())
{ {
this->ui->le_CrusingAltitude->setText(cruiseAlt.toQString()); ui->le_CrusingAltitude->setText(cruiseAlt.toQString());
} }
else 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; QString v;
CFlightPlan::FlightRules rule = CFlightPlan::IFR; CFlightPlan::FlightRules rule = CFlightPlan::IFR;
if (this->ui->rb_TypeIfr->isChecked()) if (ui->rb_TypeIfr->isChecked())
{ {
rule = CFlightPlan::IFR; rule = CFlightPlan::IFR;
} }
else if (this->ui->rb_TypeVfr->isChecked()) else if (ui->rb_TypeVfr->isChecked())
{ {
rule = CFlightPlan::VFR; rule = CFlightPlan::VFR;
} }
@@ -186,7 +186,7 @@ namespace BlackGui
v = ui->le_Callsign->text().trimmed(); v = ui->le_Callsign->text().trimmed();
if (v.isEmpty()) 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(); v = ui->pte_Route->toPlainText().trimmed();
@@ -220,7 +220,7 @@ namespace BlackGui
v = ui->le_EstimatedTimeEnroute->text(); v = ui->le_EstimatedTimeEnroute->text();
if (v.isEmpty() || v == defaultTime()) 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 else
{ {
@@ -230,7 +230,7 @@ namespace BlackGui
v = ui->le_FuelOnBoard->text(); v = ui->le_FuelOnBoard->text();
if (v.isEmpty() || v == defaultTime()) 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 else
{ {
@@ -240,7 +240,7 @@ namespace BlackGui
v = ui->le_TakeOffTimePlanned->text(); v = ui->le_TakeOffTimePlanned->text();
if (v.isEmpty() || v == defaultTime()) 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 else
{ {
@@ -252,23 +252,23 @@ namespace BlackGui
if (!v.isEmpty() && withUnit.indexIn(v) < 0) if (!v.isEmpty() && withUnit.indexIn(v) < 0)
{ {
v += "ft"; v += "ft";
this->ui->le_CrusingAltitude->setText(v); ui->le_CrusingAltitude->setText(v);
} }
CAltitude cruisingAltitude(v, CPqString::SeparatorsLocale); CAltitude cruisingAltitude(v, CPqString::SeparatorsLocale);
if (v.isEmpty() || cruisingAltitude.isNull()) 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 else
{ {
flightPlan.setCruiseAltitude(cruisingAltitude); flightPlan.setCruiseAltitude(cruisingAltitude);
} }
v = this->ui->le_DestinationAirport->text(); v = ui->le_DestinationAirport->text();
if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive)) 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("")); flightPlan.setDestinationAirportIcao(QString(""));
} }
else else
@@ -276,12 +276,12 @@ namespace BlackGui
flightPlan.setDestinationAirportIcao(v); flightPlan.setDestinationAirportIcao(v);
} }
v = this->ui->le_CruiseTrueAirspeed->text(); v = ui->le_CruiseTrueAirspeed->text();
BlackMisc::PhysicalQuantities::CSpeed cruiseTAS; BlackMisc::PhysicalQuantities::CSpeed cruiseTAS;
cruiseTAS.parseFromString(v, CPqString::SeparatorsLocale); cruiseTAS.parseFromString(v, CPqString::SeparatorsLocale);
if (cruiseTAS.isNull()) 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()); flightPlan.setDestinationAirportIcao(defaultIcao());
} }
else else
@@ -289,10 +289,10 @@ namespace BlackGui
flightPlan.setCruiseTrueAirspeed(cruiseTAS); flightPlan.setCruiseTrueAirspeed(cruiseTAS);
} }
v = this->ui->le_OriginAirport->text(); v = ui->le_OriginAirport->text();
if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive)) 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()); flightPlan.setOriginAirportIcao(defaultIcao());
} }
else else
@@ -301,12 +301,12 @@ namespace BlackGui
} }
// Optional fields // Optional fields
v = this->ui->le_AlternateAirport->text(); v = ui->le_AlternateAirport->text();
if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive)) if (v.isEmpty() || v.endsWith(defaultIcao(), Qt::CaseInsensitive))
{ {
if (!messages.hasWarningOrErrorMessages()) 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("")); flightPlan.setAlternateAirportIcao(QString(""));
} }
@@ -334,13 +334,13 @@ namespace BlackGui
{ {
flightPlan.setWhenLastSentOrLoaded(QDateTime::currentDateTimeUtc()); flightPlan.setWhenLastSentOrLoaded(QDateTime::currentDateTimeUtc());
sGui->getIContextNetwork()->sendFlightPlan(flightPlan); 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"); CLogMessage(this).info("Sent flight plan");
} }
else else
{ {
flightPlan.setWhenLastSentOrLoaded(QDateTime()); // empty 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"); CLogMessage(this).error("No errors, but not connected, cannot send flight plan");
} }
this->m_flightPlan = flightPlan; // last valid FP this->m_flightPlan = flightPlan; // last valid FP
@@ -361,18 +361,18 @@ namespace BlackGui
Q_ASSERT(sGui->getIContextNetwork()); Q_ASSERT(sGui->getIContextNetwork());
Q_ASSERT(sGui->getIContextOwnAircraft()); Q_ASSERT(sGui->getIContextOwnAircraft());
if (sGui->getIContextOwnAircraft()) { this->prefillWithAircraftData(sGui->getIContextOwnAircraft()->getOwnAircraft()); } if (sGui->getIContextOwnAircraft()) { this->prefillWithAircraftData(sGui->getIContextOwnAircraft()->getOwnAircraft()); }
this->ui->le_AircraftRegistration->clear(); ui->le_AircraftRegistration->clear();
this->ui->le_AirlineOperator->clear(); ui->le_AirlineOperator->clear();
this->ui->le_CrusingAltitude->setText("FL70"); ui->le_CrusingAltitude->setText("FL70");
this->ui->le_CruiseTrueAirspeed->setText("100 kts"); ui->le_CruiseTrueAirspeed->setText("100 kts");
this->ui->pte_Remarks->clear(); ui->pte_Remarks->clear();
this->ui->pte_Route->clear(); ui->pte_Route->clear();
this->ui->le_AlternateAirport->clear(); ui->le_AlternateAirport->clear();
this->ui->le_DestinationAirport->clear(); ui->le_DestinationAirport->clear();
this->ui->le_OriginAirport->clear(); ui->le_OriginAirport->clear();
this->ui->le_FuelOnBoard->setText(defaultTime()); ui->le_FuelOnBoard->setText(defaultTime());
this->ui->le_EstimatedTimeEnroute->setText(defaultTime()); ui->le_EstimatedTimeEnroute->setText(defaultTime());
this->ui->le_TakeOffTimePlanned->setText(QDateTime::currentDateTimeUtc().addSecs(30 * 60).toString("hh:mm")); ui->le_TakeOffTimePlanned->setText(QDateTime::currentDateTimeUtc().addSecs(30 * 60).toString("hh:mm"));
} }
void CFlightPlanComponent::ps_loadFromDisk() void CFlightPlanComponent::ps_loadFromDisk()
@@ -443,8 +443,8 @@ namespace BlackGui
void CFlightPlanComponent::ps_setSelcalInOwnAircraft() void CFlightPlanComponent::ps_setSelcalInOwnAircraft()
{ {
if (!sGui->getIContextOwnAircraft()) return; if (!sGui->getIContextOwnAircraft()) return;
if (!this->ui->frp_SelcalCode->hasValidCode()) return; if (!ui->frp_SelcalCode->hasValidCode()) return;
sGui->getIContextOwnAircraft()->updateSelcal(this->ui->frp_SelcalCode->getSelcal(), flightPlanIdentifier()); sGui->getIContextOwnAircraft()->updateSelcal(ui->frp_SelcalCode->getSelcal(), flightPlanIdentifier());
} }
void CFlightPlanComponent::ps_loadFlightPlanFromNetwork() void CFlightPlanComponent::ps_loadFlightPlanFromNetwork()
@@ -476,65 +476,65 @@ namespace BlackGui
void CFlightPlanComponent::ps_buildRemarksString() void CFlightPlanComponent::ps_buildRemarksString()
{ {
QString rem; QString rem;
QString v = this->ui->cb_VoiceCapabilities->currentText().toUpper(); QString v = ui->cb_VoiceCapabilities->currentText().toUpper();
if (v.contains("TEXT")) { rem.append("/T/ "); } if (v.contains("TEXT")) { rem.append("/T/ "); }
else if (v.contains("RECEIVE")) { rem.append("/R/ "); } else if (v.contains("RECEIVE")) { rem.append("/R/ "); }
else if (v.contains("VOICE")) { rem.append("/V/ "); } 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(" "); 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(" "); 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 "); } if (v.contains("P1")) { rem.append("PR/P1 "); }
else if (v.contains("P2")) { rem.append("PR/P2 "); } else if (v.contains("P2")) { rem.append("PR/P2 "); }
else if (v.contains("P3")) { rem.append("PR/P3 "); } else if (v.contains("P3")) { rem.append("PR/P3 "); }
else if (v.contains("P4")) { rem.append("PR/P4 "); } else if (v.contains("P4")) { rem.append("PR/P4 "); }
else if (v.contains("P5")) { rem.append("PR/P5 "); } 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 "); } if (v.contains("10")) { rem.append("RNP10 "); }
else if (v.contains("4")) { rem.append("RNP4 "); } 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 "); } if (v.contains("VORS")) { rem.append("NAV/VORNDB "); }
else if (v.contains("SIDS")) { rem.append("NAV/GPSRNAV "); } else if (v.contains("SIDS")) { rem.append("NAV/GPSRNAV "); }
if (v.contains("DEFAULT")) { rem.append("NAV/GPS "); } if (v.contains("DEFAULT")) { rem.append("NAV/GPS "); }
else if (v.contains("OCEANIC")) { rem.append("NAV/GPSOCEANIC "); } 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 "); } if (v.startsWith("A")) { rem.append("PER/A "); }
else if (v.startsWith("B")) { rem.append("PER/B "); } else if (v.startsWith("B")) { rem.append("PER/B "); }
else if (v.startsWith("C")) { rem.append("PER/C "); } else if (v.startsWith("C")) { rem.append("PER/C "); }
else if (v.startsWith("D")) { rem.append("PER/D "); } else if (v.startsWith("D")) { rem.append("PER/D "); }
else if (v.startsWith("E")) { rem.append("PER/E "); } 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(" "); 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); } if (!v.isEmpty()) { rem.append(v); }
rem = rem.simplified().trimmed(); rem = rem.simplified().trimmed();
this->ui->pte_RemarksGenerated->setPlainText(rem); ui->pte_RemarksGenerated->setPlainText(rem);
} }
void CFlightPlanComponent::ps_copyRemarks() 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"); CLogMessage(this).info("Copied remarks");
} }
void CFlightPlanComponent::ps_currentTabGenerator() void CFlightPlanComponent::ps_currentTabGenerator()
{ {
this->setCurrentWidget(this->ui->tb_RemarksGenerator); this->setCurrentWidget(ui->tb_RemarksGenerator);
} }
void CFlightPlanComponent::ps_swiftDataRead() void CFlightPlanComponent::ps_swiftDataRead()
@@ -551,8 +551,14 @@ namespace BlackGui
void CFlightPlanComponent::initCompleters() void CFlightPlanComponent::initCompleters()
{ {
if (!sGui || !sGui->getWebDataServices()) { return; } 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)); 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) QString CFlightPlanComponent::getDefaultFilename(bool load)

View File

@@ -75,28 +75,28 @@ namespace BlackGui
ui->setupUi(this); ui->setupUi(this);
this->m_logoffCountdownTimer = new QTimer(this); this->m_logoffCountdownTimer = new QTimer(this);
this->m_logoffCountdownTimer->setObjectName("CLoginComponent:m_logoffCountdownTimer"); this->m_logoffCountdownTimer->setObjectName("CLoginComponent:m_logoffCountdownTimer");
this->ui->pb_LogoffTimeout->setMaximum(LogoffIntervalSeconds); ui->pb_LogoffTimeout->setMaximum(LogoffIntervalSeconds);
this->ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds);
connect(this->m_logoffCountdownTimer, &QTimer::timeout, this, &CLoginComponent::ps_logoffCountdown); connect(this->m_logoffCountdownTimer, &QTimer::timeout, this, &CLoginComponent::ps_logoffCountdown);
setOkButtonString(false); setOkButtonString(false);
connect(this->ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CLoginComponent::ps_loginCancelled); connect(ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CLoginComponent::ps_loginCancelled);
connect(this->ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CLoginComponent::ps_toggleNetworkConnection); connect(ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CLoginComponent::ps_toggleNetworkConnection);
connect(this->ui->pb_OtherServersGotoSettings, &QPushButton::pressed, this, &CLoginComponent::requestNetworkSettings); connect(ui->pb_OtherServersGotoSettings, &QPushButton::pressed, this, &CLoginComponent::requestNetworkSettings);
this->ui->comp_FsdDetails->showEnableInfo(true); ui->comp_FsdDetails->showEnableInfo(true);
this->ui->comp_FsdDetails->setFsdSetupEnabled(false); ui->comp_FsdDetails->setFsdSetupEnabled(false);
this->ui->lblp_SimulatorModel->setToolTips("available", "unavailable"); ui->lblp_SimulatorModel->setToolTips("available", "unavailable");
this->ui->lblp_SimulatorModel->setPixmapUnticked(CIcons::empty()); ui->lblp_SimulatorModel->setPixmapUnticked(CIcons::empty());
this->ui->lblp_AircraftCombinedType->setToolTips("ok", "wrong"); ui->lblp_AircraftCombinedType->setToolTips("ok", "wrong");
this->ui->lblp_AircraftIcaoAirline->setToolTips("ok", "wrong"); ui->lblp_AircraftIcaoAirline->setToolTips("ok", "wrong");
this->ui->lblp_AircraftIcaoDesignator->setToolTips("ok", "wrong"); ui->lblp_AircraftIcaoDesignator->setToolTips("ok", "wrong");
this->ui->lblp_Callsign->setToolTips("ok", "wrong"); ui->lblp_Callsign->setToolTips("ok", "wrong");
this->ui->lblp_VatsimHomeAirport->setToolTips("ok", "wrong"); ui->lblp_VatsimHomeAirport->setToolTips("ok", "wrong");
this->ui->lblp_VatsimId->setToolTips("ok", "wrong"); ui->lblp_VatsimId->setToolTips("ok", "wrong");
this->ui->lblp_VatsimPassword->setToolTips("ok", "wrong"); ui->lblp_VatsimPassword->setToolTips("ok", "wrong");
this->ui->lblp_VatsimRealName->setToolTips("ok", "wrong"); ui->lblp_VatsimRealName->setToolTips("ok", "wrong");
// Stored data // Stored data
this->loadRememberedVatsimData(); this->loadRememberedVatsimData();
@@ -105,36 +105,36 @@ namespace BlackGui
// So I use no ranges in the CUpperCaseValidators, as this disables the signals for invalid values // So I use no ranges in the CUpperCaseValidators, as this disables the signals for invalid values
// VATSIM // 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); 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_VatsimHomeAirport, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateVatsimValues);
connect(ui->le_VatsimPassword, &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); connect(ui->le_VatsimRealName, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateVatsimValues);
// own aircraft // own aircraft
this->ui->le_Callsign->setMaxLength(LogoffIntervalSeconds); ui->le_Callsign->setMaxLength(LogoffIntervalSeconds);
this->ui->le_Callsign->setValidator(new CUpperCaseValidator(this)); ui->le_Callsign->setValidator(new CUpperCaseValidator(this));
connect(ui->le_Callsign, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); connect(ui->le_Callsign, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues);
this->ui->le_AircraftCombinedType->setMaxLength(3); ui->le_AircraftCombinedType->setMaxLength(3);
this->ui->le_AircraftCombinedType->setValidator(new CUpperCaseValidator(this)); ui->le_AircraftCombinedType->setValidator(new CUpperCaseValidator(this));
connect(ui->le_AircraftCombinedType, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); connect(ui->le_AircraftCombinedType, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues);
this->ui->le_AirlineIcaoDesignator->setMaxLength(5); ui->le_AirlineIcaoDesignator->setMaxLength(5);
this->ui->le_AirlineIcaoDesignator->setValidator(new CUpperCaseValidator(this)); ui->le_AirlineIcaoDesignator->setValidator(new CUpperCaseValidator(this));
connect(ui->le_AirlineIcaoDesignator, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); connect(ui->le_AirlineIcaoDesignator, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues);
this->ui->le_AircraftIcaoDesignator->setMaxLength(5); ui->le_AircraftIcaoDesignator->setMaxLength(5);
this->ui->le_AircraftIcaoDesignator->setValidator(new CUpperCaseValidator(this)); ui->le_AircraftIcaoDesignator->setValidator(new CUpperCaseValidator(this));
connect(ui->le_AircraftIcaoDesignator, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues); connect(ui->le_AircraftIcaoDesignator, &QLineEdit::editingFinished, this, &CLoginComponent::ps_validateAircraftValues);
connect(ui->tb_SimulatorIcaoReverseLookup, &QToolButton::clicked, this, &CLoginComponent::ps_reverseLookupModel); connect(ui->tb_SimulatorIcaoReverseLookup, &QToolButton::clicked, this, &CLoginComponent::ps_reverseLookupModel);
// server GUI element // server GUI element
this->ui->frp_CurrentServer->setReadOnly(true); ui->frp_CurrentServer->setReadOnly(true);
this->ui->frp_CurrentServer->showPasswordField(false); ui->frp_CurrentServer->showPasswordField(false);
connect(sGui->getIContextNetwork(), &IContextNetwork::webServiceDataRead, this, &CLoginComponent::ps_onWebServiceDataRead); connect(sGui->getIContextNetwork(), &IContextNetwork::webServiceDataRead, this, &CLoginComponent::ps_onWebServiceDataRead);
@@ -150,7 +150,7 @@ namespace BlackGui
otherServers.push_back(sGui->getGlobalSetup().getFsdTestServersPlusHardcodedServers()); otherServers.push_back(sGui->getGlobalSetup().getFsdTestServersPlusHardcodedServers());
CLogMessage(this).info("Added servers for testing"); CLogMessage(this).info("Added servers for testing");
} }
this->ui->comp_OtherServers->setServers(otherServers); ui->comp_OtherServers->setServers(otherServers);
} }
CLoginComponent::~CLoginComponent() CLoginComponent::~CLoginComponent()
@@ -187,19 +187,19 @@ namespace BlackGui
void CLoginComponent::ps_loginCancelled() void CLoginComponent::ps_loginCancelled()
{ {
this->m_logoffCountdownTimer->stop(); this->m_logoffCountdownTimer->stop();
this->ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds);
emit loginOrLogoffCancelled(); emit loginOrLogoffCancelled();
} }
void CLoginComponent::ps_toggleNetworkConnection() 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"); CLogMessage(this).validationError("No login possible from this very tab, use VATSIM or other servers");
return; return;
} }
const bool isConnected = sGui->getIContextNetwork()->isConnected(); 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 CServer currentServer; // used for login
CSimulatedAircraft ownAircraft; // used own aircraft CSimulatedAircraft ownAircraft; // used own aircraft
CStatusMessage msg; CStatusMessage msg;
@@ -281,7 +281,7 @@ namespace BlackGui
currentServer.setFsdSetup(fsd); currentServer.setFsdSetup(fsd);
} }
this->ui->frp_CurrentServer->setServer(currentServer); ui->frp_CurrentServer->setServer(currentServer);
sGui->getIContextOwnAircraft()->updateOwnAircraftPilot(currentServer.getUser()); sGui->getIContextOwnAircraft()->updateOwnAircraftPilot(currentServer.getUser());
// Login // Login
@@ -326,8 +326,8 @@ namespace BlackGui
if (vatsimFsdServers.isEmpty()) { return; } if (vatsimFsdServers.isEmpty()) { return; }
vatsimFsdServers.sortBy(&CServer::getName); vatsimFsdServers.sortBy(&CServer::getName);
const CServer currentServer = this->m_currentVatsimServer.get(); const CServer currentServer = this->m_currentVatsimServer.get();
this->ui->comp_VatsimServer->setServers(vatsimFsdServers, true); ui->comp_VatsimServer->setServers(vatsimFsdServers, true);
this->ui->comp_VatsimServer->preSelect(currentServer.getName()); ui->comp_VatsimServer->preSelect(currentServer.getName());
} }
else else
{ {
@@ -338,10 +338,10 @@ namespace BlackGui
void CLoginComponent::setGuiValuesFromAircraft(const CSimulatedAircraft &ownAircraft) void CLoginComponent::setGuiValuesFromAircraft(const CSimulatedAircraft &ownAircraft)
{ {
const CAircraftIcaoCode aircraftIcao = ownAircraft.getAircraftIcaoCode(); const CAircraftIcaoCode aircraftIcao = ownAircraft.getAircraftIcaoCode();
this->ui->le_Callsign->setText(ownAircraft.getCallsignAsString()); ui->le_Callsign->setText(ownAircraft.getCallsignAsString());
this->ui->le_AircraftIcaoDesignator->setText(aircraftIcao.getDesignator()); ui->le_AircraftIcaoDesignator->setText(aircraftIcao.getDesignator());
this->ui->le_AirlineIcaoDesignator->setText(ownAircraft.getAirlineIcaoCodeDesignator()); ui->le_AirlineIcaoDesignator->setText(ownAircraft.getAirlineIcaoCodeDesignator());
this->ui->le_AircraftCombinedType->setText(aircraftIcao.getCombinedType()); ui->le_AircraftCombinedType->setText(aircraftIcao.getCombinedType());
} }
void CLoginComponent::loadRememberedVatsimData() void CLoginComponent::loadRememberedVatsimData()
@@ -350,41 +350,41 @@ namespace BlackGui
const CUser lastUser = lastServer.getUser(); const CUser lastUser = lastServer.getUser();
if (lastUser.hasValidCallsign()) if (lastUser.hasValidCallsign())
{ {
this->ui->le_Callsign->setText(lastUser.getCallsign().asString()); ui->le_Callsign->setText(lastUser.getCallsign().asString());
this->ui->le_VatsimId->setText(lastUser.getId()); ui->le_VatsimId->setText(lastUser.getId());
this->ui->le_VatsimPassword->setText(lastUser.getPassword()); ui->le_VatsimPassword->setText(lastUser.getPassword());
this->ui->le_VatsimHomeAirport->setText(lastUser.getHomebase().asString()); ui->le_VatsimHomeAirport->setText(lastUser.getHomebase().asString());
this->ui->le_VatsimRealName->setText(lastUser.getRealName()); ui->le_VatsimRealName->setText(lastUser.getRealName());
} }
else else
{ {
this->ui->le_Callsign->setText("SWIFT"); ui->le_Callsign->setText("SWIFT");
this->ui->le_VatsimId->setText("1288459"); ui->le_VatsimId->setText("1288459");
this->ui->le_VatsimPassword->setText("4769"); ui->le_VatsimPassword->setText("4769");
this->ui->le_VatsimHomeAirport->setText("LOWI"); ui->le_VatsimHomeAirport->setText("LOWI");
this->ui->le_VatsimRealName->setText("Black Swift"); ui->le_VatsimRealName->setText("Black Swift");
} }
this->ui->comp_OtherServers->preSelect(lastServer.getName()); ui->comp_OtherServers->preSelect(lastServer.getName());
} }
CLoginComponent::CGuiAircraftValues CLoginComponent::getAircraftValuesFromGui() const CLoginComponent::CGuiAircraftValues CLoginComponent::getAircraftValuesFromGui() const
{ {
CGuiAircraftValues values; CGuiAircraftValues values;
values.ownCallsign = this->ui->le_Callsign->text().trimmed().toUpper(); values.ownCallsign = ui->le_Callsign->text().trimmed().toUpper();
values.ownAircraftIcaoTypeDesignator = CAircraftIcaoCode::normalizeDesignator(this->ui->le_AircraftIcaoDesignator->text()); values.ownAircraftIcaoTypeDesignator = CAircraftIcaoCode::normalizeDesignator(ui->le_AircraftIcaoDesignator->text());
values.ownAircraftIcaoAirline = CAirlineIcaoCode::normalizeDesignator(this->ui->le_AirlineIcaoDesignator->text()); values.ownAircraftIcaoAirline = CAirlineIcaoCode::normalizeDesignator(ui->le_AirlineIcaoDesignator->text());
values.ownAircraftCombinedType = this->ui->le_AircraftCombinedType->text().trimmed().toUpper(); values.ownAircraftCombinedType = ui->le_AircraftCombinedType->text().trimmed().toUpper();
values.ownAircraftSimulatorModel = this->ui->le_SimulatorModel->text().trimmed().toUpper(); values.ownAircraftSimulatorModel = ui->le_SimulatorModel->text().trimmed().toUpper();
return values; return values;
} }
CLoginComponent::CVatsimValues CLoginComponent::getVatsimValuesFromGui() const CLoginComponent::CVatsimValues CLoginComponent::getVatsimValuesFromGui() const
{ {
CVatsimValues values; CVatsimValues values;
values.vatsimHomeAirport = this->ui->le_VatsimHomeAirport->text().trimmed().toUpper(); values.vatsimHomeAirport = ui->le_VatsimHomeAirport->text().trimmed().toUpper();
values.vatsimId = this->ui->le_VatsimId->text().trimmed(); values.vatsimId = ui->le_VatsimId->text().trimmed();
values.vatsimPassword = this->ui->le_VatsimPassword->text().trimmed(); values.vatsimPassword = ui->le_VatsimPassword->text().trimmed();
values.vatsimRealName = this->ui->le_VatsimRealName->text().simplified().trimmed(); values.vatsimRealName = ui->le_VatsimRealName->text().simplified().trimmed();
return values; return values;
} }
@@ -398,37 +398,37 @@ namespace BlackGui
CCallsign CLoginComponent::getCallsignFromGui() const CCallsign CLoginComponent::getCallsignFromGui() const
{ {
CCallsign cs(this->ui->le_Callsign->text().trimmed().toUpper()); CCallsign cs(ui->le_Callsign->text().trimmed().toUpper());
return cs; return cs;
} }
CServer CLoginComponent::getCurrentVatsimServer() const CServer CLoginComponent::getCurrentVatsimServer() const
{ {
return this->ui->comp_VatsimServer->currentServer(); return ui->comp_VatsimServer->currentServer();
} }
CServer CLoginComponent::getCurrentOtherServer() const CServer CLoginComponent::getCurrentOtherServer() const
{ {
return this->ui->comp_OtherServers->currentServer(); return ui->comp_OtherServers->currentServer();
} }
void CLoginComponent::setOkButtonString(bool connected) void CLoginComponent::setOkButtonString(bool connected)
{ {
QString s = connected ? "Disconnect" : "Connect"; 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) void CLoginComponent::setGuiVisibility(bool connected)
{ {
this->ui->gbp_LoginMode->setVisible(!connected); ui->gbp_LoginMode->setVisible(!connected);
this->ui->gb_OwnAircraft->setVisible(!connected); ui->gb_OwnAircraft->setVisible(!connected);
this->ui->gb_Network->setVisible(!connected); ui->gb_Network->setVisible(!connected);
this->ui->fr_LogoffConfirmation->setVisible(connected); ui->fr_LogoffConfirmation->setVisible(connected);
} }
void CLoginComponent::startLogoffTimerCountdown() void CLoginComponent::startLogoffTimerCountdown()
{ {
this->ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds); ui->pb_LogoffTimeout->setValue(LogoffIntervalSeconds);
this->m_logoffCountdownTimer->setInterval(1000); this->m_logoffCountdownTimer->setInterval(1000);
this->m_logoffCountdownTimer->start(); this->m_logoffCountdownTimer->start();
} }
@@ -444,7 +444,7 @@ namespace BlackGui
if (simulating) if (simulating)
{ {
model = sGui->getIContextOwnAircraft()->getOwnAircraft().getModel(); model = sGui->getIContextOwnAircraft()->getOwnAircraft().getModel();
this->ui->le_SimulatorModel->setText(model.getModelString()); ui->le_SimulatorModel->setText(model.getModelString());
} }
else else
{ {
@@ -453,8 +453,8 @@ namespace BlackGui
CAircraftIcaoCode("C172", "L1P", "Cessna", "172", "L", true, false, false, 0)); CAircraftIcaoCode("C172", "L1P", "Cessna", "172", "L", true, false, false, 0));
model = this->m_currentAircraftModel.get(); model = this->m_currentAircraftModel.get();
if (!model.hasAircraftDesignator()) { model = defaultModel; } if (!model.hasAircraftDesignator()) { model = defaultModel; }
this->ui->gbp_LoginMode->setLoginMode(INetwork::LoginNormal); //! \todo Set observer mode without simulator, currently not working in OBS mode 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->le_SimulatorModel->setText("No simulator");
} }
if (model.hasAircraftDesignator()) if (model.hasAircraftDesignator())
@@ -465,17 +465,17 @@ namespace BlackGui
void CLoginComponent::setGuiIcaoValues(const CAircraftModel &model, bool onlyIfEmpty) 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(); this->ps_validateAircraftValues();
} }
@@ -485,19 +485,19 @@ namespace BlackGui
CGuiAircraftValues values = getAircraftValuesFromGui(); CGuiAircraftValues values = getAircraftValuesFromGui();
const bool validCombinedType = CAircraftIcaoCode::isValidCombinedType(values.ownAircraftCombinedType); 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); 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); 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); const bool validCallsign = CCallsign::isValidAircraftCallsign(values.ownCallsign);
this->ui->lblp_Callsign->setTicked(validCallsign); ui->lblp_Callsign->setTicked(validCallsign);
const bool validSimulatorModel = !values.ownAircraftSimulatorModel.isEmpty(); const bool validSimulatorModel = !values.ownAircraftSimulatorModel.isEmpty();
this->ui->lblp_SimulatorModel->setTicked(validSimulatorModel); ui->lblp_SimulatorModel->setTicked(validSimulatorModel);
// model intentionally ignored // model intentionally ignored
return validCombinedType && validAirlineDesignator && validIcaoDesignator && validCallsign; return validCombinedType && validAirlineDesignator && validIcaoDesignator && validCallsign;
@@ -508,16 +508,16 @@ namespace BlackGui
CVatsimValues values = getVatsimValuesFromGui(); CVatsimValues values = getVatsimValuesFromGui();
const bool validVatsimId = CUser::isValidVatsimId(values.vatsimId); 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); 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(); const bool validVatsimPassword = !values.vatsimPassword.isEmpty();
this->ui->lblp_VatsimPassword->setTicked(validVatsimPassword); ui->lblp_VatsimPassword->setTicked(validVatsimPassword);
const bool validRealUserName = !values.vatsimRealName.isEmpty(); const bool validRealUserName = !values.vatsimRealName.isEmpty();
this->ui->lblp_VatsimRealName->setTicked(validRealUserName); ui->lblp_VatsimRealName->setTicked(validRealUserName);
return validVatsimId && validHomeAirport && validVatsimPassword && validRealUserName; return validVatsimId && validHomeAirport && validVatsimPassword && validRealUserName;
} }
@@ -525,15 +525,15 @@ namespace BlackGui
void CLoginComponent::ps_reloadSettings() void CLoginComponent::ps_reloadSettings()
{ {
CServerList otherServers(this->m_otherTrafficNetworkServers.getThreadLocal()); CServerList otherServers(this->m_otherTrafficNetworkServers.getThreadLocal());
this->ui->comp_OtherServers->setServers(otherServers); ui->comp_OtherServers->setServers(otherServers);
} }
void CLoginComponent::ps_logoffCountdown() void CLoginComponent::ps_logoffCountdown()
{ {
int v = this->ui->pb_LogoffTimeout->value(); int v = ui->pb_LogoffTimeout->value();
v -= 1; v -= 1;
if (v < 0) { v = 0; } if (v < 0) { v = 0; }
this->ui->pb_LogoffTimeout->setValue(v); ui->pb_LogoffTimeout->setValue(v);
if (v <= 0) if (v <= 0)
{ {
this->m_logoffCountdownTimer->stop(); this->m_logoffCountdownTimer->stop();
@@ -564,8 +564,6 @@ namespace BlackGui
// completers where possible // completers where possible
if (sGui && sGui->getWebDataServices()) if (sGui && sGui->getWebDataServices())
{ {
//! \todo fill in when airports are ready
if (entity.testFlag(CEntityFlags::AircraftIcaoEntity) && !ui->le_AircraftIcaoDesignator->completer()) if (entity.testFlag(CEntityFlags::AircraftIcaoEntity) && !ui->le_AircraftIcaoDesignator->completer())
{ {
const QStringList aircraftDesignators = sGui->getWebDataServices()->getAircraftIcaoCodes().toCompleterStrings(); const QStringList aircraftDesignators = sGui->getWebDataServices()->getAircraftIcaoCodes().toCompleterStrings();
@@ -593,6 +591,20 @@ namespace BlackGui
completer->popup()->setMinimumWidth(175); 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 } // namespace

View File

@@ -159,6 +159,7 @@ namespace BlackGui
//! Set ICAO values //! Set ICAO values
void setGuiIcaoValues(const BlackMisc::Simulation::CAircraftModel &model, bool onlyIfEmpty); void setGuiIcaoValues(const BlackMisc::Simulation::CAircraftModel &model, bool onlyIfEmpty);
//! Completers
void initCompleters(BlackMisc::Network::CEntityFlags::Entity entity); void initCompleters(BlackMisc::Network::CEntityFlags::Entity entity);
QScopedPointer<Ui::CLoginComponent> ui; QScopedPointer<Ui::CLoginComponent> ui;

View File

@@ -63,7 +63,7 @@ namespace BlackMisc
const CAirportIcaoCode &getIcao() const { return m_icao; } const CAirportIcaoCode &getIcao() const { return m_icao; }
//! Get ICAO code as string. //! Get ICAO code as string.
QString getIcaoAsString() const { return m_icao.asString(); } const QString &getIcaoAsString() const { return m_icao.asString(); }
//! Set ICAO code. //! Set ICAO code.
void setIcao(const CAirportIcaoCode &icao) { m_icao = icao; } 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; } void setPosition(const BlackMisc::Geo::CCoordinateGeodetic &position) { this->m_position = position; }
//! Get the country //! Get the country
const CCountry& getCountry() const { return m_country; } const CCountry &getCountry() const { return m_country; }
//! Set the country //! Set the country
void setCountry(const CCountry &country) { this->m_country = country; } void setCountry(const CCountry &country) { this->m_country = country; }

View File

@@ -21,7 +21,6 @@ namespace BlackMisc
{ {
namespace Aviation namespace Aviation
{ {
CAirportList::CAirportList() { } CAirportList::CAirportList() { }
CAirportList::CAirportList(const CSequence<CAirport> &other) : CAirportList::CAirportList(const CSequence<CAirport> &other) :
@@ -44,11 +43,27 @@ namespace BlackMisc
return this->findFirstByOrDefault(&CAirport::getIcao, icao, ifNotFound); 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) void CAirportList::convertFromDatabaseJson(const QJsonArray &json)
{ {
clear(); clear();
for (const QJsonValue &value : json)
for (const QJsonValue& value: json)
{ {
QJsonObject object = value.toObject(); QJsonObject object = value.toObject();
CAirport airport; CAirport airport;
@@ -56,6 +71,5 @@ namespace BlackMisc
push_back(airport); push_back(airport);
} }
} }
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -50,9 +50,11 @@ namespace BlackMisc
//! Find first station by callsign, if not return given value / default //! Find first station by callsign, if not return given value / default
CAirport findFirstByIcao(const CAirportIcaoCode &icao, const CAirport &ifNotFound = CAirport()) const; 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 //! Reads the airport list from database JSON
void convertFromDatabaseJson(const QJsonArray& json); void convertFromDatabaseJson(const QJsonArray& json);
}; };
} //namespace } //namespace
} // namespace } // namespace