diff --git a/src/blackgui/components/dbmappingcomponent.cpp b/src/blackgui/components/dbmappingcomponent.cpp index c58c89141..d2ea80ca5 100644 --- a/src/blackgui/components/dbmappingcomponent.cpp +++ b/src/blackgui/components/dbmappingcomponent.cpp @@ -16,6 +16,7 @@ #include "blackgui/guiutility.h" #include "blackgui/shortcut.h" #include "blackmisc/simulation/fscommon/aircraftcfgparser.h" +#include "blackmisc/simulation/aircraftmodelutils.h" #include "blackmisc/logmessage.h" #include #include @@ -579,7 +580,7 @@ namespace BlackGui Q_UNUSED(withFilter); int i = this->ui->tw_ModelsToBeMapped->indexOf(this->ui->tab_OwnModelSet); QString o = "Model set " + ui->comp_OwnModelSet->getModelSetSimulator().toQString(true); - const QString f = this->ui->comp_StashAircraft->view()->hasFilter() ? "F" : ""; + const QString f = this->ui->comp_OwnModelSet->view()->hasFilter() ? "F" : ""; o = CGuiUtility::replaceTabCountValue(o, this->ui->comp_OwnModelSet->view()->rowCount()) + f; this->ui->tw_ModelsToBeMapped->setTabText(i, o); } diff --git a/src/blackgui/components/dbownmodelscomponent.h b/src/blackgui/components/dbownmodelscomponent.h index cfb23c5bf..4bf4416dc 100644 --- a/src/blackgui/components/dbownmodelscomponent.h +++ b/src/blackgui/components/dbownmodelscomponent.h @@ -20,7 +20,6 @@ #include namespace Ui { class CDbOwnModelsComponent; } - namespace BlackGui { namespace Views { class CAircraftModelView; } diff --git a/src/blackgui/components/dbownmodelsetcomponent.cpp b/src/blackgui/components/dbownmodelsetcomponent.cpp index c2456a225..51fe55903 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.cpp +++ b/src/blackgui/components/dbownmodelsetcomponent.cpp @@ -8,8 +8,9 @@ */ #include "dbownmodelsetcomponent.h" -#include "blackmisc/simulation/aircraftmodellist.h" #include "blackgui/models/aircrafticaolistmodel.h" +#include "blackgui/menus/aircraftmodelmenus.h" +#include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/logmessage.h" #include "dbmappingcomponent.h" #include "dbownmodelsetdialog.h" @@ -18,6 +19,7 @@ using namespace BlackMisc; using namespace BlackMisc::Simulation; using namespace BlackGui::Models; +using namespace BlackGui::Menus; using namespace BlackGui::Views; namespace BlackGui @@ -36,6 +38,7 @@ namespace BlackGui ui->tvp_OwnModelSet->addFilterDialog(); ui->tvp_OwnModelSet->setCustomMenu(new CLoadModelsMenu(this)); ui->tvp_OwnModelSet->setJsonLoad(CAircraftModelView::AllowOnlySingleSimulator | CAircraftModelView::ReduceToOneSimulator); + ui->tvp_OwnModelSet->setCustomMenu(new CMergeWithDbDataMenu(ui->tvp_OwnModelSet, this, false)); connect(ui->pb_CreateNewSet, &QPushButton::clicked, this, &CDbOwnModelSetComponent::ps_buttonClicked); connect(ui->pb_LoadExistingSet, &QPushButton::clicked, this, &CDbOwnModelSetComponent::ps_buttonClicked); @@ -72,11 +75,27 @@ namespace BlackGui const int diff = models.size() - cleanModelList.size(); if (diff > 0) { - CLogMessage(this).warning("Removed models from set because not matching " + simulator.toQString(true)); + CLogMessage(this).warning("Removed %1 models from set because not matching %2") << diff << simulator.toQString(true); } this->ui->tvp_OwnModelSet->updateContainerMaybeAsync(cleanModelList); } + void CDbOwnModelSetComponent::replaceOrAddModelSet(const CAircraftModelList &models, const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Need single simulator"); + if (models.isEmpty()) { return; } + CAircraftModelList cleanModelList(models.matchesSimulator(simulator)); // remove those not matching the simulator + const int diff = models.size() - cleanModelList.size(); + if (diff > 0) + { + CLogMessage(this).warning("Removed %1 models from set because not matching %2") << diff << simulator.toQString(true); + } + if (cleanModelList.isEmpty()) { return; } + CAircraftModelList updatedModels(this->ui->tvp_OwnModelSet->container()); + updatedModels.replaceOrAddModelsWithString(cleanModelList, Qt::CaseInsensitive); + this->ui->tvp_OwnModelSet->updateContainerMaybeAsync(updatedModels); + } + const CAircraftModelList &CDbOwnModelSetComponent::getModelSet() const { return ui->tvp_OwnModelSet->container(); @@ -167,7 +186,7 @@ namespace BlackGui const CAircraftModelList ml(ui->tvp_OwnModelSet->container()); if (!ml.isEmpty()) { - const CStatusMessage m = this->m_modelSetLoader.setModelsInCache(ml); + const CStatusMessage m = this->m_modelSetLoader.setCachedModels(ml); CLogMessage::preformatted(m); } } diff --git a/src/blackgui/components/dbownmodelsetcomponent.h b/src/blackgui/components/dbownmodelsetcomponent.h index 9a86428a3..be4d2c27e 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.h +++ b/src/blackgui/components/dbownmodelsetcomponent.h @@ -34,9 +34,17 @@ namespace BlackGui */ class CDbOwnModelSetComponent : public QFrame, - public CDbMappingComponentAware + public CDbMappingComponentAware, + public BlackMisc::Simulation::IModelsSetable, + public BlackMisc::Simulation::IModelsUpdatable, + public BlackMisc::Simulation::IModelsPerSimulatorSetable, + public BlackMisc::Simulation::IModelsPerSimulatorUpdatable { Q_OBJECT + Q_INTERFACES(BlackMisc::Simulation::IModelsSetable) + Q_INTERFACES(BlackMisc::Simulation::IModelsUpdatable) + Q_INTERFACES(BlackMisc::Simulation::IModelsPerSimulatorSetable) + Q_INTERFACES(BlackMisc::Simulation::IModelsPerSimulatorUpdatable) public: //! Constructor @@ -63,10 +71,21 @@ namespace BlackGui //! \copydoc CDbMappingComponentAware::setMappingComponent virtual void setMappingComponent(CDbMappingComponent *component) override; + //! \name Implementations of the models interfaces + //! @{ + virtual void setModels(const BlackMisc::Simulation::CAircraftModelList &models) override { this->setModelSet(models, this->m_simulator); } + virtual void updateModels(const BlackMisc::Simulation::CAircraftModelList &models) override { this->replaceOrAddModelSet(models, this->m_simulator); } + virtual void setModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator) override { this->setModelSet(models, simulator); } + virtual void updateModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator) override { this->replaceOrAddModelSet(models, simulator); } + //! @} + public slots: //! Set the model set void setModelSet(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator); + //! Replace or add models provided + void replaceOrAddModelSet(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator); + private slots: //! Tab has been changed void ps_tabIndexChanged(int index); diff --git a/src/blackgui/menus/aircraftmodelmenus.cpp b/src/blackgui/menus/aircraftmodelmenus.cpp index 3b448e273..9e5256904 100644 --- a/src/blackgui/menus/aircraftmodelmenus.cpp +++ b/src/blackgui/menus/aircraftmodelmenus.cpp @@ -10,7 +10,7 @@ #include "aircraftmodelmenus.h" #include "blackgui/guiapplication.h" #include "blackmisc/icons.h" -#include "blackmisc/simulation/aircraftmodelloader.h" +#include "blackmisc/simulation/aircraftmodelutils.h" #include using namespace BlackMisc; @@ -78,11 +78,22 @@ namespace BlackGui } } + CMergeWithDbDataMenu::CMergeWithDbDataMenu(CAircraftModelView *modelView, QObject *modelsTarget, bool separator) : + IAircraftModelViewMenu(modelView, separator), m_modelsTarget(modelsTarget) + { + if (modelsTarget) + { + bool ok = modelsTargetSetable() || modelsTargetUpdatable(); + Q_ASSERT_X(ok, Q_FUNC_INFO, "Neither setable nor updatable"); + Q_UNUSED(ok); + } + } + void CMergeWithDbDataMenu::customMenu(QMenu &menu) const { const CAircraftModelView *mv = modelView(); if (mv->isEmpty()) { this->nestedCustomMenu(menu); return; } - if (!sGui->hasWebDataServices()) { return; } + if (!sGui->hasWebDataServices()) { this->nestedCustomMenu(menu); return; } this->addSeparator(menu); QMenu *mm = menu.addMenu(CIcons::databaseEdit16(), "Merge with DB data"); @@ -97,37 +108,41 @@ namespace BlackGui void CMergeWithDbDataMenu::ps_mergeData() { Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); - CAircraftModelView *mv = modelView(); - if (mv->isEmpty()) { return; } if (!sGui->hasWebDataServices()) { return; } const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); CAircraftModelList models(this->getAircraftModels()); - IAircraftModelLoader::mergeWithDbData(models, dbModels, true); - mv->updateContainerMaybeAsync(models); - if (this->m_loader) + CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); + if (this->modelsTargetSetable()) { - this->m_loader->setModelsInCache(models); + this->modelsTargetSetable()->setModels(models); } } void CMergeWithDbDataMenu::ps_mergeSelectedData() { Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); - CAircraftModelView *mv = modelView(); - if (mv->isEmpty()) { return; } if (!sGui->hasWebDataServices()) { return; } CAircraftModelList models(this->getSelectedAircraftModels()); if (models.isEmpty()) { return; } const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); - IAircraftModelLoader::mergeWithDbData(models, dbModels, true); - mv->replaceOrAddModelsWithString(models); - if (this->m_loader) + CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); + if (this->modelsTargetUpdatable()) { - this->m_loader->setModelsInCache(models); + this->modelsTargetUpdatable()->updateModels(models); } } + + IModelsSetable *CMergeWithDbDataMenu::modelsTargetSetable() const + { + return qobject_cast(this->m_modelsTarget); + } + + IModelsUpdatable *CMergeWithDbDataMenu::modelsTargetUpdatable() const + { + return qobject_cast(this->m_modelsTarget); + } } // ns } // ns diff --git a/src/blackgui/menus/aircraftmodelmenus.h b/src/blackgui/menus/aircraftmodelmenus.h index 326e66e69..3c4341ae4 100644 --- a/src/blackgui/menus/aircraftmodelmenus.h +++ b/src/blackgui/menus/aircraftmodelmenus.h @@ -12,7 +12,7 @@ #include "menudelegate.h" #include "blackgui/views/aircraftmodelview.h" -#include "blackmisc/simulation/aircraftmodelloader.h" +#include "blackmisc/simulation/aircraftmodelinterfaces.h" #include "blackmisc/simulation/fscommon/vpilotrulesreader.h" #include #include @@ -68,10 +68,7 @@ namespace BlackGui using IAircraftModelViewMenu::IAircraftModelViewMenu; //! Constructor - CMergeWithDbDataMenu(BlackGui::Views::CAircraftModelView *modelView, - BlackMisc::Simulation::IAircraftModelLoader *modelLoader, bool separator = true) : - IAircraftModelViewMenu(modelView, separator), m_loader(modelLoader) - {} + CMergeWithDbDataMenu(BlackGui::Views::CAircraftModelView *modelView, QObject *modelsTarget, bool separator = true); //! \copydoc IMenuDelegate::customMenu virtual void customMenu(QMenu &menu) const override; diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index e2be8dc6f..9165b78f9 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -80,7 +80,7 @@ namespace BlackMisc CAircraftModelList IAircraftModelLoader::getAircraftModels() const { - return this->m_caches.getModels(this->m_simulatorInfo); + return this->m_caches.getCachedModels(this->m_simulatorInfo); } QDateTime IAircraftModelLoader::getCacheTimestamp() const @@ -90,17 +90,17 @@ namespace BlackMisc void IAircraftModelLoader::syncronizeCache() { - return this->m_caches.syncronize(this->m_simulatorInfo); + return this->m_caches.syncronizeCache(this->m_simulatorInfo); } bool IAircraftModelLoader::hasCachedData() const { - return !this->m_caches.getModels(this->m_simulatorInfo).isEmpty(); + return !this->m_caches.getCachedModels(this->m_simulatorInfo).isEmpty(); } CStatusMessage IAircraftModelLoader::clearCache() { - return this->setModelsInCache(CAircraftModelList()); + return this->setCachedModels(CAircraftModelList()); } void IAircraftModelLoader::startLoading(LoadMode mode, const CAircraftModelList &dbModels) diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index 56a1dcda5..5072f7697 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -13,7 +13,7 @@ #define BLACKMISC_SIMULATION_IAIRCRAFTMODELLOADER_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/simulation/aircraftmodellist.h" +#include "blackmisc/simulation/aircraftmodelinterfaces.h" #include "blackmisc/simulation/simulatorinfo.h" #include "blackmisc/simulation/data/modelcaches.h" #include "blackmisc/pixmap.h" @@ -28,9 +28,18 @@ namespace BlackMisc /*! * Load the aircraft for a simulator */ - class BLACKMISC_EXPORT IAircraftModelLoader : public QObject + class BLACKMISC_EXPORT IAircraftModelLoader : + public QObject, + public BlackMisc::Simulation::IModelsSetable, + public BlackMisc::Simulation::IModelsUpdatable, + public BlackMisc::Simulation::IModelsPerSimulatorSetable, + public BlackMisc::Simulation::IModelsPerSimulatorUpdatable { Q_OBJECT + Q_INTERFACES(BlackMisc::Simulation::IModelsSetable) + Q_INTERFACES(BlackMisc::Simulation::IModelsUpdatable) + Q_INTERFACES(BlackMisc::Simulation::IModelsPerSimulatorSetable) + Q_INTERFACES(BlackMisc::Simulation::IModelsPerSimulatorUpdatable) public: //! Parser mode diff --git a/src/blackmisc/simulation/aircraftmodelsetloader.cpp b/src/blackmisc/simulation/aircraftmodelsetloader.cpp index 93cd8efe3..b6fd63771 100644 --- a/src/blackmisc/simulation/aircraftmodelsetloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelsetloader.cpp @@ -56,14 +56,14 @@ namespace BlackMisc void CAircraftModelSetLoader::changeSimulator(const CSimulatorInfo &simulator) { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Only one simulator per loader"); - this->m_caches.syncronize(simulator); this->m_simulatorInfo = simulator; + this->m_caches.syncronizeCache(simulator); emit simulatorChanged(simulator); } CAircraftModelList CAircraftModelSetLoader::getAircraftModels() const { - return this->m_caches.getModels(this->m_simulatorInfo); + return this->m_caches.getCachedModels(this->m_simulatorInfo); } QDateTime CAircraftModelSetLoader::getCacheTimestamp() const @@ -73,17 +73,17 @@ namespace BlackMisc void CAircraftModelSetLoader::syncronizeCache() { - return this->m_caches.syncronize(this->m_simulatorInfo); + return this->m_caches.syncronizeCache(this->m_simulatorInfo); } bool CAircraftModelSetLoader::hasCachedData() const { - return !this->m_caches.getModels(this->m_simulatorInfo).isEmpty(); + return !this->m_caches.getCachedModels(this->m_simulatorInfo).isEmpty(); } CStatusMessage CAircraftModelSetLoader::clearCache() { - return this->setModelsInCache(CAircraftModelList()); + return this->setCachedModels(CAircraftModelList()); } const CSimulatorInfo &CAircraftModelSetLoader::getSimulator() const diff --git a/src/blackmisc/simulation/aircraftmodelsetloader.h b/src/blackmisc/simulation/aircraftmodelsetloader.h index 005edf767..eacd805b9 100644 --- a/src/blackmisc/simulation/aircraftmodelsetloader.h +++ b/src/blackmisc/simulation/aircraftmodelsetloader.h @@ -13,8 +13,7 @@ #define BLACKMISC_SIMULATION_AIRCRAFTMODELSETLOADER_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/simulation/aircraftmodellist.h" -#include "blackmisc/simulation/simulatorinfo.h" +#include "blackmisc/simulation/aircraftmodelinterfaces.h" #include "blackmisc/simulation/data/modelcaches.h" #include "blackmisc/pixmap.h" #include @@ -65,6 +64,14 @@ namespace BlackMisc //! Shutdown void gracefulShutdown(); + //! \name Implementations of the models interfaces + //! @{ + virtual void setModels(const BlackMisc::Simulation::CAircraftModelList &models) override { this->setCachedModels(models, this->m_simulatorInfo); } + virtual void updateModels(const BlackMisc::Simulation::CAircraftModelList &models) override { this->replaceOrAddCachedModels(models, this->m_simulatorInfo); } + virtual void setModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator) override { this->setCachedModels(models, simulator); } + virtual void updateModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator) override { this->replaceOrAddCachedModels(models, simulator); } + //! @} + signals: //! Simulator has been changed void simulatorChanged(const BlackMisc::Simulation::CSimulatorInfo &simulator); @@ -75,11 +82,11 @@ namespace BlackMisc public slots: //! Set cache from outside, this should only be used in special cases. //! But it allows to modify data elsewhere and update the cache with manipulated data. - BlackMisc::CStatusMessage setModelsInCache(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo()); + BlackMisc::CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo()); //! Set cache from outside, this should only be used in special cases. //! But it allows to modify data elsewhere and update the cache with manipulated data. - BlackMisc::CStatusMessage replaceOrAddModelsInCache(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo()); + BlackMisc::CStatusMessage replaceOrAddCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator = CSimulatorInfo()); //! Change the simulator void changeSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator); diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp index fd1391210..f8934a144 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp @@ -9,6 +9,7 @@ #include "aircraftcfgparser.h" #include "blackmisc/simulation/fscommon/fscommonutil.h" +#include "blackmisc/simulation/aircraftmodelutils.h" #include "blackmisc/fileutils.h" #include "blackmisc/predicates.h" #include "blackmisc/logmessage.h" @@ -110,7 +111,7 @@ namespace BlackMisc if (ok) { models = (aircraftCfgEntriesList.toAircraftModelList(this->getSimulator())); - this->mergeWithDbData(models, dbModels); + CAircraftModelUtilities::mergeWithDbData(models, dbModels); } return std::make_tuple(aircraftCfgEntriesList, models, ok); }); @@ -124,7 +125,7 @@ namespace BlackMisc const bool hasData = !models.isEmpty(); if (hasData) { - this->setModelsInCache(models); // not thread safe + this->setCachedModels(models); // not thread safe } // currently I treat no data as error emit this->loadingFinished(hasData, this->m_simulatorInfo); @@ -140,11 +141,11 @@ namespace BlackMisc bool ok; this->m_parsedCfgEntriesList = performParsing(m_rootDirectory, m_excludedDirectories, &ok); CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(this->getSimulator())); - this->mergeWithDbData(models, dbModels); + CAircraftModelUtilities::mergeWithDbData(models, dbModels); const bool hasData = !models.isEmpty(); if (hasData) { - this->setModelsInCache(models); // not thread safe + this->setCachedModels(models); // not thread safe } // currently I treat no data as error emit this->loadingFinished(hasData, this->m_simulatorInfo); diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp index 156b9908d..e51760892 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp @@ -9,6 +9,7 @@ #include "aircraftmodelloaderxplane.h" #include "xplaneutil.h" +#include "blackmisc/simulation/aircraftmodelutils.h" #include "blackmisc/predicates.h" #include "blackmisc/logmessage.h" #include "blackmisc/fileutils.h" @@ -80,7 +81,7 @@ namespace BlackMisc [this, rootDirectory, excludedDirectories, dbModels]() { auto models = performParsing(rootDirectory, excludedDirectories); - mergeWithDbData(models, dbModels); + CAircraftModelUtilities::mergeWithDbData(models, dbModels); return models; }); m_parserWorker->thenWithResult(this, [this](const auto & models) @@ -91,7 +92,7 @@ namespace BlackMisc else if (mode.testFlag(LoadDirectly)) { CAircraftModelList models(performParsing(m_rootDirectory, m_excludedDirectories)); - mergeWithDbData(models, dbModels); + CAircraftModelUtilities::mergeWithDbData(models, dbModels); updateInstalledModels(models); } } @@ -111,7 +112,7 @@ namespace BlackMisc void CAircraftModelLoaderXPlane::updateInstalledModels(const CAircraftModelList &models) { - this->setModelsInCache(models); + this->setCachedModels(models); emit loadingFinished(true, this->m_simulatorInfo); }