refs #720, support of filtered data

This commit is contained in:
Klaus Basan
2016-08-09 02:13:55 +02:00
committed by Mathew Sutcliffe
parent a9464ef537
commit fa4b90c43a
2 changed files with 64 additions and 27 deletions

View File

@@ -10,6 +10,7 @@
#include "aircraftmodelmenus.h" #include "aircraftmodelmenus.h"
#include "blackgui/guiapplication.h" #include "blackgui/guiapplication.h"
#include "blackcore/webdataservices.h" #include "blackcore/webdataservices.h"
#include "blackcore/db/databaseutils.h"
#include "blackmisc/verify.h" #include "blackmisc/verify.h"
#include "blackmisc/icons.h" #include "blackmisc/icons.h"
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
@@ -23,6 +24,7 @@ using namespace BlackMisc::Simulation;
using namespace BlackGui; using namespace BlackGui;
using namespace BlackGui::Views; using namespace BlackGui::Views;
using namespace BlackGui::Models; using namespace BlackGui::Models;
using namespace BlackCore::Db;
namespace BlackGui namespace BlackGui
{ {
@@ -42,6 +44,13 @@ namespace BlackGui
return mv->container(); 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 CAircraftModelList IAircraftModelViewMenu::getSelectedAircraftModels() const
{ {
const CAircraftModelView *mv = modelView(); 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) IAircraftModelViewMenu(modelView, separator), m_modelsTarget(modelsTarget)
{ {
// it can be the target is not yet known
if (modelsTarget) if (modelsTarget)
{ {
bool ok = modelsTargetSetable() || modelsTargetUpdatable(); bool ok = modelsTargetSetable() || modelsTargetUpdatable();
@@ -121,24 +131,24 @@ namespace BlackGui
} }
} }
void CMergeWithDbDataMenu::customMenu(CMenuActions &menuActions) void CConsolidateWithDbDataMenu::customMenu(CMenuActions &menuActions)
{ {
const CAircraftModelView *mv = modelView(); const CAircraftModelView *mv = modelView();
if (mv->isEmpty()) { this->nestedCustomMenu(menuActions); return; } if (mv->isEmpty()) { this->nestedCustomMenu(menuActions); return; }
if (!sGui->hasWebDataServices()) { this->nestedCustomMenu(menuActions); return; } if (!sGui->hasWebDataServices()) { this->nestedCustomMenu(menuActions); return; }
menuActions.addMenuDatabase(); 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()) 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); this->nestedCustomMenu(menuActions);
} }
void CMergeWithDbDataMenu::ps_mergeData() void CConsolidateWithDbDataMenu::ps_consolidateData()
{ {
BLACK_VERIFY_X(sGui, Q_FUNC_INFO, "Missing sGui"); BLACK_VERIFY_X(sGui, Q_FUNC_INFO, "Missing sGui");
if (!sGui->hasWebDataServices()) { return; } if (!sGui->hasWebDataServices()) { return; }
@@ -146,46 +156,67 @@ namespace BlackGui
const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels());
if (dbModels.isEmpty()) 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; return;
} }
this->modelView()->showLoadIndicator(); this->modelView()->showLoadIndicator();
CAircraftModelList models(this->getAircraftModels()); CAircraftModelList models(this->getAllOrAllFilteredAircraftModels());
int c = CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); const int unfilteredSize = this->modelView()->rowCount();
if (c > 0 && this->modelsTargetSetable()) 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); if (filtered)
CLogMessage().info("Merged %1/%2 models with DB") << c << models.size(); {
this->modelsTargetUpdatable()->updateModels(models);
CLogMessage().info("Consolidated filtered %1/%2 models with DB") << c << models.size();
} }
else else
{ {
CLogMessage().info("No data merged with DB"); this->modelsTargetSetable()->setModels(models);
CLogMessage().info("Consolidated %1/%2 models with DB") << c << models.size();
}
}
else
{
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"); Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui");
if (!sGui->hasWebDataServices()) { return; } if (!sGui->hasWebDataServices()) { return; }
CAircraftModelList models(this->getSelectedAircraftModels()); CAircraftModelList models(this->getSelectedAircraftModels());
if (models.isEmpty()) { return; } if (models.isEmpty()) { return; }
const CAircraftModelList dbModels(sGui->getWebDataServices()->getModels()); if (!this->modelsTargetUpdatable())
{
CAircraftModelUtilities::mergeWithDbData(models, dbModels, true); CLogMessage().warning("No updatable target");
if (this->modelsTargetUpdatable()) return;
}
int c = CDatabaseUtils::consolidateModelsWithDbData(models, true);
if (c > 0 && this->modelsTargetUpdatable())
{ {
this->modelsTargetUpdatable()->updateModels(models); this->modelsTargetUpdatable()->updateModels(models);
} }
} }
IModelsSetable *CMergeWithDbDataMenu::modelsTargetSetable() const IModelsSetable *CConsolidateWithDbDataMenu::modelsTargetSetable() const
{ {
return qobject_cast<IModelsSetable *>(this->m_modelsTarget); return qobject_cast<IModelsSetable *>(this->m_modelsTarget);
} }
IModelsUpdatable *CMergeWithDbDataMenu::modelsTargetUpdatable() const IModelsUpdatable *CConsolidateWithDbDataMenu::modelsTargetUpdatable() const
{ {
return qobject_cast<IModelsUpdatable *>(this->m_modelsTarget); return qobject_cast<IModelsUpdatable *>(this->m_modelsTarget);
} }

