File indexing completed on 2024-05-19 05:08:21
0001 /* 0002 SPDX-FileCopyrightText: 2020 Thomas Baumgart <tbaumgart@kde.org> 0003 SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 0006 0007 #include "ledgertagfilter.h" 0008 #include "ledgerfilterbase_p.h" 0009 0010 // ---------------------------------------------------------------------------- 0011 // QT Includes 0012 0013 // ---------------------------------------------------------------------------- 0014 // KDE Includes 0015 0016 // ---------------------------------------------------------------------------- 0017 // Project Includes 0018 0019 #include "mymoneyenums.h" 0020 #include "mymoneymoney.h" 0021 #include "mymoneyaccount.h" 0022 #include "mymoneyfile.h" 0023 #include "journalmodel.h" 0024 #include "accountsmodel.h" 0025 0026 class LedgerTagFilterPrivate : public LedgerFilterBasePrivate 0027 { 0028 public: 0029 explicit LedgerTagFilterPrivate(LedgerTagFilter* qq) 0030 : LedgerFilterBasePrivate(qq) 0031 , balanceCalculationPending(false) 0032 {} 0033 0034 ~LedgerTagFilterPrivate() 0035 { 0036 } 0037 0038 bool balanceCalculationPending; 0039 }; 0040 0041 0042 LedgerTagFilter::LedgerTagFilter(QObject* parent, QVector<QAbstractItemModel*> specialJournalModels) 0043 : LedgerFilterBase(new LedgerTagFilterPrivate(this), parent) 0044 { 0045 Q_D(LedgerTagFilter); 0046 0047 setFilterRole(eMyMoney::Model::SplitTagIdRole); 0048 setObjectName("LedgerTagFilter"); 0049 setFilterKeyColumn(0); 0050 0051 d->concatModel->setObjectName("LedgerView concatModel"); 0052 d->concatModel->addSourceModel(MyMoneyFile::instance()->journalModel()); 0053 0054 for (const auto model : specialJournalModels) { 0055 d->concatModel->addSourceModel(model); 0056 } 0057 0058 setSourceModel(d->concatModel); 0059 } 0060 0061 LedgerTagFilter::~LedgerTagFilter() 0062 { 0063 } 0064 0065 void LedgerTagFilter::setShowBalanceInverted(bool inverted) 0066 { 0067 Q_D(LedgerTagFilter); 0068 d->showValuesInverted = inverted; 0069 } 0070 0071 void LedgerTagFilter::recalculateBalancesOnIdle(const QString& accountId) 0072 { 0073 Q_UNUSED(accountId); 0074 Q_D(LedgerTagFilter); 0075 0076 // make sure the balances are recalculated but trigger only once 0077 if(!d->balanceCalculationPending) { 0078 d->balanceCalculationPending = true; 0079 QMetaObject::invokeMethod(this, "recalculateBalances", Qt::QueuedConnection); 0080 } 0081 } 0082 0083 void LedgerTagFilter::recalculateBalances() 0084 { 0085 Q_D(LedgerTagFilter); 0086 0087 if (sourceModel() == nullptr || d->filterIds.isEmpty()) 0088 return; 0089 0090 /// @todo port to new model code 0091 #if 0 0092 const auto start = index(0, 0); 0093 const auto indexes = match(start, eMyMoney::Model::SplitAccountIdRole, d->payeeId, -1); 0094 MyMoneyMoney balance; 0095 for(const auto &idx : indexes) { 0096 if(d->showValuesInverted) { 0097 balance -= idx.data(eMyMoney::Model::SplitSharesRole).value<MyMoneyMoney>(); 0098 } else { 0099 balance += idx.data(eMyMoney::Model::SplitSharesRole).value<MyMoneyMoney>(); 0100 } 0101 const auto dispIndex = index(idx.row(), JournalModel::Column::Balance); 0102 setData(dispIndex, QVariant::fromValue(balance), Qt::DisplayRole); 0103 } 0104 #endif 0105 0106 // filterModel->invalidate(); 0107 const QModelIndex top = index(0, JournalModel::Column::Balance); 0108 const QModelIndex bottom = index(rowCount()-1, JournalModel::Column::Balance); 0109 0110 Q_EMIT dataChanged(top, bottom); 0111 d->balanceCalculationPending = false; 0112 } 0113 0114 void LedgerTagFilter::setTagIdList(const QStringList& tagIds) 0115 { 0116 Q_D(LedgerTagFilter); 0117 0118 setFilterFixedStrings(tagIds); 0119 0120 setSortRole(eMyMoney::Model::TransactionPostDateRole); 0121 sort(JournalModel::Column::Date, sortOrder()); 0122 0123 // if balance calculation has not been triggered, then run it immediately 0124 if(!d->balanceCalculationPending) { 0125 recalculateBalances(); 0126 } 0127 0128 invalidateFilter(); 0129 } 0130 0131 bool LedgerTagFilter::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const 0132 { 0133 Q_D(const LedgerTagFilter); 0134 0135 bool rc = LedgerFilterBase::filterAcceptsRow(source_row, source_parent); 0136 0137 if (rc) { 0138 QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); 0139 0140 // special dates are shown when sorted by date 0141 if (d->isSpecialDatesModel(idx)) { 0142 return (sortRole() == eMyMoney::Model::TransactionPostDateRole); 0143 } 0144 } 0145 return rc; 0146 }