From 610dba2028cd2a35946058ffb52aacc322628405 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 3 Sep 2016 23:22:10 +0200 Subject: [PATCH] refs #757, materialize filtered data * menu item / flag * functions in view class * some minor formatting --- .../components/dbownmodelsetcomponent.cpp | 1 + .../components/dbownmodelsetcomponent.h | 2 -- src/blackgui/models/listmodelbase.cpp | 32 +++++++++++-------- src/blackgui/models/listmodelbase.h | 4 ++- src/blackgui/views/aircraftmodelview.h | 2 -- src/blackgui/views/viewbase.cpp | 16 ++++++++++ src/blackgui/views/viewbase.h | 17 ++++++---- 7 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/blackgui/components/dbownmodelsetcomponent.cpp b/src/blackgui/components/dbownmodelsetcomponent.cpp index de42786ea..8f899f891 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.cpp +++ b/src/blackgui/components/dbownmodelsetcomponent.cpp @@ -56,6 +56,7 @@ namespace BlackGui ui->tvp_OwnModelSet->menuAddItems(CAircraftModelView::MenuStashing); ui->tvp_OwnModelSet->menuRemoveItems(CAircraftModelView::MenuDisplayAutomaticallyAndRefresh | CAircraftModelView::MenuBackend | CAircraftModelView::MenuRefresh); ui->tvp_OwnModelSet->menuAddItems(CAircraftModelView::MenuRemoveSelectedRows | CAircraftModelView::MenuClear); + ui->tvp_OwnModelSet->menuAddItems(CAircraftModelView::MenuRemoveSelectedRows | CAircraftModelView::MenuMaterializeFilter); ui->tvp_OwnModelSet->addFilterDialog(); ui->tvp_OwnModelSet->setJsonLoad(CAircraftModelView::AllowOnlySingleSimulator | CAircraftModelView::ReduceToOneSimulator); ui->tvp_OwnModelSet->setCustomMenu(new CLoadModelsMenu(this)); diff --git a/src/blackgui/components/dbownmodelsetcomponent.h b/src/blackgui/components/dbownmodelsetcomponent.h index defa942d5..57d502a93 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.h +++ b/src/blackgui/components/dbownmodelsetcomponent.h @@ -32,12 +32,10 @@ class QWidget; namespace BlackMisc { namespace Simulation { class CAircraftModel; } } namespace Ui { class CDbOwnModelSetComponent; } - namespace BlackGui { namespace Menus { class CMenuActions; } namespace Views { class CAircraftModelView; } - namespace Components { class CDbMappingComponent; diff --git a/src/blackgui/models/listmodelbase.cpp b/src/blackgui/models/listmodelbase.cpp index 5e3fbc65b..fc76308b1 100644 --- a/src/blackgui/models/listmodelbase.cpp +++ b/src/blackgui/models/listmodelbase.cpp @@ -499,6 +499,25 @@ namespace BlackGui return this->m_container; } + template + const ContainerType &CListModelBase::containerFiltered() const + { + return this->m_containerFiltered; + } + + template + const ContainerType &CListModelBase::containerOrFilteredContainer() const + { + if (this->hasFilter()) + { + return this->m_containerFiltered; + } + else + { + return this->m_container; + } + } + template void CListModelBase::push_back(const ObjectType &object) { @@ -585,19 +604,6 @@ namespace BlackGui return this->update(c, sort); } - template - const ContainerType &CListModelBase::containerOrFilteredContainer() const - { - if (this->hasFilter()) - { - return this->m_containerFiltered; - } - else - { - return this->m_container; - } - } - template void CListModelBase::updateFilteredContainer() { diff --git a/src/blackgui/models/listmodelbase.h b/src/blackgui/models/listmodelbase.h index 2b6b21b49..583a0f67c 100644 --- a/src/blackgui/models/listmodelbase.h +++ b/src/blackgui/models/listmodelbase.h @@ -37,7 +37,6 @@ class QMimeData; class QModelIndex; namespace BlackMisc { class CWorker; } - namespace BlackGui { namespace Models @@ -205,6 +204,9 @@ namespace BlackGui //! Used container data const ContainerType &container() const; + //! Used container data + const ContainerType &containerFiltered() const; + //! Full container or cached filtered container as approproiate const ContainerType &containerOrFilteredContainer() const; diff --git a/src/blackgui/views/aircraftmodelview.h b/src/blackgui/views/aircraftmodelview.h index 5a4a34fe6..eb3b4f898 100644 --- a/src/blackgui/views/aircraftmodelview.h +++ b/src/blackgui/views/aircraftmodelview.h @@ -41,12 +41,10 @@ namespace BlackMisc } } namespace BlackMisc { namespace Simulation { class CAircraftModel; } } - namespace BlackGui { namespace Filters { class CAircraftModelFilterDialog; } namespace Menus { class CMenuActions; } - namespace Views { //! Aircraft view diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index e7e8753f6..b6a6035c8 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -257,6 +257,7 @@ namespace BlackGui ma.addAction(CIcons::filter16(), "Remove Filter", CMenuAction::pathViewFilter(), { this, &CViewBaseNonTemplate::ps_removeFilter }); break; } + case MenuMaterializeFilter: { ma.addAction(CIcons::tableRelationship16(), "Materialize filtered data", CMenuAction::pathViewFilter(), { this, &CViewBaseNonTemplate::materializeFilter }); break; } case MenuLoad: { ma.addAction(CIcons::disk16(), "Load from file", CMenuAction::pathViewLoadSave(), { this, &CViewBaseNonTemplate::ps_loadJsonAction }); break; } case MenuSave: { ma.addAction(CIcons::disk16(), "Save data in file", CMenuAction::pathViewLoadSave(), { this, &CViewBaseNonTemplate::ps_saveJsonAction }, CShortcut::keySaveViews()); break; } default: @@ -297,6 +298,10 @@ namespace BlackGui if (this->m_menus.testFlag(MenuFilter)) { menuActions.addActions(this->initMenuActions(MenuFilter)); + if (this->m_menus.testFlag(MenuMaterializeFilter)) + { + menuActions.addActions(this->initMenuActions(MenuMaterializeFilter)); + } } // selection menus, not in menu action list because it depends on current selection @@ -967,6 +972,17 @@ namespace BlackGui return this->m_model->clearHighlighting(); } + template + void CViewBase::materializeFilter() + { + Q_ASSERT(this->m_model); + if (!this->m_model->hasFilter()) { return; } + if (this->isEmpty()) { return; } + ContainerType filtered(this->m_model->containerFiltered()); + this->removeFilter(); + this->updateContainerMaybeAsync(filtered); + } + template int CViewBase::rowCount() const { diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index deacd4481..3ad41e619 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -107,10 +107,11 @@ namespace BlackGui MenuDisplayAutomatically = 1 << 4, //!< allow to switch display automatically MenuDisplayAutomaticallyAndRefresh = MenuDisplayAutomatically | MenuRefresh, //!< should come together MenuFilter = 1 << 5, //!< filter can be opened - MenuSave = 1 << 6, //!< save as JSON - MenuLoad = 1 << 7, //!< load from JSON - MenuToggleSelectionMode = 1 << 8, //!< allow to toggle selection mode - MenuOrderable = 1 << 9, //!< items can be ordered (if container is BlackMisc::IOrderableList + MenuMaterializeFilter = 1 << 6, //!< materialize filter (filtered data become model data) + MenuSave = 1 << 7, //!< save as JSON + MenuLoad = 1 << 8, //!< load from JSON + MenuToggleSelectionMode = 1 << 9, //!< allow to toggle selection mode + MenuOrderable = 1 << 10, //!< items can be ordered (if container is BlackMisc::IOrderableList MenuStandard = MenuClear | MenuRemoveSelectedRows | MenuRefresh | MenuBackend | MenuDisplayAutomatically | MenuFilter | MenuSave | MenuLoad | MenuToggleSelectionMode, MenuLoadAndSave = MenuLoad | MenuSave, @@ -119,8 +120,8 @@ namespace BlackGui MenuDefaultDbViews = MenuToggleSelectionMode | MenuBackend, // special menus, should be in derived classes, but enums cannot be inherited // maybe shifted in the future to elsewhere - MenuHighlightStashed = 1 << 10, //!< highlight stashed models - MenuCanStashModels = 1 << 11, //!< stash models + MenuHighlightStashed = 1 << 11, //!< highlight stashed models + MenuCanStashModels = 1 << 12, //!< stash models MenuStashing = MenuHighlightStashed | MenuCanStashModels, }; Q_DECLARE_FLAGS(Menu, MenuFlag) @@ -312,6 +313,9 @@ namespace BlackGui //! Clear any highlighted objects virtual void clearHighlighting() = 0; + //! Materialize filter + virtual void materializeFilter() = 0; + protected: //! Constructor CViewBaseNonTemplate(QWidget *parent); @@ -547,6 +551,7 @@ namespace BlackGui virtual int removeSelectedRows() override; virtual void presizeOrFullResizeToContents() override; virtual void clearHighlighting() override; + virtual void materializeFilter() override; //! @} //! \name BlackGui::Views::CViewBaseNonTemplate implementations