View File

@@ -48,6 +48,9 @@ namespace BlackGui
//! Get aircraft models //! Get aircraft models
const BlackMisc::Simulation::CAircraftModelList &getAircraftModels() const; const BlackMisc::Simulation::CAircraftModelList &getAircraftModels() const;
//! Get aircraft models (all, or all filtered)
const BlackMisc::Simulation::CAircraftModelList &getAllOrAllFilteredAircraftModels() const;
//! Selected aircraft models //! Selected aircraft models
BlackMisc::Simulation::CAircraftModelList getSelectedAircraftModels() const; BlackMisc::Simulation::CAircraftModelList getSelectedAircraftModels() const;
}; };
@@ -75,7 +78,7 @@ namespace BlackGui
}; };
//! Merge with DB data //! Merge with DB data
class CMergeWithDbDataMenu : public IAircraftModelViewMenu class CConsolidateWithDbDataMenu : public IAircraftModelViewMenu
{ {
Q_OBJECT Q_OBJECT
@@ -84,21 +87,24 @@ namespace BlackGui
using IAircraftModelViewMenu::IAircraftModelViewMenu; using IAircraftModelViewMenu::IAircraftModelViewMenu;
//! Constructor //! Constructor
CMergeWithDbDataMenu(BlackGui::Views::CAircraftModelView *modelView, QObject *modelsTarget, bool separator = true); CConsolidateWithDbDataMenu(BlackGui::Views::CAircraftModelView *modelView, QObject *modelsTarget, bool separator = true);
//! \copydoc IMenuDelegate::customMenu //! \copydoc IMenuDelegate::customMenu
virtual void customMenu(CMenuActions &menuActions) override; virtual void customMenu(CMenuActions &menuActions) override;
//! Change target
void setModelsTarget(QObject *target) { this->m_modelsTarget = target; }
private slots: private slots:
void ps_mergeData(); void ps_consolidateData();
void ps_mergeSelectedData(); void ps_consolidateSelectedData();
private: private:
BlackMisc::Simulation::IModelsSetable *modelsTargetSetable() const; BlackMisc::Simulation::IModelsSetable *modelsTargetSetable() const;
BlackMisc::Simulation::IModelsUpdatable *modelsTargetUpdatable() const; BlackMisc::Simulation::IModelsUpdatable *modelsTargetUpdatable() const;
QObject *m_modelsTarget = nullptr; //!< optional target for setting/updating the models QObject *m_modelsTarget = nullptr; //!< optional target for setting/updating the models
QAction *m_mergeAll = nullptr; QAction *m_consolidateAll = nullptr; //!< consolidate data with DB (all)
QAction *m_mergeSelected = nullptr; QAction *m_consolidateSelected = nullptr; //!< consolidate data with DB (selected)
}; };
} // ns } // ns
} // ns } // ns