diff --git a/src/blackgui/components/flightplancomponent.cpp b/src/blackgui/components/flightplancomponent.cpp index 65fec1900..3c925c301 100644 --- a/src/blackgui/components/flightplancomponent.cpp +++ b/src/blackgui/components/flightplancomponent.cpp @@ -103,6 +103,7 @@ namespace BlackGui connect(ui->pb_Load, &QPushButton::pressed, this, &CFlightPlanComponent::loadFlightPlanFromNetwork); connect(ui->pb_Reset, &QPushButton::pressed, this, &CFlightPlanComponent::resetFlightPlan); connect(ui->pb_ValidateFlightPlan, &QPushButton::pressed, this, &CFlightPlanComponent::validateFlightPlan); + connect(ui->tb_SyncWithSimulator, &QPushButton::released, this, &CFlightPlanComponent::syncWithSimulator); connect(ui->pb_Prefill, &QPushButton::pressed, this, &CFlightPlanComponent::anticipateValues); connect(ui->cb_VoiceCapabilities, &QComboBox::currentTextChanged, this, &CFlightPlanComponent::currentTextChangedToBuildRemarks); @@ -143,18 +144,23 @@ namespace BlackGui this->buildRemarksString(); // prefill some data derived from what was used last - if (sGui->getIContextSimulator()->isSimulatorSimulating()) + const QPointer myself(this); + QTimer::singleShot(2500, this, [ = ] { - this->prefillWithOwnAircraftData(); - } - else - { - const CAircraftModel model = m_lastAircraftModel.get(); - const CServer server = m_lastServer.get(); - CSimulatedAircraft aircraft(model); - aircraft.setPilot(server.getUser()); - this->prefillWithAircraftData(aircraft); - } + if (!sGui || sGui->isShuttingDown() || !myself) { return; } + if (sGui->getIContextSimulator()->isSimulatorAvailable()) + { + this->prefillWithOwnAircraftData(); + } + else + { + const CAircraftModel model = m_lastAircraftModel.get(); + const CServer server = m_lastServer.get(); + CSimulatedAircraft aircraft(model); + aircraft.setPilot(server.getUser()); + this->prefillWithAircraftData(aircraft); + } + }); } CFlightPlanComponent::~CFlightPlanComponent() @@ -175,9 +181,9 @@ namespace BlackGui this->prefillWithAircraftData(ownAircraft); } - void CFlightPlanComponent::prefillWithAircraftData(const CSimulatedAircraft &aircraft) + void CFlightPlanComponent::prefillWithAircraftData(const CSimulatedAircraft &aircraft, bool force) { - if (m_sentFlightPlan.wasSentOrLoaded()) { return; } + if (!force && m_sentFlightPlan.wasSentOrLoaded()) { return; } // only override with valid values if (CCallsign::isValidAircraftCallsign(aircraft.getCallsignAsString())) @@ -256,7 +262,7 @@ namespace BlackGui v = ui->le_Callsign->text().trimmed().toUpper(); if (v.isEmpty()) { - messages.push_back(CStatusMessage(this).validationError("Missing '%1'") << ui->lbl_Callsign->text()); + // messages.push_back(CStatusMessage(this).validationError("Missing '%1'") << ui->lbl_Callsign->text()); } else if (!CCallsign::isValidAircraftCallsign(v)) { @@ -508,6 +514,8 @@ namespace BlackGui } CFlightPlan fp; this->validateAndInitializeFlightPlan(fp); // get data + + // save as CVariant format const CVariant variantFp = CVariant::fromValue(fp); const QString json(variantFp.toJsonString()); const bool ok = CFileUtils::writeStringToFile(json, fileName); @@ -635,10 +643,10 @@ namespace BlackGui { if (ui->cb_Heavy->isChecked()) { - const QPointer guard(this); + const QPointer myself(this); QTimer::singleShot(10, this, [ = ] { - if (guard.isNull()) { return; } + if (!myself) { return; } ui->cb_Tcas->setChecked(false); this->buildPrefixIcaoSuffix(); }); @@ -666,8 +674,10 @@ namespace BlackGui { const CAircraftIcaoCode icao = this->getAircraftIcaoCode(); if (!icao.isLoadedFromDb()) { return; } + QPointer myself(this); QTimer::singleShot(25, this, [ = ] { + if (!myself || !sGui || sGui->isShuttingDown()) { return; } const bool heavy = icao.getWtc().startsWith("H"); ui->cb_Heavy->setChecked(heavy); if (heavy) { ui->cb_Tcas->setChecked(false); } @@ -675,6 +685,16 @@ namespace BlackGui }); } + void CFlightPlanComponent::syncWithSimulator() + { + if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return; } + const QMessageBox::StandardButton reply = QMessageBox::question(this, QStringLiteral("Override aircraft data"), QStringLiteral("Override aircraft ICAO data from simulator"), QMessageBox::Yes | QMessageBox::No); + if (reply != QMessageBox::Yes) { return; } + + const CSimulatedAircraft aircraft = sGui->getIContextOwnAircraft()->getOwnAircraft(); + this->prefillWithAircraftData(aircraft, true); + } + QString CFlightPlanComponent::getPrefix() const { if (ui->cb_Heavy->isChecked()) { return QStringLiteral("H"); } diff --git a/src/blackgui/components/flightplancomponent.h b/src/blackgui/components/flightplancomponent.h index a4fcf3bf2..2fecf99d4 100644 --- a/src/blackgui/components/flightplancomponent.h +++ b/src/blackgui/components/flightplancomponent.h @@ -67,11 +67,11 @@ namespace BlackGui QScopedPointer ui; CAltitudeDialog *m_altitudeDialog = nullptr; BlackMisc::Aviation::CFlightPlan m_sentFlightPlan; //!< My flight plan - BlackMisc::Simulation::CAircraftModel m_model; //!< currently used model + BlackMisc::Simulation::CAircraftModel m_model; //!< currently used model BlackMisc::CIdentifier m_identifier { "FlightPlanComponent", this }; //!< Flightplan identifier BlackMisc::CSetting m_directories { this }; //!< the swift directories BlackMisc::CDataReadOnly m_lastAircraftModel { this }; //!< recently used aircraft model - BlackMisc::CDataReadOnly m_lastServer { this }; //!< recently used server (VATSIM, other) + BlackMisc::CDataReadOnly m_lastServer { this }; //!< recently used server (VATSIM, other) static constexpr int OverlayMessageMs = 5000; @@ -91,7 +91,7 @@ namespace BlackGui void prefillWithOwnAircraftData(); //! Prefill with aircraft data - void prefillWithAircraftData(const BlackMisc::Simulation::CSimulatedAircraft &aircraft); + void prefillWithAircraftData(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool force = false); //! Prefill with user data void prefillWithUserData(const BlackMisc::Network::CUser &user); @@ -153,6 +153,9 @@ namespace BlackGui //! Aircraft type changed void aircraftTypeChanged(); + //! Sync.with simulator + void syncWithSimulator(); + //! Get prefix QString getPrefix() const;