File indexing completed on 2024-05-12 16:42:18

0001 /*
0002     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef EQUITIESMODEL_H
0007 #define EQUITIESMODEL_H
0008 
0009 #include "kmm_models_export.h"
0010 
0011 // ----------------------------------------------------------------------------
0012 // QT Includes
0013 
0014 #include <QStandardItemModel>
0015 
0016 #include <QSortFilterProxyModel>
0017 #if QT_VERSION < QT_VERSION_CHECK(5,10,0)
0018 #include <KItemModels/KRecursiveFilterProxyModel>
0019 #define QSortFilterProxyModel KRecursiveFilterProxyModel
0020 #endif
0021 // ----------------------------------------------------------------------------
0022 // KDE Includes
0023 
0024 // ----------------------------------------------------------------------------
0025 // Project Includes
0026 
0027 class MyMoneyObject;
0028 class MyMoneyAccount;
0029 
0030 namespace eMyMoney {
0031 namespace File {
0032 enum class Object;
0033 }
0034 }
0035 
0036 class KMM_MODELS_EXPORT EquitiesModel : public QStandardItemModel
0037 {
0038     Q_OBJECT
0039 
0040 public:
0041     enum Column { Equity = 0, Symbol, Value, Quantity, Price };
0042     enum Role { InvestmentID = Qt::UserRole, EquityID = Qt::UserRole, SecurityID = Qt::UserRole + 1, SortRole };
0043 
0044     ~EquitiesModel();
0045 
0046     auto getColumns();
0047     static QString getHeaderName(const Column column);
0048 
0049 public Q_SLOTS:
0050     void slotObjectAdded(eMyMoney::File::Object objType, const QString &id);
0051     void slotObjectModified(eMyMoney::File::Object objType, const QString &id);
0052     void slotObjectRemoved(eMyMoney::File::Object objType, const QString& id);
0053     void slotBalanceOrValueChanged(const MyMoneyAccount &account);
0054 
0055 private:
0056     EquitiesModel(QObject *parent = nullptr);
0057     EquitiesModel(const EquitiesModel&);
0058     EquitiesModel& operator=(EquitiesModel&);
0059     friend class Models;  // only this class can create EquitiesModel
0060 
0061     void init();
0062     void load();
0063 
0064 protected:
0065     class Private;
0066     Private* const d;
0067 };
0068 
0069 class KMM_MODELS_EXPORT EquitiesFilterProxyModel : public QSortFilterProxyModel
0070 {
0071     Q_OBJECT
0072 
0073 public:
0074     EquitiesFilterProxyModel(QObject *parent, EquitiesModel *model, const QList<EquitiesModel::Column> &columns = QList<EquitiesModel::Column>());
0075     ~EquitiesFilterProxyModel();
0076 
0077     QList<EquitiesModel::Column> &getVisibleColumns();
0078     void setHideClosedAccounts(const bool hideClosedAccounts);
0079     void setHideZeroBalanceAccounts(const bool hideZeroBalanceAccounts);
0080 
0081 Q_SIGNALS:
0082     void columnToggled(const EquitiesModel::Column column, const bool show);
0083 
0084 public Q_SLOTS:
0085     void slotColumnsMenu(const QPoint);
0086 
0087 protected:
0088     bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const override;
0089     bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
0090     bool lessThan(const QModelIndex& left, const QModelIndex& right) const override;
0091 
0092 private:
0093     class Private;
0094     Private* const d;
0095 #if QT_VERSION < QT_VERSION_CHECK(5,10,0)
0096     // provide the interface for backward compatbility
0097     void setRecursiveFilteringEnabled(bool enable) {
0098         Q_UNUSED(enable)
0099     }
0100 #endif
0101 
0102 };
0103 
0104 #undef QSortFilterProxyModel
0105 #endif // EQUITIESMODEL_H