diff --git a/src/blackgui/components/dbownmodelscomponent.cpp b/src/blackgui/components/dbownmodelscomponent.cpp index d32ee2a21..b7bbf1236 100644 --- a/src/blackgui/components/dbownmodelscomponent.cpp +++ b/src/blackgui/components/dbownmodelscomponent.cpp @@ -50,11 +50,11 @@ namespace BlackGui connect(ui->tvp_OwnAircraftModels, &CAircraftModelView::requestUpdate, this, &CDbOwnModelsComponent::ps_requestOwnModelsUpdate); - // should be single simulator or no simulator (default) - this->m_simulatorSelection.synchronize(); + // Last selection isPinned -> no sync needed const CSimulatorInfo simulator(this->m_simulatorSelection.get()); - const bool succes = this->initModelLoader(!simulator.isSingleSimulator() ? CSimulatorInfo(CSimulatorInfo::FSX) : simulator); - if (succes) + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Need single simulator"); + const bool success = this->initModelLoader(simulator); + if (success) { this->m_modelLoader->startLoading(IAircraftModelLoader::CacheOnly); } @@ -427,7 +427,7 @@ namespace BlackGui return; } - if (!this->m_modelLoader->isLoadingFinished()) + if (this->m_modelLoader->isLoadingInProgress()) { CLogMessage(this).info("Loading for %1 already in progress") << simulator.toQString(); return; diff --git a/src/blackgui/components/dbownmodelscomponent.h b/src/blackgui/components/dbownmodelscomponent.h index b2c2c455d..a3fe4e5a4 100644 --- a/src/blackgui/components/dbownmodelscomponent.h +++ b/src/blackgui/components/dbownmodelscomponent.h @@ -62,7 +62,7 @@ namespace BlackGui explicit CDbOwnModelsComponent(QWidget *parent = nullptr); //! Destructor - ~CDbOwnModelsComponent(); + virtual ~CDbOwnModelsComponent(); //! Own (installed) model for given model string BlackMisc::Simulation::CAircraftModel getOwnModelForModelString(const QString &modelString) const; @@ -132,8 +132,8 @@ namespace BlackGui private: QScopedPointer ui; - std::unique_ptr m_modelLoader; //!< read own aircraft models - BlackMisc::CData m_simulatorSelection {this }; //!< last selection + std::unique_ptr m_modelLoader; //!< read own aircraft models + BlackMisc::CDataReadOnly m_simulatorSelection {this }; //!< last selection //! Init or change model loader bool initModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simulator); diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index 0d4abfc35..a55b80462 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -80,6 +80,10 @@ namespace BlackMisc //! Loading finished? virtual bool isLoadingFinished() const = 0; + //! Loading in progress + //! \threadsafe + bool isLoadingInProgress() const { return m_loadingInProgress; } + //! Get the loaded models //! \threadsafe BlackMisc::Simulation::CAircraftModelList getAircraftModels() const; @@ -166,7 +170,7 @@ namespace BlackMisc //! Start the loading process from disk virtual void startLoadingFromDisk(LoadMode mode, const ModelConsolidation &modelConsolidation, const QString &directory) = 0; - std::atomic m_cancelLoading { false }; //!< flag + std::atomic m_cancelLoading { false }; //!< flag, requesting to cancel loading std::atomic m_loadingInProgress { false }; //!< Loading in progress BlackMisc::Simulation::Data::CModelCaches m_caches { false, this }; //!< caches BlackMisc::Simulation::CMultiSimulatorSettings m_settings { this }; //!< settings diff --git a/src/blackmisc/simulation/data/modelcaches.h b/src/blackmisc/simulation/data/modelcaches.h index 147049e3e..2430bc251 100644 --- a/src/blackmisc/simulation/data/modelcaches.h +++ b/src/blackmisc/simulation/data/modelcaches.h @@ -69,16 +69,12 @@ namespace BlackMisc //! Last selection struct TModelCacheLastSelection : public BlackMisc::TDataTrait { - //! Default value - static const BlackMisc::Simulation::CSimulatorInfo &defaultValue() - { - static const BlackMisc::Simulation::CSimulatorInfo s(BlackMisc::Simulation::CSimulatorInfo::guessDefaultSimulator()); - return s; - } - //! First load is synchronous static constexpr bool isPinned() { return true; } + //! Default simulator + static const BlackMisc::Simulation::CSimulatorInfo &defaultValue() { return CSimulatorInfo::guessDefaultSimulator(); } + //! Key static const char *key() { return "modelcachelastselection"; } }; @@ -118,16 +114,12 @@ namespace BlackMisc //! Last selection struct TModelSetLastSelection : public BlackMisc::TDataTrait { - //! Default value - static const BlackMisc::Simulation::CSimulatorInfo &defaultValue() - { - static const BlackMisc::Simulation::CSimulatorInfo s(BlackMisc::Simulation::CSimulatorInfo::guessDefaultSimulator()); - return s; - } - //! First load is synchronous static constexpr bool isPinned() { return true; } + //! Default simulator + static const BlackMisc::Simulation::CSimulatorInfo &defaultValue() { return CSimulatorInfo::guessDefaultSimulator(); } + //! Key static const char *key() { return "modelsetlastselection"; } }; diff --git a/src/blackmisc/simulation/simulatorinfo.cpp b/src/blackmisc/simulation/simulatorinfo.cpp index decad694d..212fea368 100644 --- a/src/blackmisc/simulation/simulatorinfo.cpp +++ b/src/blackmisc/simulation/simulatorinfo.cpp @@ -230,9 +230,10 @@ namespace BlackMisc return sim; } - const CSimulatorInfo CSimulatorInfo::guessDefaultSimulator() + //! \cond PRIVATE + CSimulatorInfo guessDefaultSimulatorImpl() { - CSimulatorInfo locallyInstalled(getLocallyInstalledSimulators()); + static const CSimulatorInfo locallyInstalled(CSimulatorInfo::getLocallyInstalledSimulators()); if (CBuildConfig::isRunningOnLinuxPlatform()) { return CSimulatorInfo("XPLANE"); @@ -242,8 +243,16 @@ namespace BlackMisc if (locallyInstalled.fs9()) { return CSimulatorInfo("FS9"); } // fallback - return CSimulatorInfo("FSX"); + return CSimulatorInfo("P3D"); } + //! \endcond + + const CSimulatorInfo &CSimulatorInfo::guessDefaultSimulator() + { + static const CSimulatorInfo sim(guessDefaultSimulatorImpl()); + return sim; + } + CSimulatorInfo CSimulatorInfo::fromDatabaseJson(const QJsonObject &json, const QString prefix) { diff --git a/src/blackmisc/simulation/simulatorinfo.h b/src/blackmisc/simulation/simulatorinfo.h index 05d0f2436..13ee1f913 100644 --- a/src/blackmisc/simulation/simulatorinfo.h +++ b/src/blackmisc/simulation/simulatorinfo.h @@ -162,8 +162,8 @@ namespace BlackMisc //! Locally installed simulators static const CSimulatorInfo getLocallyInstalledSimulators(); - //! Guess a default simulator - static const CSimulatorInfo guessDefaultSimulator(); + //! Guess a default simulator based on installation + static const CSimulatorInfo &guessDefaultSimulator(); //! From database JSON static CSimulatorInfo fromDatabaseJson(const QJsonObject &json, const QString prefix);