diff --git a/src/blackgui/shortcut.cpp b/src/blackgui/shortcut.cpp index ba1b37d10..2b92abdc3 100644 --- a/src/blackgui/shortcut.cpp +++ b/src/blackgui/shortcut.cpp @@ -50,4 +50,15 @@ namespace BlackGui return k; } + const QKeySequence &CShortcut::keyDelete() + { + static const QKeySequence k(Qt::Key_Delete); + return k; + } + + const QKeySequence &CShortcut::keyEscape() + { + static const QKeySequence k(Qt::Key_Escape); + return k; + } } // ns diff --git a/src/blackgui/shortcut.h b/src/blackgui/shortcut.h index c3a798d4d..2bcd93032 100644 --- a/src/blackgui/shortcut.h +++ b/src/blackgui/shortcut.h @@ -44,6 +44,12 @@ namespace BlackGui //! Save in views static const QKeySequence &keySaveViews(); + + //! Delete, e.g. selected rows + static const QKeySequence &keyDelete(); + + //! Escape + static const QKeySequence &keyEscape(); }; } // ns #endif // guard diff --git a/src/blackgui/views/aircrafticaoview.cpp b/src/blackgui/views/aircrafticaoview.cpp index ecbb09f7a..ac65755ff 100644 --- a/src/blackgui/views/aircrafticaoview.cpp +++ b/src/blackgui/views/aircrafticaoview.cpp @@ -17,7 +17,7 @@ namespace BlackGui { namespace Views { - CAircraftIcaoCodeView::CAircraftIcaoCodeView(QWidget *parent) : CViewBase(parent) + CAircraftIcaoCodeView::CAircraftIcaoCodeView(QWidget *parent) : CViewWithDbObjects(parent) { this->m_menus |= MenuBackend; this->standardInit(new CAircraftIcaoCodeListModel(this)); diff --git a/src/blackgui/views/aircrafticaoview.h b/src/blackgui/views/aircrafticaoview.h index a829d514c..8621c780b 100644 --- a/src/blackgui/views/aircrafticaoview.h +++ b/src/blackgui/views/aircrafticaoview.h @@ -13,7 +13,7 @@ #define BLACKGUI_AIRCRAFTICAOVIEW_H #include "blackgui/blackguiexport.h" -#include "viewbase.h" +#include "viewdbobjects.h" #include "../models/aircrafticaolistmodel.h" namespace BlackGui @@ -21,9 +21,9 @@ namespace BlackGui namespace Views { //! Aircraft ICAO codes view - class BLACKGUI_EXPORT CAircraftIcaoCodeView : public CViewBase + class BLACKGUI_EXPORT CAircraftIcaoCodeView : + public CViewWithDbObjects { - public: //! Constructor explicit CAircraftIcaoCodeView(QWidget *parent = nullptr); diff --git a/src/blackgui/views/aircraftmodelview.cpp b/src/blackgui/views/aircraftmodelview.cpp index 29736a3eb..e08e15245 100644 --- a/src/blackgui/views/aircraftmodelview.cpp +++ b/src/blackgui/views/aircraftmodelview.cpp @@ -30,7 +30,7 @@ namespace BlackGui { namespace Views { - CAircraftModelView::CAircraftModelView(QWidget *parent) : CViewBase(parent) + CAircraftModelView::CAircraftModelView(QWidget *parent) : CViewWithDbObjects(parent) { // default this->standardInit(new CAircraftModelListModel(CAircraftModelListModel::OwnSimulatorModel, this)); @@ -50,26 +50,22 @@ namespace BlackGui switch (mode) { case CAircraftModelListModel::StashModel: - this->m_menus = MenuClear; - this->setCustomMenu(new CHighlightDbModelsMenu(this, true)); + this->m_menus = MenuClear | MenuHighlightDbData; break; case CAircraftModelListModel::Database: this->m_menus = MenuBackend; break; case CAircraftModelListModel::VPilotRuleModel: - this->m_menus = MenuRefresh; - this->setCustomMenu(new CHighlightDbModelsMenu(this, true)); + this->m_menus = MenuRefresh | MenuHighlightDbData;; this->setCustomMenu(new CHighlightStashedModelsMenu(this, true)); break; case CAircraftModelListModel::OwnSimulatorModelMapping: - this->m_menus = MenuDisplayAutomatically; - this->setCustomMenu(new CHighlightDbModelsMenu(this, true)); + this->m_menus = MenuDisplayAutomatically | MenuHighlightDbData; this->setCustomMenu(new CHighlightStashedModelsMenu(this, true)); break; case CAircraftModelListModel::OwnSimulatorModel: default: - this->m_menus = MenuDisplayAutomatically | MenuBackend | MenuRefresh; - this->setCustomMenu(new CHighlightDbModelsMenu(this, true)); + this->m_menus = MenuDisplayAutomatically | MenuBackend | MenuRefresh | MenuHighlightDbData; break; } } @@ -95,7 +91,7 @@ namespace BlackGui return c; } - bool CAircraftModelView::hasModelsToStash() const + bool CAircraftModelView::hasSelectedModelsToStash() const { return m_allowStash && hasSelection(); } @@ -117,6 +113,18 @@ namespace BlackGui this->setFilterDialog(new CAircraftModelFilterDialog(this)); } + int CAircraftModelView::removeModelsWithModelString(const QStringList &modelStrings, Qt::CaseSensitivity sensitivity) + { + if (modelStrings.isEmpty()) { return 0; } + CAircraftModelList copy(this->container()); + int delta = copy.removeModelsWithString(modelStrings, sensitivity); + if (delta > 0) + { + this->updateContainerMaybeAsync(copy); + } + return delta; + } + void CAircraftModelView::dropEvent(QDropEvent *event) { if (!isDropAllowed()) { return; } @@ -207,12 +215,6 @@ namespace BlackGui } // valid mime? } - void CAircraftModelView::ps_toggleHighlightDbModels() - { - bool h = derivedModel()->highlightDbData(); - derivedModel()->setHighlightDbData(!h); - } - void CAircraftModelView::ps_toggleHighlightStashedModels() { bool h = derivedModel()->highlightGivenModelStrings(); @@ -225,16 +227,6 @@ namespace BlackGui emit requestStash(); } - void CAircraftModelView::CHighlightDbModelsMenu::customMenu(QMenu &menu) const - { - const CAircraftModelView *mv = qobject_cast(parent()); - Q_ASSERT_X(mv, Q_FUNC_INFO, "no view"); - QAction *a = menu.addAction(CIcons::database16(), "Highlight DB models", mv, SLOT(ps_toggleHighlightDbModels())); - a->setCheckable(true); - a->setChecked(mv->derivedModel()->highlightDbData()); - this->nestedCustomMenu(menu); - } - void CAircraftModelView::CHighlightStashedModelsMenu::customMenu(QMenu &menu) const { const CAircraftModelView *mv = qobject_cast(parent()); diff --git a/src/blackgui/views/aircraftmodelview.h b/src/blackgui/views/aircraftmodelview.h index aec3e96f4..219a8d15f 100644 --- a/src/blackgui/views/aircraftmodelview.h +++ b/src/blackgui/views/aircraftmodelview.h @@ -15,7 +15,7 @@ #include "blackgui/blackguiexport.h" #include "blackgui/filters/aircraftmodelfilterdialog.h" #include "blackgui/models/aircraftmodellistmodel.h" -#include "viewbase.h" +#include "viewdbobjects.h" namespace BlackGui { @@ -23,7 +23,7 @@ namespace BlackGui { //! Aircraft view class BLACKGUI_EXPORT CAircraftModelView : - public CViewBase + public CViewWithDbObjects { Q_OBJECT @@ -46,15 +46,18 @@ namespace BlackGui //! Allow to stash void setAllowStash(bool stash) { m_allowStash = stash; } - //! Has any models to stash amd is allowed to stash - bool hasModelsToStash() const; + //! Has any models to stash and it is allowed to stash + bool hasSelectedModelsToStash() const; - //! Add the technically supported metatypes as allows + //! Add the technically supported metatypes allowed for drag and drop void setImplementedMetaTypeIds(); //! Add my own filter dialog void addFilterDialog(); + //! Remove models with model strings + int removeModelsWithModelString(const QStringList &modelStrings, Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive); + signals: //! Request to stash if applicable void requestStash(); @@ -67,9 +70,6 @@ namespace BlackGui virtual void dropEvent(QDropEvent *event) override; private slots: - //! Highlight DB models - void ps_toggleHighlightDbModels(); - //! Highlight stashed models void ps_toggleHighlightStashedModels(); @@ -79,17 +79,6 @@ namespace BlackGui private: bool m_allowStash = false; //!< allow to stash - //! Custom menu for the models which have been loaded - class CHighlightDbModelsMenu : public BlackGui::IMenuDelegate - { - public: - //! Constructor - CHighlightDbModelsMenu(CAircraftModelView *parent, bool separatorAtEnd) : IMenuDelegate(parent, separatorAtEnd) {} - - //! \copydoc IMenuDelegate::customMenu - virtual void customMenu(QMenu &menu) const override; - }; - //! Custom menu for the models which have been loaded class CHighlightStashedModelsMenu : public BlackGui::IMenuDelegate { diff --git a/src/blackgui/views/airlineicaoview.cpp b/src/blackgui/views/airlineicaoview.cpp index 32088828e..3159bb44c 100644 --- a/src/blackgui/views/airlineicaoview.cpp +++ b/src/blackgui/views/airlineicaoview.cpp @@ -17,7 +17,7 @@ namespace BlackGui { namespace Views { - CAirlineIcaoCodeView::CAirlineIcaoCodeView(QWidget *parent) : CViewBase(parent) + CAirlineIcaoCodeView::CAirlineIcaoCodeView(QWidget *parent) : CViewWithDbObjects(parent) { this->m_menus |= MenuBackend; this->standardInit(new CAirlineIcaoCodeListModel(this)); diff --git a/src/blackgui/views/airlineicaoview.h b/src/blackgui/views/airlineicaoview.h index 2f2144dfc..0276491c0 100644 --- a/src/blackgui/views/airlineicaoview.h +++ b/src/blackgui/views/airlineicaoview.h @@ -13,7 +13,7 @@ #define BLACKGUI_AIRLINEICAOVIEW_H #include "blackgui/blackguiexport.h" -#include "viewbase.h" +#include "viewdbobjects.h" #include "../models/airlineicaolistmodel.h" namespace BlackGui @@ -21,9 +21,9 @@ namespace BlackGui namespace Views { //! Aircraft ICAO codes view - class BLACKGUI_EXPORT CAirlineIcaoCodeView : public CViewBase + class BLACKGUI_EXPORT CAirlineIcaoCodeView : + public CViewWithDbObjects { - public: //! Constructor explicit CAirlineIcaoCodeView(QWidget *parent = nullptr); diff --git a/src/blackgui/views/distributorview.cpp b/src/blackgui/views/distributorview.cpp index 63e5e0f4c..c3f744bd2 100644 --- a/src/blackgui/views/distributorview.cpp +++ b/src/blackgui/views/distributorview.cpp @@ -16,7 +16,7 @@ namespace BlackGui { namespace Views { - CDistributorView::CDistributorView(QWidget *parent) : CViewBase(parent) + CDistributorView::CDistributorView(QWidget *parent) : CViewWithDbObjects(parent) { this->m_menus |= MenuBackend; this->standardInit(new CDistributorListModel(this)); diff --git a/src/blackgui/views/distributorview.h b/src/blackgui/views/distributorview.h index d31bfb1d2..34b55c94c 100644 --- a/src/blackgui/views/distributorview.h +++ b/src/blackgui/views/distributorview.h @@ -13,7 +13,7 @@ #define BLACKGUI_DISTRIBUTORVIEW_H #include "blackgui/blackguiexport.h" -#include "viewbase.h" +#include "viewdbobjects.h" #include "../models/distributorlistmodel.h" namespace BlackGui @@ -21,13 +21,13 @@ namespace BlackGui namespace Views { //! Distributors - class BLACKGUI_EXPORT CDistributorView : public CViewBase + class BLACKGUI_EXPORT CDistributorView : + public CViewWithDbObjects { - public: //! Constructor explicit CDistributorView(QWidget *parent = nullptr); }; - } -} + } // ns +} // ns #endif // guard diff --git a/src/blackgui/views/liveryview.cpp b/src/blackgui/views/liveryview.cpp index 7c7635074..d1c7af8f7 100644 --- a/src/blackgui/views/liveryview.cpp +++ b/src/blackgui/views/liveryview.cpp @@ -16,7 +16,7 @@ namespace BlackGui { namespace Views { - CLiveryView::CLiveryView(QWidget *parent) : CViewBase(parent) + CLiveryView::CLiveryView(QWidget *parent) : CViewWithDbObjects(parent) { this->m_menus |= MenuBackend; this->standardInit(new CLiveryListModel(this)); diff --git a/src/blackgui/views/liveryview.h b/src/blackgui/views/liveryview.h index d8bf3774f..e4382e59b 100644 --- a/src/blackgui/views/liveryview.h +++ b/src/blackgui/views/liveryview.h @@ -12,7 +12,7 @@ #ifndef BLACKGUI_LIVERYVIEW_H #define BLACKGUI_LIVERYVIEW_H -#include "viewbase.h" +#include "viewdbobjects.h" #include "blackgui/blackguiexport.h" #include "blackgui/models/liverylistmodel.h" @@ -21,13 +21,13 @@ namespace BlackGui namespace Views { //! Distributors - class BLACKGUI_EXPORT CLiveryView : public CViewBase + class BLACKGUI_EXPORT CLiveryView : + public CViewWithDbObjects { - public: //! Constructor explicit CLiveryView(QWidget *parent = nullptr); }; - } -} + } // ns +} // ns #endif // guard diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index d66aae13b..db0586c4d 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -57,6 +57,8 @@ namespace BlackGui clearSelection->setObjectName("Clear selection shortcut for " + this->objectName()); QShortcut *saveJson = new QShortcut(CShortcut::keySaveViews(), this, SLOT(ps_saveJsonShortcut()), nullptr, Qt::WidgetShortcut); saveJson->setObjectName("Save JSON for " + this->objectName()); + QShortcut *deleteRow = new QShortcut(CShortcut::keyDelete(), this, SLOT(ps_removeSelectedRows()), nullptr, Qt::WidgetShortcut); + deleteRow->setObjectName("Delete selected rows for " + this->objectName()); } bool CViewBaseNonTemplate::setParentDockWidgetInfoArea(CDockWidgetInfoArea *parentDockableWidget) @@ -166,6 +168,13 @@ namespace BlackGui if (this->m_menus.testFlag(MenuRefresh)) { menu.addAction(BlackMisc::CIcons::refresh16(), "Update", this, SIGNAL(requestUpdate())); } if (this->m_menus.testFlag(MenuBackend)) { menu.addAction(BlackMisc::CIcons::refresh16(), "Reload from backend", this, SIGNAL(requestNewBackendData())); } if (this->m_menus.testFlag(MenuClear)) { menu.addAction(BlackMisc::CIcons::delete16(), "Clear", this, SLOT(ps_clear())); } + if (this->m_menus.testFlag(MenuRemoveSelectedRows)) + { + if (this->hasSelection()) + { + menu.addAction(BlackMisc::CIcons::delete16(), "Remove selected rows", this, SLOT(ps_removeSelectedRows()), CShortcut::keyDelete()); + } + } if (this->m_menus.testFlag(MenuDisplayAutomatically)) { QAction *a = menu.addAction(CIcons::appMappings16(), "Automatically display (when loaded)", this, SLOT(ps_toggleAutoDisplay())); @@ -347,6 +356,10 @@ namespace BlackGui void CViewBaseNonTemplate::menuAddItems(Menu menusToAdd) { this->m_menus |= menusToAdd; + if (menusToAdd.testFlag(MenuRemoveSelectedRows)) + { + this->m_enableDeleteSelectedRows = true; + } } int CViewBaseNonTemplate::ps_updateContainer(const CVariant &variant, bool sort, bool resize) @@ -488,6 +501,12 @@ namespace BlackGui this->m_displayAutomatically = a->isChecked(); } + void CViewBaseNonTemplate::ps_removeSelectedRows() + { + if (!m_enableDeleteSelectedRows) { return; } + this->removeSelectedRows(); + } + void CViewBaseNonTemplate::ps_updatedIndicator() { this->update(); @@ -531,6 +550,14 @@ namespace BlackGui int CViewBase::updateContainer(const ContainerType &container, bool sort, bool resize) { Q_ASSERT_X(this->m_model, Q_FUNC_INFO, "Missing model"); + if (container.isEmpty()) + { + // shortcut + this->clear(); + return 0; + } + + // we have data this->showLoadIndicator(container.size()); bool reallyResize = resize && isResizeConditionMet(container.size()); // do we really perform resizing bool presize = (m_resizeMode == ResizingOnceSubset) && @@ -622,6 +649,13 @@ namespace BlackGui return this->m_model->container(); } + template + const ContainerType &CViewBase::containerOrFilteredContainer() const + { + Q_ASSERT(this->m_model); + return this->m_model->containerOrFilteredContainer(); + } + template ContainerType CViewBase::selectedObjects() const { diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index 6ab451e91..a517c178a 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -70,14 +70,17 @@ namespace BlackGui { MenuNone = 0, ///< no menu MenuClear = 1 << 0, ///< allow clearing the view via menu - MenuRefresh = 1 << 1, ///< allow refreshing the view via menu - MenuBackend = 1 << 2, ///< allow to request data from backend - MenuDisplayAutomatically = 1 << 3, ///< allow to switch display automatically - MenuFilter = 1 << 4, ///< filter can be opened - MenuSave = 1 << 5, ///< save as JSON - MenuLoad = 1 << 6, ///< load from JSON + MenuRemoveSelectedRows = 1 << 1, ///< allow to remove selected rows + MenuRefresh = 1 << 2, ///< allow refreshing the view via menu + MenuBackend = 1 << 3, ///< allow to request data from backend + MenuDisplayAutomatically = 1 << 4, ///< allow to switch display automatically + MenuFilter = 1 << 5, ///< filter can be opened + MenuSave = 1 << 6, ///< save as JSON + MenuLoad = 1 << 7, ///< load from JSON MenuLoadAndSave = MenuLoad | MenuSave, - MenuDefault = MenuClear | MenuDisplayAutomatically + MenuDefault = MenuClear | MenuDisplayAutomatically, + // special menu, should be in derived class but enums cannot be derived + MenuHighlightDbData = 1 << 8, ///< highlight DB data }; Q_DECLARE_FLAGS(Menu, MenuFlag) @@ -224,6 +227,9 @@ namespace BlackGui //! Hide loading indicator void hideLoadIndicator(); + //! Remove selected rows + virtual int removeSelectedRows() = 0; + protected: //! Constructor CViewBaseNonTemplate(QWidget *parent); @@ -286,6 +292,7 @@ namespace BlackGui bool m_acceptRowSelected = false; //!< selection changed bool m_acceptDoubleClickSelection = false; //!< double clicked bool m_displayAutomatically = true; //!< display directly when loaded + bool m_enableDeleteSelectedRows = false; //!< selected rows can be deleted QWidget *m_filterWidget = nullptr; //!< filter widget if any Menu m_menus = MenuDefault; //!< Default menu settings BlackGui::IMenuDelegate *m_menu = nullptr; //!< custom menu if any @@ -341,6 +348,9 @@ namespace BlackGui //! Clear the model virtual void ps_clear() { this->clear(); } + //! Remove selected rows + void ps_removeSelectedRows(); + private: //! Set the filter widget internally void setFilterWidgetImpl(QWidget *filterWidget); @@ -350,6 +360,9 @@ namespace BlackGui //! Base class for views template class CViewBase : public CViewBaseNonTemplate { + // I cannot use Q_OBJECT here, because error: Template classes not supported by Q_OBJECT + // Cannot declare slots as SLOT because I have no Q_OBJECT macro + public: //! Destructor virtual ~CViewBase() { if (this->m_model) { this->m_model->markDestroyed(); }} @@ -364,6 +377,7 @@ namespace BlackGui virtual void clear() override { Q_ASSERT(this->m_model); this->m_model->clear(); } //! Update whole container + //! \return int size after update int updateContainer(const ContainerType &container, bool sort = true, bool resize = true); //! Update whole container in background @@ -381,18 +395,22 @@ namespace BlackGui //! Access to container const ContainerType &container() const; + //! \copydoc BlackGui::Models::ListModelBase::containerOrFilteredContainer + const ContainerType &containerOrFilteredContainer() const; + //! Selected objects ContainerType selectedObjects() const; + //! \copydoc CViewBaseNonTemplate::removeSelectedRows + //! \remarks Actually a slot, but not defined as such as the template does not support Q_OBJECT + virtual int removeSelectedRows() override; + //! Update selected objects int updateSelected(const BlackMisc::CVariant &variant, const BlackMisc::CPropertyIndex &index); //! Selected object (or default) ObjectType selectedObject() const; - //! Remove selected rows - int removeSelectedRows(); - //! \copydoc BlackMisc::CContainerBase::removeIf template int removeIf(K0 k0, V0 v0, KeysValues... keysValues) diff --git a/src/blackgui/views/viewdbobjects.cpp b/src/blackgui/views/viewdbobjects.cpp new file mode 100644 index 000000000..b323f3759 --- /dev/null +++ b/src/blackgui/views/viewdbobjects.cpp @@ -0,0 +1,103 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "viewdbobjects.h" +#include "blackgui/models/allmodels.h" +#include + +using namespace BlackMisc; +using namespace BlackGui; +using namespace BlackGui::Models; + +namespace BlackGui +{ + namespace Views + { + template + CViewWithDbObjects::CViewWithDbObjects(QWidget *parent) : + CViewBase(parent) + { + // void + } + + template + ObjectType CViewWithDbObjects::latestObject() const + { + return this->container().latestObject(); + } + + template + ObjectType CViewWithDbObjects::oldestObject() const + { + return this->container().oldestObject(); + } + + template + void CViewWithDbObjects::selectDbKeys(const QList &keys) + { + if (keys.isEmpty()) { return; } + this->clearSelection(); + int r = -1; + for (const ObjectType &obj : CViewBase::containerOrFilteredContainer()) + { + r++; + if (!obj.hasValidDbKey()) { continue; } + if (keys.contains(obj.getDbKey())) + { + this->selectRow(r); + } + } + } + + template + int CViewWithDbObjects::removeDbKeys(const QList &keys) + { + if (keys.isEmpty()) { return 0; } + if (this->isEmpty()) { return 0; } + + ContainerType newObjects(this->container()); + int delta = newObjects.removeObjectsWithKeys(keys); + if (delta > 0) + { + this->updateContainerMaybeAsync(newObjects); + } + return delta; + } + + template + void CViewWithDbObjects::customMenu(QMenu &menu) const + { + CViewBase::customMenu(menu); + if (this->m_menus.testFlag(CViewBase::MenuHighlightDbData)) + { + menu.addSeparator(); + QAction *a = menu.addAction(CIcons::database16(), "Highlight DB data", this, SLOT(ps_toggleDbData())); + a->setCheckable(true); + a->setChecked(this->derivedModel()->highlightDbData()); + } + } + + template + void CViewWithDbObjects::ps_toggleDbData() + { + bool h = this->derivedModel()->highlightDbData(); + this->derivedModel()->setHighlightDbData(!h); + } + + // see here for the reason of thess forward instantiations + // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html + template class CViewWithDbObjects; + template class CViewWithDbObjects; + template class CViewWithDbObjects; + template class CViewWithDbObjects; + template class CViewWithDbObjects; + template class CViewWithDbObjects; + + } // namespace +} // namespace diff --git a/src/blackgui/views/viewdbobjects.h b/src/blackgui/views/viewdbobjects.h new file mode 100644 index 000000000..bb522e4a4 --- /dev/null +++ b/src/blackgui/views/viewdbobjects.h @@ -0,0 +1,53 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_VIEWDBOBJECTS_H +#define BLACKGUI_VIEWDBOBJECTS_H + +#include "blackgui/blackguiexport.h" +#include "viewbase.h" +#include + +namespace BlackGui +{ + namespace Views + { + //! Base class for views with DB objects + template class CViewWithDbObjects : + public CViewBase + { + public: + //! Get latest object + ObjectType latestObject() const; + + //! Get oldets object + ObjectType oldestObject() const; + + //! Select given DB keys + void selectDbKeys(const QList &keys); + + //! Remove keys + int removeDbKeys(const QList &keys); + + protected: + //! Constructor + explicit CViewWithDbObjects(QWidget *parent = nullptr); + + //! \copydoc QWidget::customMenu + virtual void customMenu(QMenu &menu) const override; + + private slots: + //! Highlight DB data + void ps_toggleDbData(); + }; + } // namespace +} // namespace +#endif // guard