diff --git a/src/blackgui/components/cockpittranspondermodeledscomponent.cpp b/src/blackgui/components/cockpittranspondermodeledscomponent.cpp index 3d8cb2598..9d1d17792 100644 --- a/src/blackgui/components/cockpittranspondermodeledscomponent.cpp +++ b/src/blackgui/components/cockpittranspondermodeledscomponent.cpp @@ -35,17 +35,18 @@ namespace BlackGui m_ledIdent(new CLedWidget(false, CLedWidget::Yellow, CLedWidget::Black, CLedWidget::Rounded, "ident", "", LedWidth, this)) { this->init(true); - connect(sGui->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftCockpit, this, &CCockpitTransponderModeLedsComponent::ps_onAircraftCockpitChanged); - this->setMode(getOwnTransponder().getTransponderMode()); + + Q_ASSERT_X(sGui, Q_FUNC_INFO, "Need sGui"); + connect(sGui->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftCockpit, this, &CCockpitTransponderModeLedsComponent::onAircraftCockpitChanged); } - void CCockpitTransponderModeLedsComponent::ps_onAircraftCockpitChanged(const CSimulatedAircraft &aircraft, const BlackMisc::CIdentifier &originator) + void CCockpitTransponderModeLedsComponent::onAircraftCockpitChanged(const CSimulatedAircraft &aircraft, const BlackMisc::CIdentifier &originator) { if (isMyIdentifier(originator)) { return; } - this->setMode(aircraft.getTransponderMode()); + this->setMode(aircraft.getTransponderMode(), true); } - void CCockpitTransponderModeLedsComponent::ps_onLedClicked() + void CCockpitTransponderModeLedsComponent::onLedClicked() { QWidget *w = qobject_cast(QObject::sender()); if (!w) { return; } @@ -70,10 +71,14 @@ namespace BlackGui CSimulatedAircraft ownAircraft(this->getOwnAircraft()); if (ownAircraft.getTransponderMode() == mode) { return; } - this->setMode(mode); + this->setMode(mode, true); CTransponder xpdr = ownAircraft.getTransponder(); xpdr.setTransponderMode(mode); - sGui->getIContextOwnAircraft()->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), xpdr, identifier()); + + if (sGui) + { + sGui->getIContextOwnAircraft()->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), xpdr, identifier()); + } } void CCockpitTransponderModeLedsComponent::init(bool horizontal) @@ -92,11 +97,12 @@ namespace BlackGui this->setLayout(ledLayout); // if context is already available set mode - if (sGui->getIContextOwnAircraft()) { this->setMode(getOwnTransponder().getTransponderMode()); } + if (sGui && sGui->getIContextOwnAircraft()) { this->setMode(getOwnTransponder().getTransponderMode(), true); } } - void CCockpitTransponderModeLedsComponent::setMode(BlackMisc::Aviation::CTransponder::TransponderMode mode) + void CCockpitTransponderModeLedsComponent::setMode(CTransponder::TransponderMode mode, bool force) { + if (!force && m_mode == mode) { return; } m_ledStandby->setOn(false); m_ledModes->setOn(false); m_ledIdent->setOn(false); @@ -126,13 +132,14 @@ namespace BlackGui CTransponder CCockpitTransponderModeLedsComponent::getOwnTransponder() const { + if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return CTransponder(); } return sGui->getIContextOwnAircraft()->getOwnAircraft().getTransponder(); } CSimulatedAircraft CCockpitTransponderModeLedsComponent::getOwnAircraft() const { + if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return CSimulatedAircraft(); } return sGui->getIContextOwnAircraft()->getOwnAircraft(); } - } // namespace } // namespace diff --git a/src/blackgui/components/cockpittranspondermodeledscomponent.h b/src/blackgui/components/cockpittranspondermodeledscomponent.h index 267dcb6f4..8167933b9 100644 --- a/src/blackgui/components/cockpittranspondermodeledscomponent.h +++ b/src/blackgui/components/cockpittranspondermodeledscomponent.h @@ -38,28 +38,28 @@ namespace BlackGui //! Constructor explicit CCockpitTransponderModeLedsComponent(QWidget *parent = nullptr); - private slots: - //! \copydoc IContextOwnAircraft::changedAircraftCockpit - void ps_onAircraftCockpitChanged(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const BlackMisc::CIdentifier &originator); - - //! LED clicked - void ps_onLedClicked(); + //! Set the mode + void setMode(BlackMisc::Aviation::CTransponder::TransponderMode mode, bool force = false); private: - const int LedWidth = 14; //!< LED width + static constexpr int LedWidth = 14; //!< LED width + + //! \copydoc IContextOwnAircraft::changedAircraftCockpit + void onAircraftCockpitChanged(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const BlackMisc::CIdentifier &originator); + + //! LED clicked + void onLedClicked(); //! Init either in horizontal or vertical layout void init(bool horizontal); - //! Set the mode - void setMode(BlackMisc::Aviation::CTransponder::TransponderMode mode); - //! Own Transponder BlackMisc::Aviation::CTransponder getOwnTransponder() const; //! Own Aircraft BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const; + BlackMisc::Aviation::CTransponder::TransponderMode m_mode = BlackMisc::Aviation::CTransponder::StateStandby; QScopedPointer m_ledStandby; QScopedPointer m_ledModes; QScopedPointer m_ledIdent;