1 /*
2  * Copyright 2009       Cristian Oneț <onet.cristian@gmail.com>
3  * Copyright 2017-2018  Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "accountsviewproxymodel.h"
20 #include "accountsviewproxymodel_p.h"
21 
22 // ----------------------------------------------------------------------------
23 // QT Includes
24 
25 #include <QMenu>
26 #include <QPoint>
27 
28 // ----------------------------------------------------------------------------
29 // KDE Includes
30 
31 #include <KLocalizedString>
32 
33 // ----------------------------------------------------------------------------
34 // Project Includes
35 
36 #include "accountsmodel.h"
37 #include "modelenums.h"
38 
39 using namespace eAccountsModel;
40 
AccountsViewProxyModel(QObject * parent)41 AccountsViewProxyModel::AccountsViewProxyModel(QObject *parent) :
42   AccountsProxyModel(*new AccountsViewProxyModelPrivate, parent)
43 {
44   setFilterKeyColumn(-1); // set-up filter to search in all columns
45 }
46 
AccountsViewProxyModel(AccountsViewProxyModelPrivate & dd,QObject * parent)47 AccountsViewProxyModel::AccountsViewProxyModel(AccountsViewProxyModelPrivate &dd, QObject *parent) :
48   AccountsProxyModel(dd, parent)
49 {
50 }
51 
~AccountsViewProxyModel()52 AccountsViewProxyModel::~AccountsViewProxyModel()
53 {
54 }
55 
56   /*
57   * Reimplemented to filter all but the account displayed in the accounts view.
58   */
filterAcceptsRow(int source_row,const QModelIndex & source_parent) const59 bool AccountsViewProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
60 {
61   if (!source_parent.isValid()) {
62     const auto data = sourceModel()->index(source_row, (int)(Column::Account), source_parent).data((int)Role::ID);
63     if (data.isValid() && data.toString() == AccountsModel::favoritesAccountId)
64       return false;
65   }
66   return AccountsProxyModel::filterAcceptsRow(source_row, source_parent);
67 }
68 
filterAcceptsColumn(int source_column,const QModelIndex & source_parent) const69 bool AccountsViewProxyModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const
70 {
71   Q_D(const AccountsViewProxyModel);
72   Q_UNUSED(source_parent)
73   if (d->m_visColumns.contains(d->m_mdlColumns->at(source_column)))
74       return true;
75   return false;
76 }
77 
getVisibleColumns()78 QSet<Column> AccountsViewProxyModel::getVisibleColumns()
79 {
80   Q_D(AccountsViewProxyModel);
81   return d->m_visColumns;
82 }
83 
setColumnVisibility(Column column,bool show)84 void AccountsViewProxyModel::setColumnVisibility(Column column, bool show)
85 {
86   Q_D(AccountsViewProxyModel);
87   if (show)
88     d->m_visColumns.insert(column);                                                  // add column to filter
89   else
90     d->m_visColumns.remove(column);
91 }
92 
slotColumnsMenu(const QPoint)93 void AccountsViewProxyModel::slotColumnsMenu(const QPoint)
94 {
95   Q_D(AccountsViewProxyModel);
96   // construct all hideable columns list
97   const QVector<Column> idColumns = { Column::Type, Column::Tax,
98                                       Column::VAT, Column::CostCenter,
99                                       Column::TotalBalance, Column::PostedValue,
100                                       Column::TotalValue, Column::AccountNumber,
101                                       Column::AccountSortCode
102                                     };
103 
104   // create menu
105   QMenu menu(i18n("Displayed columns"));
106   QList<QAction *> actions;
107   foreach (const auto idColumn, idColumns) {
108     auto a = new QAction(nullptr);
109     a->setObjectName(QString::number(static_cast<int>(idColumn)));
110     a->setText(AccountsModel::getHeaderName(idColumn));
111     a->setCheckable(true);
112     a->setChecked(d->m_visColumns.contains(idColumn));
113     actions.append(a);
114   }
115   menu.addActions(actions);
116 
117   // execute menu and get result
118   const auto retAction = menu.exec(QCursor::pos());
119   if (retAction) {
120     const auto idColumn = static_cast<Column>(retAction->objectName().toInt());
121     const auto isChecked = retAction->isChecked();
122     setColumnVisibility(idColumn, isChecked);
123     emit columnToggled(idColumn, isChecked);  // emit signal for method to possible load column into modela
124     invalidateFilter();                       // refresh filter to reflect recent changes
125   }
126 }
127