From 8dc25fbad755126bcbb4c82a0c63f75250cb2e48 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 13 Feb 2018 03:57:46 +0100 Subject: [PATCH] Allow to alter model set simulator in pilot client * selector can be read only * functions in context to obtain model set from loader/matcher, this will not be used when a plugin driver is present * adjusted UI --- src/blackcore/context/contextsimulator.h | 7 +++ src/blackcore/context/contextsimulatorempty.h | 16 +++++- .../context/contextsimulatorimpl.cpp | 15 ++++++ src/blackcore/context/contextsimulatorimpl.h | 2 + .../context/contextsimulatorproxy.cpp | 10 ++++ src/blackcore/context/contextsimulatorproxy.h | 2 + src/blackgui/components/mappingcomponent.cpp | 51 ++++++++++++++++++- src/blackgui/components/mappingcomponent.h | 9 ++++ src/blackgui/components/mappingcomponent.ui | 16 ++++++ src/blackgui/components/simulatorselector.cpp | 10 ++++ src/blackgui/components/simulatorselector.h | 3 ++ 11 files changed, 139 insertions(+), 2 deletions(-) diff --git a/src/blackcore/context/contextsimulator.h b/src/blackcore/context/contextsimulator.h index 1e6936e00..6e0287237 100644 --- a/src/blackcore/context/contextsimulator.h +++ b/src/blackcore/context/contextsimulator.h @@ -148,6 +148,13 @@ namespace BlackCore //! \note might be slow since list can be big virtual BlackMisc::Simulation::CAircraftModelList getModelSet() const = 0; + //! Get the model set loader simulator directly + virtual BlackMisc::Simulation::CSimulatorInfo getModelSetLoaderSimulator() const = 0; + + //! Set the model set loader simulator directly + //! \note for testing purposes + virtual void setModelSetLoaderSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator) = 0; + //! Simulators which have an initialized model set virtual BlackMisc::Simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const = 0; diff --git a/src/blackcore/context/contextsimulatorempty.h b/src/blackcore/context/contextsimulatorempty.h index 39ccebd96..177289615 100644 --- a/src/blackcore/context/contextsimulatorempty.h +++ b/src/blackcore/context/contextsimulatorempty.h @@ -87,6 +87,20 @@ namespace BlackCore return BlackMisc::Simulation::CSimulatorInfo(); } + //! \copydoc IContextSimulator::getModelSetLoaderSimulator + virtual BlackMisc::Simulation::CSimulatorInfo getModelSetLoaderSimulator() const override + { + logEmptyContextWarning(Q_FUNC_INFO); + return BlackMisc::Simulation::CSimulatorInfo(); + } + + //! \copydoc IContextSimulator::setModelSetLoaderSimulator + virtual void setModelSetLoaderSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator) override + { + Q_UNUSED(simulator); + logEmptyContextWarning(Q_FUNC_INFO); + } + //! \copydoc IContextSimulator::getModelSetStrings virtual QStringList getModelSetStrings() const override { @@ -94,7 +108,7 @@ namespace BlackCore return QStringList(); } - //! \copydoc IContextSimulator::getModelSetStrings + //! \copydoc IContextSimulator::getModelSetCompleterStrings virtual QStringList getModelSetCompleterStrings(bool sorted) const override { Q_UNUSED(sorted); diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index 30f0b5bb8..c047f0004 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -163,6 +163,21 @@ namespace BlackCore return m_aircraftMatcher.getModelSet(); } + CSimulatorInfo CContextSimulator::getModelSetLoaderSimulator() const + { + if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + return m_modelSetLoader.getSimulator(); + } + + void CContextSimulator::setModelSetLoaderSimulator(const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Need single simulator"); + if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + if (this->isSimulatorAvailable()) { return; } + m_modelSetLoader.setSimulator(simulator); + m_aircraftMatcher.setModelSet(m_modelSetLoader.getAircraftModels(), simulator); + } + CSimulatorInfo CContextSimulator::simulatorsWithInitializedModelSet() const { if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } diff --git a/src/blackcore/context/contextsimulatorimpl.h b/src/blackcore/context/contextsimulatorimpl.h index 858246325..a316780e6 100644 --- a/src/blackcore/context/contextsimulatorimpl.h +++ b/src/blackcore/context/contextsimulatorimpl.h @@ -84,6 +84,8 @@ namespace BlackCore virtual BlackMisc::Simulation::CSimulatorInternals getSimulatorInternals() const override; virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; virtual BlackMisc::Simulation::CAircraftModelList getModelSet() const override; + virtual BlackMisc::Simulation::CSimulatorInfo getModelSetLoaderSimulator() const override; + virtual void setModelSetLoaderSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual BlackMisc::Simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const override; virtual QStringList getModelSetStrings() const override; virtual QStringList getModelSetCompleterStrings(bool sorted) const override; diff --git a/src/blackcore/context/contextsimulatorproxy.cpp b/src/blackcore/context/contextsimulatorproxy.cpp index 5fbbadf4d..5c0fd33b4 100644 --- a/src/blackcore/context/contextsimulatorproxy.cpp +++ b/src/blackcore/context/contextsimulatorproxy.cpp @@ -107,6 +107,16 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1String("simulatorsWithInitializedModelSet")); } + CSimulatorInfo CContextSimulatorProxy::getModelSetLoaderSimulator() const + { + return m_dBusInterface->callDBusRet(QLatin1String("getModelSetLoaderSimulator")); + } + + void CContextSimulatorProxy::setModelSetLoaderSimulator(const CSimulatorInfo &simulator) + { + m_dBusInterface->callDBus(QLatin1String("setModelSetLoaderSimulator"), simulator); + } + QStringList CContextSimulatorProxy::getModelSetStrings() const { return m_dBusInterface->callDBusRet(QLatin1String("getModelSetStrings")); diff --git a/src/blackcore/context/contextsimulatorproxy.h b/src/blackcore/context/contextsimulatorproxy.h index 12d0fb062..4c785ac19 100644 --- a/src/blackcore/context/contextsimulatorproxy.h +++ b/src/blackcore/context/contextsimulatorproxy.h @@ -65,6 +65,8 @@ namespace BlackCore virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; virtual BlackMisc::Simulation::CAircraftModelList getModelSet() const override; virtual BlackMisc::Simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const override; + virtual BlackMisc::Simulation::CSimulatorInfo getModelSetLoaderSimulator() const override; + virtual void setModelSetLoaderSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual QStringList getModelSetStrings() const override; virtual QStringList getModelSetCompleterStrings(bool sorted) const override; virtual BlackMisc::Simulation::CAircraftModelList getModelSetModelsStartingWith(const QString &modelString) const override; diff --git a/src/blackgui/components/mappingcomponent.cpp b/src/blackgui/components/mappingcomponent.cpp index 3e23eff25..f3334c79a 100644 --- a/src/blackgui/components/mappingcomponent.cpp +++ b/src/blackgui/components/mappingcomponent.cpp @@ -114,11 +114,19 @@ namespace BlackGui ui->tvp_AircraftModels->setDisplayAutomatically(false); this->settingsChanged(); + // selector + ui->comp_SimulatorSelector->setRememberSelection(false); + ui->comp_SimulatorSelector->setMode(CSimulatorSelector::RadioButtons); + this->setSimulatorSelector(); + connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this, &CMappingComponent::onModelSetSimulatorChanged); + + // connect connect(sGui->getIContextSimulator(), &IContextSimulator::modelSetChanged, this, &CMappingComponent::onModelSetChanged); connect(sGui->getIContextSimulator(), &IContextSimulator::modelMatchingCompleted, this, &CMappingComponent::tokenBucketUpdateAircraft); connect(sGui->getIContextSimulator(), &IContextSimulator::aircraftRenderingChanged, this, &CMappingComponent::tokenBucketUpdateAircraft); connect(sGui->getIContextSimulator(), &IContextSimulator::airspaceSnapshotHandled, this, &CMappingComponent::tokenBucketUpdate); connect(sGui->getIContextSimulator(), &IContextSimulator::addingRemoteModelFailed, this, &CMappingComponent::addingRemoteAircraftFailed); + connect(sGui->getIContextSimulator(), &IContextSimulator::simulatorPluginChanged, this, &CMappingComponent::onPluginChanged); connect(sGui->getIContextNetwork(), &IContextNetwork::changedRemoteAircraftModel, this, &CMappingComponent::onRemoteAircraftModelChanged); connect(sGui->getIContextNetwork(), &IContextNetwork::changedRemoteAircraftEnabled, this, &CMappingComponent::tokenBucketUpdateAircraft); connect(sGui->getIContextNetwork(), &IContextNetwork::changedFastPositionUpdates, this, &CMappingComponent::tokenBucketUpdateAircraft); @@ -250,6 +258,45 @@ namespace BlackGui return callsign; } + void CMappingComponent::setSimulatorSelector() + { + if (sGui && sGui->supportsContexts() && sGui->getIContextSimulator()) + { + const CSimulatorPluginInfo pluginInfo = sGui->getIContextSimulator()->getSimulatorPluginInfo(); + if (pluginInfo.isValid()) + { + ui->comp_SimulatorSelector->setValue(pluginInfo.getSimulator()); + ui->comp_SimulatorSelector->setReadOnly(true); + } + else + { + ui->comp_SimulatorSelector->setReadOnly(false); + const CSimulatorInfo simulator = sGui->getIContextSimulator()->getModelSetLoaderSimulator(); + if (simulator.isSingleSimulator()) + { + ui->comp_SimulatorSelector->setValue(simulator); + } + } + } + else + { + ui->comp_SimulatorSelector->setReadOnly(false); + } + } + + void CMappingComponent::onModelSetSimulatorChanged(const CSimulatorInfo &simulator) + { + if (!sGui || !sGui->supportsContexts()) { return; } + if (sGui->getIContextSimulator()->isSimulatorAvailable()) { return; } + sGui->getIContextSimulator()->setModelSetLoaderSimulator(simulator); + } + + void CMappingComponent::onPluginChanged(const CSimulatorPluginInfo &pluginInfo) + { + Q_UNUSED(pluginInfo); + QTimer::singleShot(0, this, &CMappingComponent::setSimulatorSelector); + } + void CMappingComponent::onSaveAircraft() { if (!sGui->getIContextSimulator()->isSimulatorSimulating()) { return; } @@ -334,6 +381,7 @@ namespace BlackGui void CMappingComponent::onModelsUpdateRequested() { + Q_ASSERT_X(sGui, Q_FUNC_INFO, "Need sGui"); const CAircraftModelList ml(sGui->getIContextSimulator()->getModelSet()); ui->tvp_AircraftModels->updateContainerMaybeAsync(ml); } @@ -432,7 +480,7 @@ namespace BlackGui m_updateTimer.setInterval(ms); } - void CMappingComponent::connectionStatusChanged(BlackCore::INetwork::ConnectionStatus from, BlackCore::INetwork::ConnectionStatus to) + void CMappingComponent::connectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to) { Q_UNUSED(from); if (INetwork::isDisconnectedStatus(to)) @@ -442,6 +490,7 @@ namespace BlackGui } else if (INetwork::isConnectedStatus(to)) { + ui->comp_SimulatorSelector->setReadOnly(true); m_updateTimer.start(); } } diff --git a/src/blackgui/components/mappingcomponent.h b/src/blackgui/components/mappingcomponent.h index 3f511d7d2..e6990dae6 100644 --- a/src/blackgui/components/mappingcomponent.h +++ b/src/blackgui/components/mappingcomponent.h @@ -148,6 +148,15 @@ namespace BlackGui //! Check callsign entered BlackMisc::Aviation::CCallsign validateRenderedCallsign(); + //! Set the status of the simulator + void setSimulatorSelector(); + + //! Changed selector + void onModelSetSimulatorChanged(const BlackMisc::Simulation::CSimulatorInfo &simulator); + + //! Plugin info has been changed + void onPluginChanged(const BlackMisc::Simulation::CSimulatorPluginInfo &pluginInfo); + static constexpr int OverlayMessageMs = 5000; QScopedPointer ui; bool m_missedRenderedAircraftUpdate = true; //! Rendered aircraft need update diff --git a/src/blackgui/components/mappingcomponent.ui b/src/blackgui/components/mappingcomponent.ui index 6eb2779f7..2b7c6cbb9 100644 --- a/src/blackgui/components/mappingcomponent.ui +++ b/src/blackgui/components/mappingcomponent.ui @@ -288,6 +288,16 @@ + + + + QFrame::StyledPanel + + + QFrame::Raised + + + @@ -295,6 +305,12 @@ + + BlackGui::Components::CSimulatorSelector + QFrame +
blackgui/components/simulatorselector.h
+ 1 +
BlackGui::Views::CSimulatedAircraftView QTableView diff --git a/src/blackgui/components/simulatorselector.cpp b/src/blackgui/components/simulatorselector.cpp index fe4d844ef..0ba9b0014 100644 --- a/src/blackgui/components/simulatorselector.cpp +++ b/src/blackgui/components/simulatorselector.cpp @@ -8,6 +8,7 @@ */ #include "blackgui/components/simulatorselector.h" +#include "blackgui/guiutility.h" #include "blackmisc/compare.h" #include "ui_simulatorselector.h" @@ -182,6 +183,15 @@ namespace BlackGui } } + void CSimulatorSelector::setReadOnly(bool readOnly) + { + CGuiUtility::checkBoxesReadOnly(this, readOnly); + ui->cb_FSX->setEnabled(!readOnly); + ui->cb_FS9->setEnabled(!readOnly); + ui->cb_XPlane->setEnabled(!readOnly); + ui->cb_P3D->setEnabled(!readOnly); + } + void CSimulatorSelector::radioButtonChanged(bool checked) { if (m_mode != RadioButtons) { return; } diff --git a/src/blackgui/components/simulatorselector.h b/src/blackgui/components/simulatorselector.h index 642698299..14703ef67 100644 --- a/src/blackgui/components/simulatorselector.h +++ b/src/blackgui/components/simulatorselector.h @@ -87,6 +87,9 @@ namespace BlackGui //! Clear values void clear(); + //! Set read only + void setReadOnly(bool readOnly); + signals: //! Value has been changed void changed(const BlackMisc::Simulation::CSimulatorInfo &simulator);