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