diff --git a/src/blackgui/menus/aircraftmodelmenus.cpp b/src/blackgui/menus/aircraftmodelmenus.cpp index 8eb8f4970..00e56e2fa 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 "blackcore/db/databaseutils.h" #include "blackmisc/verify.h" #include "blackmisc/icons.h" #include "blackmisc/logmessage.h" @@ -23,6 +24,7 @@ using namespace BlackMisc::Simulation; using namespace BlackGui; using namespace BlackGui::Views; using namespace BlackGui::Models; +using namespace BlackCore::Db; namespace BlackGui { @@ -42,6 +44,13 @@ namespace BlackGui return mv->container(); } + const CAircraftModelList &IAircraftModelViewMenu::getAllOrAllFilteredAircraftModels() const + { + const CAircraftModelView *mv = modelView(); + Q_ASSERT_X(mv, Q_FUNC_INFO, "no view"); + return mv->containerOrFilteredContainer(); + } + CAircraftModelList IAircraftModelViewMenu::getSelectedAircraftModels() const { const CAircraftModelView *mv = modelView(); @@ -110,9 +119,10 @@ namespace BlackGui } } - CMergeWithDbDataMenu::CMergeWithDbDataMenu(CAircraftModelView *modelView, QObject *modelsTarget, bool separator) : + CConsolidateWithDbDataMenu::CConsolidateWithDbDataMenu(CAircraftModelView *modelView, QObject *modelsTarget, bool separator) : IAircraftModelViewMenu(modelView, separator), m_modelsTarget(modelsTarget) { + // it can be the target is not yet known if (modelsTarget) { bool ok = modelsTargetSetable() || modelsTargetUpdatable(); @@ -121,24 +131,24 @@ namespace BlackGui } } - void CMergeWithDbDataMenu::customMenu(CMenuActions &menuActions) + void CConsolidateWithDbDataMenu::customMenu(CMenuActions &menuActions) { const CAircraftModelView *mv = modelView(); if (mv->isEmpty()) { this->nestedCustomMenu(menuActions); return; } if (!sGui->hasWebDataServices()) { this->nestedCustomMenu(menuActions); return; } menuActions.addMenuDatabase(); - menuActions.addMenu(CIcons::databaseEdit16(), "Merge with DB data", CMenuAction::pathViewDatabaseMerge()); + menuActions.addMenu(CIcons::databaseEdit16(), "Consolidate with DB data", CMenuAction::pathViewDatabaseMerge()); - this->m_mergeAll = menuActions.addAction(this->m_mergeAll, "All", CMenuAction::pathViewDatabaseMerge(), { this, &CMergeWithDbDataMenu::ps_mergeData }); + this->m_consolidateAll = menuActions.addAction(this->m_consolidateAll, "All", CMenuAction::pathViewDatabaseMerge(), { this, &CConsolidateWithDbDataMenu::ps_consolidateData }); if (mv->hasSelection()) { - this->m_mergeSelected = menuActions.addAction(this->m_mergeSelected, "Selected only", CMenuAction::pathViewDatabaseMerge(), { this, &CMergeWithDbDataMenu::ps_mergeSelectedData }); + this->m_consolidateSelected = menuActions.addAction(this->m_consolidateSelected, "Selected only", CMenuAction::pathViewDatabaseMerge(), { this, &CConsolidateWithDbDataMenu::ps_consolidateSelectedData }); } this->nestedCustomMenu(menuActions); } - void CMergeWithDbDataMenu::ps_mergeData() + void CConsolidateWithDbDataMenu::ps_consolidateData() { BLACK_VERIFY_X(sGui, Q_FUNC_INFO, "Missing sGui"); if (!sGui->hasWebDataServices()) { return; } @@ -146,46 +156,67 @@ namespace BlackGui const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); if (dbModels.isEmpty()) { - CLogMessage().warning("No DB models to merge with"); + CLogMessage().warning("No DB models to consolidate with"); + return; + } + if (!this->modelsTargetSetable()) + { + CLogMessage().warning("No setable target"); return; } this->modelView()->showLoadIndicator(); - CAircraftModelList models(this->getAircraftModels()); - int c = CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); - if (c > 0 && this->modelsTargetSetable()) + CAircraftModelList models(this->getAllOrAllFilteredAircraftModels()); + const int unfilteredSize = this->modelView()->rowCount(); + const int modelSize = models.size(); + const bool filtered = unfilteredSize > modelSize; + + int c = CDatabaseUtils::consolidateModelsWithDbData(models, true); + if (c > 0 && this->modelsTargetSetable() && this->modelsTargetUpdatable()) { - this->modelsTargetSetable()->setModels(models); - CLogMessage().info("Merged %1/%2 models with DB") << c << models.size(); + if (filtered) + { + this->modelsTargetUpdatable()->updateModels(models); + CLogMessage().info("Consolidated filtered %1/%2 models with DB") << c << models.size(); + } + else + { + this->modelsTargetSetable()->setModels(models); + CLogMessage().info("Consolidated %1/%2 models with DB") << c << models.size(); + } } else { - CLogMessage().info("No data merged with DB"); + CLogMessage().info("No data consolidated with DB"); + this->modelView()->hideLoadIndicator(); } } - void CMergeWithDbDataMenu::ps_mergeSelectedData() + void CConsolidateWithDbDataMenu::ps_consolidateSelectedData() { Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); if (!sGui->hasWebDataServices()) { return; } CAircraftModelList models(this->getSelectedAircraftModels()); if (models.isEmpty()) { return; } - const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); - - CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); - if (this->modelsTargetUpdatable()) + if (!this->modelsTargetUpdatable()) + { + CLogMessage().warning("No updatable target"); + return; + } + int c = CDatabaseUtils::consolidateModelsWithDbData(models, true); + if (c > 0 && this->modelsTargetUpdatable()) { this->modelsTargetUpdatable()->updateModels(models); } } - IModelsSetable *CMergeWithDbDataMenu::modelsTargetSetable() const + IModelsSetable *CConsolidateWithDbDataMenu::modelsTargetSetable() const { return qobject_cast(this->m_modelsTarget); } - IModelsUpdatable *CMergeWithDbDataMenu::modelsTargetUpdatable() const + IModelsUpdatable *CConsolidateWithDbDataMenu::modelsTargetUpdatable() const { return qobject_cast(this->m_modelsTarget); } diff --git a/src/blackgui/menus/aircraftmodelmenus.h b/src/blackgui/menus/aircraftmodelmenus.h index 4de668cbf..a04248479 100644 --- a/src/blackgui/menus/aircraftmodelmenus.h +++ b/src/blackgui/menus/aircraftmodelmenus.h @@ -48,6 +48,9 @@ namespace BlackGui //! Get aircraft models const BlackMisc::Simulation::CAircraftModelList &getAircraftModels() const; + //! Get aircraft models (all, or all filtered) + const BlackMisc::Simulation::CAircraftModelList &getAllOrAllFilteredAircraftModels() const; + //! Selected aircraft models BlackMisc::Simulation::CAircraftModelList getSelectedAircraftModels() const; }; @@ -75,7 +78,7 @@ namespace BlackGui }; //! Merge with DB data - class CMergeWithDbDataMenu : public IAircraftModelViewMenu + class CConsolidateWithDbDataMenu : public IAircraftModelViewMenu { Q_OBJECT @@ -84,21 +87,24 @@ namespace BlackGui using IAircraftModelViewMenu::IAircraftModelViewMenu; //! Constructor - CMergeWithDbDataMenu(BlackGui::Views::CAircraftModelView *modelView, QObject *modelsTarget, bool separator = true); + CConsolidateWithDbDataMenu(BlackGui::Views::CAircraftModelView *modelView, QObject *modelsTarget, bool separator = true); //! \copydoc IMenuDelegate::customMenu virtual void customMenu(CMenuActions &menuActions) override; + //! Change target + void setModelsTarget(QObject *target) { this->m_modelsTarget = target; } + private slots: - void ps_mergeData(); - void ps_mergeSelectedData(); + void ps_consolidateData(); + void ps_consolidateSelectedData(); private: BlackMisc::Simulation::IModelsSetable *modelsTargetSetable() const; BlackMisc::Simulation::IModelsUpdatable *modelsTargetUpdatable() const; - QObject *m_modelsTarget = nullptr; //!< optional target for setting/updating the models - QAction *m_mergeAll = nullptr; - QAction *m_mergeSelected = nullptr; + QObject *m_modelsTarget = nullptr; //!< optional target for setting/updating the models + QAction *m_consolidateAll = nullptr; //!< consolidate data with DB (all) + QAction *m_consolidateSelected = nullptr; //!< consolidate data with DB (selected) }; } // ns } // ns