diff --git a/src/blackgui/models/aircrafticaolistmodel.cpp b/src/blackgui/models/aircrafticaolistmodel.cpp index f71d5cd88..e9bd37396 100644 --- a/src/blackgui/models/aircrafticaolistmodel.cpp +++ b/src/blackgui/models/aircrafticaolistmodel.cpp @@ -19,7 +19,7 @@ namespace BlackGui namespace Models { CAircraftIcaoCodeListModel::CAircraftIcaoCodeListModel(QObject *parent) : - CListModelBase("AircraftIcaoListModel", parent) + CListModelDbObjects("AircraftIcaoListModel", parent) { this->m_columns.addColumn(CColumn::standardString("id", CAircraftIcaoCode::IndexDbIntegerKey, CDefaultFormatter::alignRightVCenter())); this->m_columns.addColumn(CColumn::standardValueObject("ICAO", CAircraftIcaoCode::IndexAircraftDesignator)); diff --git a/src/blackgui/models/aircrafticaolistmodel.h b/src/blackgui/models/aircrafticaolistmodel.h index f31595290..40f699708 100644 --- a/src/blackgui/models/aircrafticaolistmodel.h +++ b/src/blackgui/models/aircrafticaolistmodel.h @@ -15,7 +15,7 @@ #include "blackgui/blackguiexport.h" #include #include "blackmisc/aviation/aircrafticaocodelist.h" -#include "blackgui/models/listmodelbase.h" +#include "blackgui/models/listmodeldbobjects.h" namespace BlackGui { @@ -23,7 +23,7 @@ namespace BlackGui { //! Airport list model class BLACKGUI_EXPORT CAircraftIcaoCodeListModel : - public CListModelBase + public CListModelDbObjects { public: //! Constructor diff --git a/src/blackgui/models/aircraftmodellistmodel.cpp b/src/blackgui/models/aircraftmodellistmodel.cpp index 09be4f10f..903fc870c 100644 --- a/src/blackgui/models/aircraftmodellistmodel.cpp +++ b/src/blackgui/models/aircraftmodellistmodel.cpp @@ -21,7 +21,7 @@ namespace BlackGui namespace Models { CAircraftModelListModel::CAircraftModelListModel(AircraftModelMode mode, QObject *parent) : - CModelsWithDbKeysBase("CAircraftModelListModel", parent) + CListModelDbObjects("CAircraftModelListModel", parent) { this->setAircraftModelMode(mode); @@ -142,31 +142,16 @@ namespace BlackGui QVariant CAircraftModelListModel::data(const QModelIndex &index, int role) const { - if (role != Qt::BackgroundRole) { return CListModelBase::data(index, role); } - bool db = highlightDbData(); + if (role != Qt::BackgroundRole) { return CListModelDbObjects::data(index, role); } bool ms = highlightGivenModelStrings() && !m_highlightStrings.isEmpty(); - if (!db && !ms) { return CListModelBase::data(index, role); } + if (!ms) { return CListModelDbObjects::data(index, role); } CAircraftModel model(this->at(index)); // highlight stashed first - if (ms) + if (m_highlightStrings.contains(model.getModelString(), Qt::CaseInsensitive)) { - if (m_highlightStrings.contains(model.getModelString(), Qt::CaseInsensitive)) - { - static const QBrush b(Qt::yellow); - return b; - } - return QVariant(); - } - - // highlight DB models - if (db) - { - if (model.hasValidDbKey()) - { - static const QBrush b(Qt::green); - return b; - } + static const QBrush b(Qt::yellow); + return b; } return QVariant(); } diff --git a/src/blackgui/models/aircraftmodellistmodel.h b/src/blackgui/models/aircraftmodellistmodel.h index 84110ba7c..77c4ab813 100644 --- a/src/blackgui/models/aircraftmodellistmodel.h +++ b/src/blackgui/models/aircraftmodellistmodel.h @@ -13,7 +13,7 @@ #define BLACKGUI_AIRCRAFTMODELLISTMODEL_H #include "blackgui/blackguiexport.h" -#include "blackgui/models/modelswithdbkey.h" +#include "blackgui/models/listmodeldbobjects.h" #include "blackmisc/simulation/aircraftmodellist.h" #include #include @@ -24,7 +24,7 @@ namespace BlackGui { //! Aircraft model list model class BLACKGUI_EXPORT CAircraftModelListModel : - public CModelsWithDbKeysBase + public CListModelDbObjects { public: //! How to display @@ -51,12 +51,6 @@ namespace BlackGui //! Mode AircraftModelMode getModelMode() const { return m_mode; } - //! Highlight the DB models - bool highlightDbData() const { return m_highlightDbData; } - - //! Highlight the DB models - void setHighlightDbData(bool highlightDbData) { m_highlightDbData = highlightDbData; } - //! Highlight models bool highlightGivenModelStrings() const { return m_highlightModelStrings; } @@ -72,13 +66,11 @@ namespace BlackGui //! Replace models with same model string, or just add void replaceOrAddByModelString(const BlackMisc::Simulation::CAircraftModelList &models); - protected: //! \copydoc QAbstractItemModel::data virtual QVariant data(const QModelIndex &index, int role) const override; private: AircraftModelMode m_mode = NotSet; //!< current mode - bool m_highlightDbData = false; //!< highlight if DB data entry (valid key) bool m_highlightModelStrings = false; //!< highlight in in model strings QStringList m_highlightStrings; //!< model strings to highlight }; diff --git a/src/blackgui/models/airlineicaolistmodel.cpp b/src/blackgui/models/airlineicaolistmodel.cpp index 11562f073..d7c743009 100644 --- a/src/blackgui/models/airlineicaolistmodel.cpp +++ b/src/blackgui/models/airlineicaolistmodel.cpp @@ -20,7 +20,7 @@ namespace BlackGui namespace Models { CAirlineIcaoCodeListModel::CAirlineIcaoCodeListModel(QObject *parent) : - CListModelBase("AircraftIcaoListModel", parent) + CListModelDbObjects("AircraftIcaoListModel", parent) { this->m_columns.addColumn(CColumn::standardString("id", CAirlineIcaoCode::IndexDbIntegerKey, CDefaultFormatter::alignRightVCenter())); this->m_columns.addColumn(CColumn::standardValueObject("ICAO", CAirlineIcaoCode::IndexAirlineDesignator)); diff --git a/src/blackgui/models/airlineicaolistmodel.h b/src/blackgui/models/airlineicaolistmodel.h index 536f33411..6ffe507bf 100644 --- a/src/blackgui/models/airlineicaolistmodel.h +++ b/src/blackgui/models/airlineicaolistmodel.h @@ -15,14 +15,15 @@ #include "blackgui/blackguiexport.h" #include #include "blackmisc/aviation/airlineicaocodelist.h" -#include "blackgui/models/listmodelbase.h" +#include "blackgui/models/listmodeldbobjects.h" namespace BlackGui { namespace Models { //! Airport list model - class BLACKGUI_EXPORT CAirlineIcaoCodeListModel : public CListModelBase + class BLACKGUI_EXPORT CAirlineIcaoCodeListModel : + public CListModelDbObjects { public: //! Constructor diff --git a/src/blackgui/models/countrylistmodel.cpp b/src/blackgui/models/countrylistmodel.cpp index fb080cd63..6f10e9eca 100644 --- a/src/blackgui/models/countrylistmodel.cpp +++ b/src/blackgui/models/countrylistmodel.cpp @@ -18,7 +18,7 @@ namespace BlackGui namespace Models { CCountryListModel::CCountryListModel(QObject *parent) : - CListModelBase("CountryListModel", parent) + CListModelDbObjects("CountryListModel", parent) { CColumn col("country", CCountry::IndexIcon); col.setSortPropertyIndex(CCountry::IndexIsoCode); diff --git a/src/blackgui/models/countrylistmodel.h b/src/blackgui/models/countrylistmodel.h index 9638a970f..ce40bb1f2 100644 --- a/src/blackgui/models/countrylistmodel.h +++ b/src/blackgui/models/countrylistmodel.h @@ -14,7 +14,7 @@ #include "blackgui/blackguiexport.h" #include "blackmisc/countrylist.h" -#include "blackgui/models/listmodelbase.h" +#include "blackgui/models/listmodeldbobjects.h" #include namespace BlackGui @@ -23,7 +23,7 @@ namespace BlackGui { //! Country list model class BLACKGUI_EXPORT CCountryListModel : - public CListModelBase + public CListModelDbObjects { public: //! Constructor diff --git a/src/blackgui/models/distributorlistmodel.cpp b/src/blackgui/models/distributorlistmodel.cpp index 892f7fc9a..024e63c25 100644 --- a/src/blackgui/models/distributorlistmodel.cpp +++ b/src/blackgui/models/distributorlistmodel.cpp @@ -19,7 +19,7 @@ namespace BlackGui namespace Models { CDistributorListModel::CDistributorListModel(QObject *parent) : - CListModelBase("ModelDistributorList", parent) + CListModelDbObjects("ModelDistributorList", parent) { this->m_columns.addColumn(CColumn::standardString("key", CDistributor::IndexDbStringKey)); this->m_columns.addColumn(CColumn::standardString("description", CDistributor::IndexDescription)); diff --git a/src/blackgui/models/distributorlistmodel.h b/src/blackgui/models/distributorlistmodel.h index c1b3c5d96..7909ad1a1 100644 --- a/src/blackgui/models/distributorlistmodel.h +++ b/src/blackgui/models/distributorlistmodel.h @@ -14,7 +14,7 @@ #include "blackgui/blackguiexport.h" #include "blackmisc/simulation/distributorlist.h" -#include "blackgui/models/listmodelbase.h" +#include "blackgui/models/listmodeldbobjects.h" #include namespace BlackGui @@ -23,10 +23,9 @@ namespace BlackGui { //! Distributor list model class BLACKGUI_EXPORT CDistributorListModel : - public CListModelBase + public CListModelDbObjects { public: - //! Constructor explicit CDistributorListModel(QObject *parent = nullptr); diff --git a/src/blackgui/models/listmodelbase.cpp b/src/blackgui/models/listmodelbase.cpp index 77caedd40..aa6570158 100644 --- a/src/blackgui/models/listmodelbase.cpp +++ b/src/blackgui/models/listmodelbase.cpp @@ -188,7 +188,7 @@ namespace BlackGui int CListModelBase::rowCount(const QModelIndex &parentIndex) const { Q_UNUSED(parentIndex); - return this->getContainerOrFilteredContainer().size(); + return this->containerOrFilteredContainer().size(); } template @@ -209,7 +209,7 @@ namespace BlackGui if (!formatter) { return QVariant(); } //! Formatted data - ObjectType obj = this->getContainerOrFilteredContainer()[index.row()]; + ObjectType obj = this->containerOrFilteredContainer()[index.row()]; BlackMisc::CPropertyIndex propertyIndex = this->columnToPropertyIndex(index.column()); return formatter->data(role, obj.propertyByIndex(propertyIndex)).getQVariant(); } @@ -398,7 +398,7 @@ namespace BlackGui } else { - return this->getContainerOrFilteredContainer()[index.row()]; + return this->containerOrFilteredContainer()[index.row()]; } } @@ -478,13 +478,16 @@ namespace BlackGui } template - const ContainerType &CListModelBase::getContainerOrFilteredContainer() const + const ContainerType &CListModelBase::containerOrFilteredContainer() const { - if (!this->hasFilter()) + if (this->hasFilter()) + { + return this->m_containerFiltered; + } + else { return this->m_container; } - return m_containerFiltered; } template @@ -503,7 +506,7 @@ namespace BlackGui template void CListModelBase::emitRowCountChanged() { - int n = this->getContainerOrFilteredContainer().size(); + int n = this->containerOrFilteredContainer().size(); emit this->rowCountChanged(n, this->hasFilter()); emit this->changed(); } diff --git a/src/blackgui/models/listmodelbase.h b/src/blackgui/models/listmodelbase.h index 5320fa663..1593b8fe7 100644 --- a/src/blackgui/models/listmodelbase.h +++ b/src/blackgui/models/listmodelbase.h @@ -153,6 +153,9 @@ namespace BlackGui //! Used container data const ContainerType &container() const; + //! Full container or cached filtered container as approproiate + const ContainerType &containerOrFilteredContainer() const; + //! \copydoc QStandardItemModel::data() virtual QVariant data(const QModelIndex &index, int role) const override; @@ -168,6 +171,7 @@ namespace BlackGui virtual int rowCount(const QModelIndex &parentIndex = QModelIndex()) const override; //! Update by new container + //! \return int size after update //! \remarks a sorting is performed only if a valid sort column is set virtual int update(const ContainerType &container, bool sort = true); @@ -247,24 +251,21 @@ namespace BlackGui void takeFilterOwnership(std::unique_ptr > &filter); protected: - std::unique_ptr > m_filter; //!< Used filter - //! \copydoc CListModelBaseNonTemplate::CListModelBaseNonTemplate CListModelBase(const QString &translationContext, QObject *parent = nullptr); //! \copydoc CModelBaseNonTemplate::performUpdateContainer virtual int performUpdateContainer(const BlackMisc::CVariant &variant, bool sort) override; - //! Full container or cached filtered container as approproiate - const ContainerType &getContainerOrFilteredContainer() const; - //! Update filtered container void updateFilteredContainer(); //! Row count changed void emitRowCountChanged(); - ContainerType m_container; //!< used container - ContainerType m_containerFiltered; //!< cache for filtered container data + + std::unique_ptr > m_filter; //!< Used filter + ContainerType m_container; //!< used container + ContainerType m_containerFiltered; //!< cache for filtered container data }; namespace Private diff --git a/src/blackgui/models/listmodeldbobjects.cpp b/src/blackgui/models/listmodeldbobjects.cpp new file mode 100644 index 000000000..2b48a4021 --- /dev/null +++ b/src/blackgui/models/listmodeldbobjects.cpp @@ -0,0 +1,70 @@ +/* Copyright (C) 2053 + * 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 "listmodeldbobjects.h" +#include "allmodelcontainers.h" + +using namespace BlackMisc; +using namespace BlackMisc::Aviation; + +namespace BlackGui +{ + namespace Models + { + template + CListModelDbObjects::CListModelDbObjects(const QString &translationContext, QObject *parent) : + CListModelBase(translationContext, parent) + { + // void + } + + template + QVariant CListModelDbObjects::data(const QModelIndex &index, int role) const + { + if (role != Qt::BackgroundRole) { return CListModelBase::data(index, role); } + + if (isHighlightIndex(index)) { return QBrush(m_highlightColor); } + if (!highlightDbData()) { return CListModelBase::data(index, role); } + + ObjectType obj(this->at(index)); + // highlight DB models + if (obj.hasValidDbKey()) + { + static const QBrush b(Qt::green); + return b; + } + return QVariant(); + } + + template + KeyType CListModelDbObjects::dbKeyForIndex(const QModelIndex &index) const + { + if (!index.isValid()) { return ObjectType::invalidDbKey(); } + return this->at(index).getDbKey(); + } + + template + bool CListModelDbObjects::isHighlightIndex(const QModelIndex &index) const + { + if (!index.isValid()) { return false; } + if (m_highlightKeys.isEmpty()) { return false; } + return m_highlightKeys.contains(dbKeyForIndex(index)); + } + + // see here for the reason of thess forward instantiations + // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html + template class CListModelDbObjects; + template class CListModelDbObjects; + template class CListModelDbObjects; + template class CListModelDbObjects; + template class CListModelDbObjects; + template class CListModelDbObjects; + + } // namespace +} // namespace diff --git a/src/blackgui/models/modelswithdbkey.h b/src/blackgui/models/listmodeldbobjects.h similarity index 58% rename from src/blackgui/models/modelswithdbkey.h rename to src/blackgui/models/listmodeldbobjects.h index f8ae3e106..b50ac2a6f 100644 --- a/src/blackgui/models/modelswithdbkey.h +++ b/src/blackgui/models/listmodeldbobjects.h @@ -9,25 +9,32 @@ //! \file -#ifndef BLACKGUI_MODELSWITHDBKEY_H -#define BLACKGUI_MODELSWITHDBKEY_H +#ifndef BLACKGUI_LISTMODELDBOBJECTS_H +#define BLACKGUI_LISTMODELDBOBJECTS_H #include "listmodelbase.h" +#include "blackgui/blackguiexport.h" namespace BlackGui { namespace Models { - //! Base class for models with DB keys - template - class CModelsWithDbKeysBase : public CListModelBase + //! List model for DB objects + template class CListModelDbObjects : + public CListModelBase { public: //! Destructor - virtual ~CModelsWithDbKeysBase() {} + virtual ~CListModelDbObjects() {} + + //! Highlight the DB models + bool highlightDbData() const { return m_highlightDbData; } + + //! Highlight the DB models + void setHighlightDbData(bool highlightDbData) { m_highlightDbData = highlightDbData; } //! Keys to be highlighted - void setHighlightDbKeys(const QList &keys) { m_highlightIntKeys = keys; } + void setHighlightDbKeys(const QList &keys) { m_highlightKeys = keys; } //! Set color for highlighting void setHighlightColor(QColor color) { m_highlightColor = color; } @@ -42,13 +49,15 @@ namespace BlackGui bool isHighlightIndex(const QModelIndex &index) const; protected: - //! \copydoc CListModelBase::CListModelBase - CModelsWithDbKeysBase(const QString &translationContext, QObject *parent = nullptr); + //! \copydoc CListModelDbObjectsNonTemplate::CListModelDbObjectsNonTemplate + CListModelDbObjects(const QString &translationContext, QObject *parent = nullptr); private: - QList m_highlightIntKeys; //!< keys to be highlighted + bool m_highlightDbData = false; //!< highlight if DB data entry (valid key) + QList m_highlightKeys; //!< keys to be highlighted QColor m_highlightColor = Qt::green; }; + } // namespace } // namespace #endif // guard diff --git a/src/blackgui/models/liverylistmodel.cpp b/src/blackgui/models/liverylistmodel.cpp index 2eec6033e..901244633 100644 --- a/src/blackgui/models/liverylistmodel.cpp +++ b/src/blackgui/models/liverylistmodel.cpp @@ -21,7 +21,7 @@ namespace BlackGui namespace Models { CLiveryListModel::CLiveryListModel(QObject *parent) : - CListModelBase("ModelLiveryList", parent) + CListModelDbObjects("ModelLiveryList", parent) { this->m_columns.addColumn(CColumn::standardString("id", CLivery::IndexDbIntegerKey, CDefaultFormatter::alignRightVCenter())); this->m_columns.addColumn(CColumn::standardString("code", CLivery::IndexCombinedCode)); diff --git a/src/blackgui/models/liverylistmodel.h b/src/blackgui/models/liverylistmodel.h index f748edc9b..68003efbb 100644 --- a/src/blackgui/models/liverylistmodel.h +++ b/src/blackgui/models/liverylistmodel.h @@ -14,7 +14,7 @@ #include "blackgui/blackguiexport.h" #include "blackmisc/aviation/liverylist.h" -#include "blackgui/models/listmodelbase.h" +#include "blackgui/models/listmodeldbobjects.h" #include namespace BlackGui @@ -23,10 +23,9 @@ namespace BlackGui { //! Distributor list model class BLACKGUI_EXPORT CLiveryListModel : - public CListModelBase + public CListModelDbObjects { public: - //! Constructor explicit CLiveryListModel(QObject *parent = nullptr); diff --git a/src/blackgui/models/modelswithdbkey.cpp b/src/blackgui/models/modelswithdbkey.cpp deleted file mode 100644 index 490c3e64b..000000000 --- a/src/blackgui/models/modelswithdbkey.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* 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 "modelswithdbkey.h" -#include "allmodelcontainers.h" - -namespace BlackGui -{ - namespace Models - { - template - CModelsWithDbKeysBase::CModelsWithDbKeysBase(const QString &translationContext, QObject *parent) : - CListModelBase(translationContext, parent) - { } - - template - QVariant CModelsWithDbKeysBase::data(const QModelIndex &index, int role) const - { - if (role == Qt::BackgroundRole) - { - if (isHighlightIndex(index)) { return QBrush(m_highlightColor); } - } - return CListModelBase::data(index, role); - } - - template - KeyType CModelsWithDbKeysBase::dbKeyForIndex(const QModelIndex &index) const - { - if (!index.isValid()) { return ObjectType::invalidDbKey(); } - return this->at(index).getDbKey(); - } - - template - bool CModelsWithDbKeysBase::isHighlightIndex(const QModelIndex &index) const - { - if (!index.isValid()) { return false; } - if (m_highlightIntKeys.isEmpty()) { return false; } - return m_highlightIntKeys.contains(dbKeyForIndex(index)); - } - - // see here for the reason of thess forward instantiations - // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html - template class CModelsWithDbKeysBase; - - } // namespace -} // namespace