From c5f89d0debe132c9e0e3f8eee37dd6d848b87bac Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 9 Mar 2017 22:50:17 +0100 Subject: [PATCH] refs #907, menu to consolidate against own models * restructured menu paths * menu providing the functionality --- .../components/dbownmodelsetcomponent.cpp | 1 + src/blackgui/menus/aircraftmodelmenus.cpp | 144 +++++++++++++++++- src/blackgui/menus/aircraftmodelmenus.h | 53 +++++-- src/blackgui/menus/menuaction.cpp | 12 ++ src/blackgui/menus/menuaction.h | 34 +++-- 5 files changed, 215 insertions(+), 29 deletions(-) diff --git a/src/blackgui/components/dbownmodelsetcomponent.cpp b/src/blackgui/components/dbownmodelsetcomponent.cpp index 468b59597..509f2747c 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.cpp +++ b/src/blackgui/components/dbownmodelsetcomponent.cpp @@ -63,6 +63,7 @@ namespace BlackGui ui->tvp_OwnModelSet->setJsonLoad(CAircraftModelView::AllowOnlySingleSimulator | CAircraftModelView::ReduceToOneSimulator); ui->tvp_OwnModelSet->setCustomMenu(new CLoadModelsMenu(this)); ui->tvp_OwnModelSet->setCustomMenu(new CConsolidateWithDbDataMenu(ui->tvp_OwnModelSet, this, true)); + ui->tvp_OwnModelSet->setCustomMenu(new CConsolidateWithSimulatorModels(ui->tvp_OwnModelSet, this, false)); ui->tvp_OwnModelSet->menuAddItems(CAircraftModelView::MenuOrderable); ui->tvp_OwnModelSet->setSorting(CAircraftModel::IndexOrderString); ui->tvp_OwnModelSet->initAsOrderable(); diff --git a/src/blackgui/menus/aircraftmodelmenus.cpp b/src/blackgui/menus/aircraftmodelmenus.cpp index 00b94a9ac..9578970fc 100644 --- a/src/blackgui/menus/aircraftmodelmenus.cpp +++ b/src/blackgui/menus/aircraftmodelmenus.cpp @@ -9,12 +9,13 @@ #include "aircraftmodelmenus.h" #include "blackgui/guiapplication.h" +#include "blackgui/components/dbmappingcomponent.h" +#include "blackgui/components/dbmappingcomponentaware.h" #include "blackcore/webdataservices.h" #include "blackcore/db/databaseutils.h" #include "blackmisc/verify.h" #include "blackmisc/icons.h" #include "blackmisc/logmessage.h" -#include "blackmisc/simulation/aircraftmodelinterfaces.h" #include "blackmisc/simulation/aircraftmodelutils.h" #include @@ -24,6 +25,7 @@ using namespace BlackMisc::Simulation; using namespace BlackGui; using namespace BlackGui::Views; using namespace BlackGui::Models; +using namespace BlackGui::Components; using namespace BlackCore::Db; namespace BlackGui @@ -130,6 +132,8 @@ namespace BlackGui } } + // --------------------------------- with DB data --------------------------------- + CConsolidateWithDbDataMenu::CConsolidateWithDbDataMenu(CAircraftModelView *modelView, QObject *modelsTarget, bool separator) : IAircraftModelViewMenu(modelView, separator), m_modelsTarget(modelsTarget) { @@ -154,13 +158,12 @@ namespace BlackGui if (mv->isEmpty()) { this->nestedCustomMenu(menuActions); return; } if (!sGui->hasWebDataServices()) { this->nestedCustomMenu(menuActions); return; } - menuActions.addMenuDatabase(); - menuActions.addMenu(CIcons::databaseEdit16(), "Consolidate with DB data", CMenuAction::pathViewDatabaseConsolidate()); + menuActions.addMenuConsolidateModels(); - this->m_consolidateAll = menuActions.addAction(this->m_consolidateAll, "All", CMenuAction::pathViewDatabaseConsolidate(), { this, &CConsolidateWithDbDataMenu::ps_consolidateData }); + this->m_consolidateAll = menuActions.addAction(this->m_consolidateAll, CIcons::databaseEdit16(), "All with DB data", CMenuAction::pathViewModelsConsolidate(), { this, &CConsolidateWithDbDataMenu::ps_consolidateData }); if (mv->hasSelection()) { - this->m_consolidateSelected = menuActions.addAction(this->m_consolidateSelected, "Selected only", CMenuAction::pathViewDatabaseConsolidate(), { this, &CConsolidateWithDbDataMenu::ps_consolidateSelectedData }); + this->m_consolidateSelected = menuActions.addAction(this->m_consolidateSelected, CIcons::databaseEdit16(), "Selected with DB data", CMenuAction::pathViewModelsConsolidate(), { this, &CConsolidateWithDbDataMenu::ps_consolidateSelectedData }); } this->nestedCustomMenu(menuActions); } @@ -235,5 +238,136 @@ namespace BlackGui { return qobject_cast(this->m_modelsTarget); } + + // --------------------------------- with simulator models --------------------------------- + + CConsolidateWithSimulatorModels::CConsolidateWithSimulatorModels(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(); + Q_ASSERT_X(ok, Q_FUNC_INFO, "Neither setable nor updatable"); + Q_UNUSED(ok); + } + } + + const CLogCategoryList &CConsolidateWithSimulatorModels::getLogCategories() + { + static const CLogCategoryList cats { CLogCategory::mapping(), CLogCategory::guiComponent() }; + return cats; + } + + void CConsolidateWithSimulatorModels::customMenu(CMenuActions &menuActions) + { + const CAircraftModelView *mv = modelView(); + if (mv->isEmpty()) { this->nestedCustomMenu(menuActions); return; } + if (!sGui->hasWebDataServices()) { this->nestedCustomMenu(menuActions); return; } + + menuActions.addMenuConsolidateModels(); + + this->m_consolidateAll = menuActions.addAction(this->m_consolidateAll, CIcons::appModels16(), "All with simulator models", CMenuAction::pathViewModelsConsolidate(), { this, &CConsolidateWithSimulatorModels::ps_consolidateData }); + if (mv->hasSelection()) + { + this->m_consolidateSelected = menuActions.addAction(this->m_consolidateSelected, CIcons::appModels16(), "Selected with simulator models", CMenuAction::pathViewModelsConsolidate(), { this, &CConsolidateWithSimulatorModels::ps_consolidateSelectedData }); + } + this->nestedCustomMenu(menuActions); + } + + void CConsolidateWithSimulatorModels::ps_consolidateData() + { + bool filtered = false; + const CAircraftModelList models(this->getAllOrAllFilteredAircraftModels(&filtered)); + if (models.isEmpty()) { return; } + const int i = this->modelView()->showLoadIndicator(); + const CAircraftModelList consolidated = CDatabaseUtils::consolidateModelsWithSimulatorModelsAllowsGuiRefresh(models, this->getSimulatorModels(), true); + const CSimulatorInfo sim(this->getSimulator()); + + if (!filtered) + { + this->modelsTargetSetable()->setModels(consolidated, sim); + } + else + { + if (!this->modelsTargetUpdatable()) + { + CLogMessage(this).warning("No updatable target"); + } + else + { + this->modelsTargetUpdatable()->updateModels(consolidated, sim); + } + } + this->modelView()->hideLoadIndicator(i); + } + + void CConsolidateWithSimulatorModels::ps_consolidateSelectedData() + { + Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); + const CAircraftModelList models(this->getSelectedAircraftModels()); + if (models.isEmpty()) { return; } + if (!this->modelsTargetUpdatable()) + { + CLogMessage(this).warning("No updatable target"); + return; + } + + const int i = this->modelView()->showLoadIndicator(); + const CAircraftModelList consolidated = CDatabaseUtils::consolidateModelsWithSimulatorModelsAllowsGuiRefresh(models, this->getSimulatorModels(), true); + const CSimulatorInfo sim(this->getSimulator()); + + this->modelsTargetUpdatable()->updateModels(consolidated, sim); + this->modelView()->hideLoadIndicator(i); + } + + CAircraftModelList CConsolidateWithSimulatorModels::getSimulatorModels() const + { + CDbMappingComponent *mc = this->getMappingComponent(); + Q_ASSERT_X(mc, Q_FUNC_INFO, "No mapping component"); + const CSimulatorInfo sim = this->getSimulator(); + mc->setOwnModelsSimulator(sim); + return mc->getOwnModels(); + } + + CSimulatorInfo CConsolidateWithSimulatorModels::getSimulator() const + { + const ISimulatorSelectable *s = this->simulatorSelectable(); + Q_ASSERT_X(s, Q_FUNC_INFO, "No ISimulatorSelectable"); + const CSimulatorInfo sim = s->getSelectedSimulator(); + Q_ASSERT_X(sim.isSingleSimulator(), Q_FUNC_INFO, "Need single simulator"); + return sim; + } + + IModelsPerSimulatorSetable *CConsolidateWithSimulatorModels::modelsTargetSetable() const + { + return qobject_cast(this->m_modelsTarget); + } + + IModelsPerSimulatorUpdatable *CConsolidateWithSimulatorModels::modelsTargetUpdatable() const + { + return qobject_cast(this->m_modelsTarget); + } + + ISimulatorSelectable *CConsolidateWithSimulatorModels::simulatorSelectable() const + { + return qobject_cast(this->m_modelsTarget); + } + + Components::CDbMappingComponent *CConsolidateWithSimulatorModels::getMappingComponent() const + { + // try to cast target + CDbMappingComponent *mc = nullptr; + CDbMappingComponentAware *mca = qobject_cast(this->m_modelsTarget); + if (mca) + { + mc = mca->getMappingComponent(); + } + if (!mc) + { + mc = qobject_cast(this->m_modelsTarget); + } + return mc; + } } // ns } // ns diff --git a/src/blackgui/menus/aircraftmodelmenus.h b/src/blackgui/menus/aircraftmodelmenus.h index 87a2f2ed9..61d664f85 100644 --- a/src/blackgui/menus/aircraftmodelmenus.h +++ b/src/blackgui/menus/aircraftmodelmenus.h @@ -13,23 +13,16 @@ #include "blackgui/menus/menudelegate.h" #include "blackgui/overlaymessagesframe.h" #include "blackgui/views/aircraftmodelview.h" +#include "blackmisc/simulation/aircraftmodelinterfaces.h" #include #include class QAction; -namespace BlackMisc -{ - namespace Simulation - { - class IModelsSetable; - class IModelsUpdatable; - } -} - namespace BlackGui { + namespace Components { class CDbMappingComponent; } namespace Menus { //! Menu base for aircraft model view menus @@ -115,6 +108,48 @@ namespace BlackGui QAction *m_consolidateAll = nullptr; //!< consolidate data with DB (all) QAction *m_consolidateSelected = nullptr; //!< consolidate data with DB (selected) }; + + //! Merge with simulator models (e.g. remove no longer existing models) + class CConsolidateWithSimulatorModels : public IAircraftModelViewMenu + { + Q_OBJECT + + public: + //! Constructor + using IAircraftModelViewMenu::IAircraftModelViewMenu; + + //! Constructor + CConsolidateWithSimulatorModels(BlackGui::Views::CAircraftModelView *modelView, QObject *modelsTarget, bool separator = true); + + //! Log.categories + static const BlackMisc::CLogCategoryList &getLogCategories(); + + //! \copydoc IMenuDelegate::customMenu + virtual void customMenu(CMenuActions &menuActions) override; + + //! Change target + void setModelsTarget(QObject *target) { this->m_modelsTarget = target; } + + private slots: + void ps_consolidateData(); + void ps_consolidateSelectedData(); + + private: + //! Get models + BlackMisc::Simulation::CAircraftModelList getSimulatorModels() const; + + //! Simulator + BlackMisc::Simulation::CSimulatorInfo getSimulator() const; + + BlackMisc::Simulation::IModelsPerSimulatorSetable *modelsTargetSetable() const; + BlackMisc::Simulation::IModelsPerSimulatorUpdatable *modelsTargetUpdatable() const; + BlackMisc::Simulation::ISimulatorSelectable *simulatorSelectable() const; + BlackGui::Components::CDbMappingComponent *getMappingComponent() const; + + 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 diff --git a/src/blackgui/menus/menuaction.cpp b/src/blackgui/menus/menuaction.cpp index 44eb358f1..bec36e598 100644 --- a/src/blackgui/menus/menuaction.cpp +++ b/src/blackgui/menus/menuaction.cpp @@ -90,6 +90,12 @@ namespace BlackGui return subdir; } + const CMenuAction &CMenuAction::subMenuConsolidateModels() + { + static const CMenuAction subdir(CIcons::appModels16(), "Consolidate models", CMenuAction::pathViewModelsConsolidate()); + return subdir; + } + const CMenuAction &CMenuAction::subMenuSimulator() { static const CMenuAction subdir(CIcons::appSimulator16(), "Simulator", CMenuAction::pathSimulator()); @@ -422,6 +428,12 @@ namespace BlackGui return this->addMenu(CMenuAction::subMenuDatabase()); } + CMenuAction CMenuActions::addMenuConsolidateModels() + { + if (this->containsMenu(CMenuAction::pathViewModelsConsolidate())) { CMenuAction(); } + return this->addMenu(CMenuAction::subMenuConsolidateModels()); + } + CMenuAction CMenuActions::addMenuModelSet() { if (this->containsMenu(CMenuAction::pathModelSet())) { CMenuAction(); } diff --git a/src/blackgui/menus/menuaction.h b/src/blackgui/menus/menuaction.h index 0f622f0f8..7d55e2e8d 100644 --- a/src/blackgui/menus/menuaction.h +++ b/src/blackgui/menus/menuaction.h @@ -149,29 +149,29 @@ namespace BlackGui //! Database static const QString &pathViewDatabase() { static const QString p("View.10.Database/Database"); return p; } - //! Database consolidation - static const QString &pathViewDatabaseConsolidate() { static const QString p("View.10.Database/Database/Consolidate"); return p; } + //! Consolidate + static const QString &pathViewModelsConsolidate() { static const QString p("View.11.Models/Consolidate"); return p; } //! Select add remove - static const QString &pathViewAddRemove() { static const QString p("View.11.AddRemove"); return p; } + static const QString &pathViewAddRemove() { static const QString p("View.12.AddRemove"); return p; } //! View selection mode - static const QString &pathViewSelection() { static const QString p("View.12.Selection/Selection"); return p; } + static const QString &pathViewSelection() { static const QString p("View.13.Selection/Selection"); return p; } //! Order submenus - static const QString &pathViewOrder() { static const QString p("View.13.Order/Order"); return p; } + static const QString &pathViewOrder() { static const QString p("View.14.Order/Order"); return p; } //! View resizing - static const QString &pathViewResize() { static const QString p("View.14.Resize"); return p; } + static const QString &pathViewResize() { static const QString p("View.15.Resize"); return p; } //! View clear highlighting - static const QString &pathViewClearHighlighting() { static const QString p("View.15.ClearHighlight"); return p; } + static const QString &pathViewClearHighlighting() { static const QString p("View.16.ClearHighlight"); return p; } //! View filter - static const QString &pathViewFilter() { static const QString p("View.16.Filter"); return p; } + static const QString &pathViewFilter() { static const QString p("View.17.Filter"); return p; } //! View update - static const QString &pathViewUpdates() { static const QString p("View.17.Updates"); return p; } + static const QString &pathViewUpdates() { static const QString p("View.18.Updates"); return p; } //! View load/save static const QString &pathViewLoadSave() { static const QString p("View.18.LoadSave"); return p; } @@ -186,15 +186,16 @@ namespace BlackGui //! @{ static const CMenuAction &subMenuDatabase(); static const CMenuAction &subMenuSimulator(); + static const CMenuAction &subMenuConsolidateModels(); //! @} private: - QAction *m_action = nullptr; //!< the action - QIcon m_icon; //!< icon - QString m_title; //!< title - QString m_path; //!< path in menu - bool m_separator = false; //!< separator - bool m_isMenu = false; //!< is menu? + QAction *m_action = nullptr; //!< the action + QIcon m_icon; //!< icon + QString m_title; //!< title + QString m_path; //!< path in menu + bool m_separator = false; //!< separator + bool m_isMenu = false; //!< is menu? }; /*! @@ -317,6 +318,9 @@ namespace BlackGui //! Database menu CMenuAction addMenuDatabase(); + //! Consolidate models menu + CMenuAction addMenuConsolidateModels(); + //! Model set menu CMenuAction addMenuModelSet();