1 /*
2  * Copyright 2017-2018  Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef EQUITIESMODEL_H
19 #define EQUITIESMODEL_H
20 
21 #include "kmm_models_export.h"
22 
23 // ----------------------------------------------------------------------------
24 // QT Includes
25 
26 #include <QStandardItemModel>
27 
28 #include <QSortFilterProxyModel>
29 #if QT_VERSION < QT_VERSION_CHECK(5,10,0)
30 #include <KItemModels/KRecursiveFilterProxyModel>
31 #define QSortFilterProxyModel KRecursiveFilterProxyModel
32 #endif
33 // ----------------------------------------------------------------------------
34 // KDE Includes
35 
36 // ----------------------------------------------------------------------------
37 // Project Includes
38 
39 class MyMoneyObject;
40 class MyMoneyAccount;
41 
42 namespace eMyMoney { namespace File { enum class Object; } }
43 
44 class KMM_MODELS_EXPORT EquitiesModel : public QStandardItemModel
45 {
46   Q_OBJECT
47 
48 public:
49   enum Column { Equity = 0, Symbol, Value, Quantity, Price };
50   enum Role { InvestmentID = Qt::UserRole, EquityID = Qt::UserRole, SecurityID = Qt::UserRole + 1 };
51 
52   ~EquitiesModel();
53 
54   auto getColumns();
55   static QString getHeaderName(const Column column);
56 
57 public Q_SLOTS:
58   void slotObjectAdded(eMyMoney::File::Object objType, const QString &id);
59   void slotObjectModified(eMyMoney::File::Object objType, const QString &id);
60   void slotObjectRemoved(eMyMoney::File::Object objType, const QString& id);
61   void slotBalanceOrValueChanged(const MyMoneyAccount &account);
62 
63 private:
64   EquitiesModel(QObject *parent = nullptr);
65   EquitiesModel(const EquitiesModel&);
66   EquitiesModel& operator=(EquitiesModel&);
67   friend class Models;  // only this class can create EquitiesModel
68 
69   void init();
70   void load();
71 
72 protected:
73   class Private;
74   Private* const d;
75 };
76 
77 class KMM_MODELS_EXPORT EquitiesFilterProxyModel : public QSortFilterProxyModel
78 {
79   Q_OBJECT
80 
81 public:
82   EquitiesFilterProxyModel(QObject *parent , EquitiesModel *model, const QList<EquitiesModel::Column> &columns = QList<EquitiesModel::Column>());
83   ~EquitiesFilterProxyModel();
84 
85   QList<EquitiesModel::Column> &getVisibleColumns();
86   void setHideClosedAccounts(const bool hideClosedAccounts);
87   void setHideZeroBalanceAccounts(const bool hideZeroBalanceAccounts);
88 
89 Q_SIGNALS:
90   void columnToggled(const EquitiesModel::Column column, const bool show);
91 
92 public Q_SLOTS:
93   void slotColumnsMenu(const QPoint);
94 
95 protected:
96   bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const override;
97   bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
98 
99 private:
100   class Private;
101   Private* const d;
102 #if QT_VERSION < QT_VERSION_CHECK(5,10,0)
103   // provide the interface for backward compatbility
setRecursiveFilteringEnabled(bool enable)104   void setRecursiveFilteringEnabled(bool enable) { Q_UNUSED(enable) }
105 #endif
106 
107 };
108 
109 #undef QSortFilterProxyModel
110 #endif // EQUITIESMODEL_H
111