File indexing completed on 2024-05-19 05:06:57

0001 /*
0002     SPDX-FileCopyrightText: 2020 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "idfilter.h"
0007 
0008 // ----------------------------------------------------------------------------
0009 // QT Includes
0010 
0011 #include <QSet>
0012 
0013 // ----------------------------------------------------------------------------
0014 // KDE Includes
0015 
0016 // ----------------------------------------------------------------------------
0017 // Project Includes
0018 
0019 #include "mymoneyenums.h"
0020 
0021 class IdFilterPrivate
0022 {
0023 public:
0024     IdFilterPrivate()
0025     {
0026     }
0027 
0028     QSet<QString>         idList;
0029 };
0030 
0031 
0032 IdFilter::IdFilter(QObject* parent)
0033     : QSortFilterProxyModel(parent)
0034     , d_ptr(new IdFilterPrivate)
0035 {
0036 }
0037 
0038 bool IdFilter::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
0039 {
0040     Q_D(const IdFilter);
0041 
0042     const auto idx = sourceModel()->index(source_row, 0, source_parent);
0043 
0044     // in case the object supports the ClosedRole, we evaluate it
0045     // and don't accept this item when it is true
0046     const auto closedRole = idx.data(eMyMoney::Model::ClosedRole);
0047     if (closedRole.isValid() && (closedRole.toBool() == true))
0048         return false;
0049 
0050     return !d->idList.contains(idx.data(eMyMoney::Model::IdRole).toString());
0051 }
0052 
0053 void IdFilter::setFilterList(const QStringList& idList)
0054 {
0055     Q_D(IdFilter);
0056     d->idList = QSet<QString>(idList.constBegin(), idList.constEnd());
0057     invalidateFilter();
0058 }
0059 
0060 void IdFilter::addFilter(const QString& id)
0061 {
0062     Q_D(IdFilter);
0063     d->idList.insert(id);
0064     invalidateFilter();
0065 }
0066 
0067 void IdFilter::removeFilter(const QString& id)
0068 {
0069     Q_D(IdFilter);
0070     if (d->idList.remove(id)) {
0071         invalidateFilter();
0072     }
0073 }
0074 
0075 QList<QString> IdFilter::filterList() const
0076 {
0077     Q_D(const IdFilter);
0078     return d->idList.values();
0079 }
0080 
0081 bool IdFilter::lessThan(const QModelIndex& left, const QModelIndex& right) const
0082 {
0083     // make sure that the empty item is shown first in any case
0084     if(left.data(eMyMoney::Model::IdRole).toString().isEmpty()) {
0085         return true;
0086 
0087     } else if(right.data(eMyMoney::Model::IdRole).toString().isEmpty()) {
0088         return false;
0089     }
0090 
0091     // let the base class do the real work
0092     return QSortFilterProxyModel::lessThan(left, right);
0093 }