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

0001 /*
0002     SPDX-FileCopyrightText: 2020 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "scheduleproxymodel.h"
0007 
0008 // ----------------------------------------------------------------------------
0009 // QT Includes
0010 
0011 #include <QDate>
0012 #include <QDebug>
0013 
0014 // ----------------------------------------------------------------------------
0015 // KDE Includes
0016 
0017 // ----------------------------------------------------------------------------
0018 // Project Includes
0019 
0020 #include "mymoneyenums.h"
0021 #include "mymoneyfile.h"
0022 #include "schedulesmodel.h"
0023 
0024 class ScheduleProxyModelPrivate
0025 {
0026 public:
0027     ScheduleProxyModelPrivate()
0028         : m_hideFinishedSchedules(false)
0029     {}
0030 
0031     bool m_hideFinishedSchedules;
0032 };
0033 
0034 ScheduleProxyModel::ScheduleProxyModel(QObject *parent)
0035     : QSortFilterProxyModel(parent)
0036     , d(new ScheduleProxyModelPrivate)
0037 {
0038     setRecursiveFilteringEnabled(true);
0039 }
0040 
0041 #undef QSortFilterProxyModel
0042 
0043 ScheduleProxyModel::~ScheduleProxyModel()
0044 {
0045 }
0046 
0047 bool ScheduleProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
0048 {
0049     // we only need to take care of sub-items here
0050     if (source_parent.isValid()) {
0051         const auto idx = sourceModel()->index(source_row, 0, source_parent);
0052         if (d->m_hideFinishedSchedules && idx.data(eMyMoney::Model::ScheduleIsFinishedRole).toBool()) {
0053             return false;
0054         }
0055         return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
0056     }
0057     return true;
0058 }
0059 
0060 void ScheduleProxyModel::setHideFinishedSchedules(bool hide)
0061 {
0062     d->m_hideFinishedSchedules = hide;
0063 }
0064 
0065 bool ScheduleProxyModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const
0066 {
0067     if (source_left.parent().isValid() && source_right.parent().isValid()) {
0068         // always show overdue schedules first
0069         if (source_left.data(eMyMoney::Model::ScheduleIsOverdueRole).toBool() != source_right.data(eMyMoney::Model::ScheduleIsOverdueRole).toBool()) {
0070             return (sortOrder() == Qt::SortOrder::AscendingOrder) ? source_left.data(eMyMoney::Model::ScheduleIsOverdueRole).toBool()
0071                                                                   : source_right.data(eMyMoney::Model::ScheduleIsOverdueRole).toBool();
0072         }
0073 
0074         switch (source_left.column()) {
0075         case SchedulesModel::Column::Name:
0076         case SchedulesModel::Column::Account:
0077         case SchedulesModel::Column::Payee:
0078             break;
0079 
0080         case SchedulesModel::Column::NextDueDate:
0081             return source_left.data(eMyMoney::Model::ScheduleNextDueDateRole).toDate() < source_right.data(eMyMoney::Model::ScheduleNextDueDateRole).toDate();
0082 
0083         case SchedulesModel::Column::Frequency:
0084             return source_left.data(eMyMoney::Model::ScheduleFrequencyRole).toInt() < source_right.data(eMyMoney::Model::ScheduleFrequencyRole).toInt();
0085         }
0086     }
0087     return QSortFilterProxyModel::lessThan(source_left, source_right);
0088 }