diff --git a/src/blackgui/components/dbownmodelscomponent.cpp b/src/blackgui/components/dbownmodelscomponent.cpp index 023827522..474e7bcfb 100644 --- a/src/blackgui/components/dbownmodelscomponent.cpp +++ b/src/blackgui/components/dbownmodelscomponent.cpp @@ -48,7 +48,7 @@ namespace BlackGui // should be single simulator or no simulator (default) this->m_simulatorSelection.synchronize(); - const CSimulatorInfo simulator(this->m_simulatorSelection.get()); + const CSimulatorInfo simulator(this->m_simulatorSelection.getCopy()); const bool s = this->initModelLoader(!simulator.isSingleSimulator() ? CSimulatorInfo(CSimulatorInfo::FSX) : simulator); if (s) { diff --git a/src/blackgui/components/dbownmodelscomponent.h b/src/blackgui/components/dbownmodelscomponent.h index edfd5c165..0879c119b 100644 --- a/src/blackgui/components/dbownmodelscomponent.h +++ b/src/blackgui/components/dbownmodelscomponent.h @@ -103,8 +103,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::CData m_simulatorSelection {this }; //!< last selection //! Init or change model loader bool initModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simulator); @@ -126,8 +126,8 @@ namespace BlackGui virtual void customMenu(BlackGui::Menus::CMenuActions &menuActions) override; private: - QList m_loadActions; //!< load actions - QList m_reloadActions; //!< reload actions + QList m_loadActions; //!< load actions + QList m_reloadActions; //!< reload actions }; }; } // ns diff --git a/src/blackgui/menus/aircraftmodelmenus.cpp b/src/blackgui/menus/aircraftmodelmenus.cpp index 47b10a2c7..8eb8f4970 100644 --- a/src/blackgui/menus/aircraftmodelmenus.cpp +++ b/src/blackgui/menus/aircraftmodelmenus.cpp @@ -10,6 +10,7 @@ #include "aircraftmodelmenus.h" #include "blackgui/guiapplication.h" #include "blackcore/webdataservices.h" +#include "blackmisc/verify.h" #include "blackmisc/icons.h" #include "blackmisc/logmessage.h" #include "blackmisc/simulation/aircraftmodelinterfaces.h" @@ -139,15 +140,27 @@ namespace BlackGui void CMergeWithDbDataMenu::ps_mergeData() { - Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); + BLACK_VERIFY_X(sGui, Q_FUNC_INFO, "Missing sGui"); if (!sGui->hasWebDataServices()) { return; } const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); + if (dbModels.isEmpty()) + { + CLogMessage().warning("No DB models to merge with"); + return; + } + + this->modelView()->showLoadIndicator(); CAircraftModelList models(this->getAircraftModels()); - CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); - if (this->modelsTargetSetable()) + int c = CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); + if (c > 0 && this->modelsTargetSetable()) { this->modelsTargetSetable()->setModels(models); + CLogMessage().info("Merged %1/%2 models with DB") << c << models.size(); + } + else + { + CLogMessage().info("No data merged with DB"); } } diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index 67dc638e6..b657c0bf3 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -95,11 +95,6 @@ namespace BlackMisc return this->m_caches.getCurrentCacheTimestamp(); } - bool IAircraftModelLoader::syncronizeCache() - { - return this->m_caches.syncronizeCurrentCache(); - } - bool IAircraftModelLoader::hasCachedData() const { return !this->m_caches.getCurrentCachedModels().isEmpty(); diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index 19aea264e..f949b639a 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -136,9 +136,6 @@ namespace BlackMisc //! Cache timestamp QDateTime getCacheTimestamp() const; - //! Make sure cache is syncronized - bool syncronizeCache(); - //! Any cached data? bool hasCachedData() const; diff --git a/src/blackmisc/simulation/aircraftmodelsetloader.cpp b/src/blackmisc/simulation/aircraftmodelsetloader.cpp index 60aa3280f..40e74b7d0 100644 --- a/src/blackmisc/simulation/aircraftmodelsetloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelsetloader.cpp @@ -59,7 +59,8 @@ namespace BlackMisc { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Only one simulator per loader"); if (this->getSimulator() == simulator) { return; } - this->m_caches.syncronizeCache(simulator); // also changes current simulator of caches + this->m_caches.setCurrentSimulator(simulator); + this->m_caches.syncronizeCurrentCache(); emit simulatorChanged(simulator); } diff --git a/src/blackmisc/simulation/aircraftmodelutils.cpp b/src/blackmisc/simulation/aircraftmodelutils.cpp index 51d69b7e0..7d6fe9820 100644 --- a/src/blackmisc/simulation/aircraftmodelutils.cpp +++ b/src/blackmisc/simulation/aircraftmodelutils.cpp @@ -14,9 +14,10 @@ namespace BlackMisc { namespace Simulation { - bool CAircraftModelUtilities::mergeWithDbData(CAircraftModelList &modelToBeModified, const CAircraftModelList &dbModels, bool force) + int CAircraftModelUtilities::mergeWithDbData(CAircraftModelList &modelToBeModified, const CAircraftModelList &dbModels, bool force) { - if (dbModels.isEmpty() || modelToBeModified.isEmpty()) { return false; } + if (dbModels.isEmpty() || modelToBeModified.isEmpty()) { return 0; } + int c = 0; for (CAircraftModel &simModel : modelToBeModified) { if (!force && simModel.hasValidDbKey()) { continue; } // already done @@ -27,8 +28,9 @@ namespace BlackMisc } dbModel.updateMissingParts(simModel, false); simModel = dbModel; + c++; } - return true; + return c; } bool CAircraftModelUtilities::mergeWithVPilotData(CAircraftModelList &modelToBeModified, const CAircraftModelList &vPilotModels, bool force) diff --git a/src/blackmisc/simulation/aircraftmodelutils.h b/src/blackmisc/simulation/aircraftmodelutils.h index 684a77422..5da6368fb 100644 --- a/src/blackmisc/simulation/aircraftmodelutils.h +++ b/src/blackmisc/simulation/aircraftmodelutils.h @@ -27,7 +27,7 @@ namespace BlackMisc CAircraftModelUtilities() = delete; //! Merge with DB data if possible - static bool mergeWithDbData(BlackMisc::Simulation::CAircraftModelList &modelToBeModified, const BlackMisc::Simulation::CAircraftModelList &dbModels, bool force = false); + static int mergeWithDbData(BlackMisc::Simulation::CAircraftModelList &modelToBeModified, const BlackMisc::Simulation::CAircraftModelList &dbModels, bool force = false); //! Merge with vPilot data if possible static bool mergeWithVPilotData(BlackMisc::Simulation::CAircraftModelList &modelToBeModified, const BlackMisc::Simulation::CAircraftModelList &vPilotModels, bool force = false); diff --git a/src/blackmisc/simulation/data/modelcaches.cpp b/src/blackmisc/simulation/data/modelcaches.cpp index 0ec78ff47..57fe77ae5 100644 --- a/src/blackmisc/simulation/data/modelcaches.cpp +++ b/src/blackmisc/simulation/data/modelcaches.cpp @@ -66,7 +66,7 @@ namespace BlackMisc { this->m_currentSimulator.synchronize(); const CSimulatorInfo sim(this->m_currentSimulator.getCopy()); - this->syncronizeCache(sim); + this->syncronizeCacheImpl(sim); const QString simStr(sim.toQString(true)); CLogMessage(this).info("Initialized model caches to %1") << simStr; } @@ -125,6 +125,21 @@ namespace BlackMisc } void CModelCaches::syncronizeCache(const CSimulatorInfo &simulator) + { + this->syncronizeCacheImpl(simulator); + } + + CStatusMessage CModelCaches::setCurrentSimulator(const CSimulatorInfo &simulator) + { + static const CStatusMessage sameSimMsg = CStatusMessage(this).info("Same simulator"); + const CSimulatorInfo s = this->m_currentSimulator.getCopy(); + if (s == simulator) { return sameSimMsg; } + const BlackMisc::CStatusMessage m = this->m_currentSimulator.set(simulator); + this->syncronizeCache(simulator); + return m; + } + + void CModelCaches::syncronizeCacheImpl(const CSimulatorInfo &simulator) { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); switch (simulator.getSimulator()) @@ -139,21 +154,11 @@ namespace BlackMisc } } - CStatusMessage CModelCaches::setCurrentSimulator(const CSimulatorInfo &simulator) - { - static const CStatusMessage sameSimMsg = CStatusMessage(this).info("Same simulator"); - const CSimulatorInfo s = this->m_currentSimulator.getCopy(); - if (s == simulator) { return sameSimMsg; } - const BlackMisc::CStatusMessage m = this->m_currentSimulator.set(simulator); - this->syncronizeCache(simulator); - return m; - } - CModelSetCaches::CModelSetCaches(QObject *parent) : IMultiSimulatorModelCaches(parent) { this->m_currentSimulator.synchronize(); const CSimulatorInfo sim(this->m_currentSimulator.getCopy()); - this->syncronizeCache(sim); + this->syncronizeCacheImpl(sim); const QString simStr(sim.toQString(true)); CLogMessage(this).info("Initialized model set caches to %1") << simStr; } @@ -215,16 +220,7 @@ namespace BlackMisc void CModelSetCaches::syncronizeCache(const CSimulatorInfo &simulator) { - Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); - switch (simulator.getSimulator()) - { - case CSimulatorInfo::FS9: this->m_modelCacheFs9.synchronize(); break; - case CSimulatorInfo::FSX: this->m_modelCacheFsx.synchronize(); break; - case CSimulatorInfo::P3D: this->m_modelCacheP3D.synchronize(); break; - case CSimulatorInfo::XPLANE: this->m_modelCacheXP.synchronize(); break; - default: - Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); - } + this->syncronizeCacheImpl(simulator); } CStatusMessage CModelSetCaches::setCurrentSimulator(const CSimulatorInfo &simulator) @@ -236,6 +232,20 @@ namespace BlackMisc this->syncronizeCache(simulator); return m; } + + void CModelSetCaches::syncronizeCacheImpl(const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: this->m_modelCacheFs9.synchronize(); break; + case CSimulatorInfo::FSX: this->m_modelCacheFsx.synchronize(); break; + case CSimulatorInfo::P3D: this->m_modelCacheP3D.synchronize(); break; + case CSimulatorInfo::XPLANE: this->m_modelCacheXP.synchronize(); break; + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + } + } } // ns } // ns } // ns diff --git a/src/blackmisc/simulation/data/modelcaches.h b/src/blackmisc/simulation/data/modelcaches.h index 0cc3a2925..f64eb4bde 100644 --- a/src/blackmisc/simulation/data/modelcaches.h +++ b/src/blackmisc/simulation/data/modelcaches.h @@ -246,6 +246,9 @@ namespace BlackMisc BlackMisc::CData m_modelCacheP3D {this, &CModelCaches::changedP3D }; //!< P3D cache BlackMisc::CData m_modelCacheXP {this, &CModelCaches::changedXP }; //!< XP cache BlackMisc::CData m_currentSimulator { this }; //!< current simulator + + //! Non virtaul version (used in ctor) + void syncronizeCacheImpl(const BlackMisc::Simulation::CSimulatorInfo &simulator); }; //! Bundle of caches for model sets of all simulators @@ -274,6 +277,9 @@ namespace BlackMisc BlackMisc::CData m_modelCacheP3D {this, &CModelSetCaches::changedP3D }; //!< P3D cache BlackMisc::CData m_modelCacheXP {this, &CModelSetCaches::changedXP }; //!< XP cache BlackMisc::CData m_currentSimulator { this }; //!< current simulator + + //! Non virtaul version (used in ctor) + void syncronizeCacheImpl(const BlackMisc::Simulation::CSimulatorInfo &simulator); }; } // ns } // ns