File indexing completed on 2024-05-12 16:43:56

0001 /*
0002     SPDX-FileCopyrightText: 2009 Cristian Oneț <onet.cristian@gmail.com>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "accountsviewproxymodel.h"
0008 #include "accountsviewproxymodel_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QMenu>
0014 #include <QPoint>
0015 
0016 // ----------------------------------------------------------------------------
0017 // KDE Includes
0018 
0019 #include <KLocalizedString>
0020 
0021 // ----------------------------------------------------------------------------
0022 // Project Includes
0023 
0024 #include "accountsmodel.h"
0025 #include "modelenums.h"
0026 
0027 using namespace eAccountsModel;
0028 
0029 AccountsViewProxyModel::AccountsViewProxyModel(QObject *parent) :
0030     AccountsProxyModel(*new AccountsViewProxyModelPrivate, parent)
0031 {
0032     setFilterKeyColumn(-1); // set-up filter to search in all columns
0033 }
0034 
0035 AccountsViewProxyModel::AccountsViewProxyModel(AccountsViewProxyModelPrivate &dd, QObject *parent) :
0036     AccountsProxyModel(dd, parent)
0037 {
0038 }
0039 
0040 AccountsViewProxyModel::~AccountsViewProxyModel()
0041 {
0042 }
0043 
0044 /*
0045 * Reimplemented to filter all but the account displayed in the accounts view.
0046 */
0047 bool AccountsViewProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
0048 {
0049     if (!source_parent.isValid()) {
0050         const auto data = sourceModel()->index(source_row, (int)(Column::Account), source_parent).data((int)Role::ID);
0051         if (data.isValid() && data.toString() == AccountsModel::favoritesAccountId)
0052             return false;
0053     }
0054     return AccountsProxyModel::filterAcceptsRow(source_row, source_parent);
0055 }
0056 
0057 bool AccountsViewProxyModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const
0058 {
0059     Q_D(const AccountsViewProxyModel);
0060     Q_UNUSED(source_parent)
0061     if (d->m_visColumns.contains(d->m_mdlColumns->at(source_column)))
0062         return true;
0063     return false;
0064 }
0065 
0066 QSet<Column> AccountsViewProxyModel::getVisibleColumns()
0067 {
0068     Q_D(AccountsViewProxyModel);
0069     return d->m_visColumns;
0070 }
0071 
0072 void AccountsViewProxyModel::setColumnVisibility(Column column, bool show)
0073 {
0074     Q_D(AccountsViewProxyModel);
0075     if (show)
0076         d->m_visColumns.insert(column);                                                  // add column to filter
0077     else
0078         d->m_visColumns.remove(column);
0079 }
0080 
0081 void AccountsViewProxyModel::slotColumnsMenu(const QPoint)
0082 {
0083     Q_D(AccountsViewProxyModel);
0084     // construct all hideable columns list
0085     const QVector<Column> idColumns = { Column::Type, Column::Tax,
0086                                         Column::VAT, Column::CostCenter,
0087                                         Column::TotalBalance, Column::PostedValue,
0088                                         Column::TotalValue, Column::AccountNumber,
0089                                         Column::AccountSortCode
0090                                       };
0091 
0092     // create menu
0093     QMenu menu(i18n("Displayed columns"));
0094     QList<QAction *> actions;
0095     foreach (const auto idColumn, idColumns) {
0096         auto a = new QAction(nullptr);
0097         a->setObjectName(QString::number(static_cast<int>(idColumn)));
0098         a->setText(AccountsModel::getHeaderName(idColumn));
0099         a->setCheckable(true);
0100         a->setChecked(d->m_visColumns.contains(idColumn));
0101         actions.append(a);
0102     }
0103     menu.addActions(actions);
0104 
0105     // execute menu and get result
0106     const auto retAction = menu.exec(QCursor::pos());
0107     if (retAction) {
0108         const auto idColumn = static_cast<Column>(retAction->objectName().toInt());
0109         const auto isChecked = retAction->isChecked();
0110         setColumnVisibility(idColumn, isChecked);
0111         emit columnToggled(idColumn, isChecked);  // emit signal for method to possible load column into modela
0112         invalidateFilter();                       // refresh filter to reflect recent changes
0113     }
0114 }