From: tobtoht Date: Fri, 14 Jul 2023 23:55:02 +0000 (+0200) Subject: History: add balance column X-Git-Url: https://git.nutra.tk/v2?a=commitdiff_plain;h=9ec53dc7d5b247556c0f6f2e23189511551d5934;p=gamesguru%2Ffeather.git History: add balance column --- diff --git a/monero b/monero index 9e4a4d30..ecca08f4 160000 --- a/monero +++ b/monero @@ -1 +1 @@ -Subproject commit 9e4a4d305c0a24f294d9f75d33065381b6fba520 +Subproject commit ecca08f4c0b1e5a012cdd20110b015c540bce0c6 diff --git a/src/libwalletqt/TransactionHistory.cpp b/src/libwalletqt/TransactionHistory.cpp index 31a63db0..a5e71038 100644 --- a/src/libwalletqt/TransactionHistory.cpp +++ b/src/libwalletqt/TransactionHistory.cpp @@ -64,13 +64,22 @@ void TransactionHistory::refresh(quint32 accountIndex) m_locked = false; m_minutesToUnlock = 0; + quint64 balance = 0; + m_pimpl->refresh(); for (const auto i : m_pimpl->getAll()) { if (i->subaddrAccount() != accountIndex) { continue; } - m_tinfo.append(new TransactionInfo(i, this)); + if (i->direction() == Monero::TransactionInfo::Direction_In) { + balance += i->amount(); + } + else if (i->direction() == Monero::TransactionInfo::Direction_Out) { + balance -= i->amount() + i->fee(); + } + + m_tinfo.append(new TransactionInfo(i, balance, this)); const TransactionInfo *ti = m_tinfo.back(); // looking for transactions timestamp scope @@ -159,7 +168,7 @@ bool TransactionHistory::writeCSV(const QString &path) { }); for (const auto &tx : transactions) { - TransactionInfo info(tx, this); + TransactionInfo info(tx, 0, this); // collect column data QDateTime timeStamp = info.timestamp(); diff --git a/src/libwalletqt/TransactionInfo.cpp b/src/libwalletqt/TransactionInfo.cpp index fe78e916..cd05ec7a 100644 --- a/src/libwalletqt/TransactionInfo.cpp +++ b/src/libwalletqt/TransactionInfo.cpp @@ -37,6 +37,11 @@ quint64 TransactionInfo::balanceDelta() const return m_amount; } +quint64 TransactionInfo::balance() const +{ + return m_balance; +} + double TransactionInfo::amount() const { // there's no unsigned uint64 for JS, so better use double @@ -167,7 +172,7 @@ QString TransactionInfo::rings_formatted() const return rings; } -TransactionInfo::TransactionInfo(const Monero::TransactionInfo *pimpl, QObject *parent) +TransactionInfo::TransactionInfo(const Monero::TransactionInfo *pimpl, quint64 balance, QObject *parent) : QObject(parent) , m_amount(pimpl->amount()) , m_blockHeight(pimpl->blockHeight()) @@ -184,6 +189,7 @@ TransactionInfo::TransactionInfo(const Monero::TransactionInfo *pimpl, QObject * , m_timestamp(QDateTime::fromSecsSinceEpoch(pimpl->timestamp())) , m_unlockTime(pimpl->unlockTime()) , m_coinbase(pimpl->isCoinbase()) + , m_balance(balance) { for (auto const &t: pimpl->transfers()) { diff --git a/src/libwalletqt/TransactionInfo.h b/src/libwalletqt/TransactionInfo.h index 9e496c4d..6ea3dad9 100644 --- a/src/libwalletqt/TransactionInfo.h +++ b/src/libwalletqt/TransactionInfo.h @@ -53,6 +53,7 @@ public: bool isFailed() const; bool isCoinbase() const; quint64 balanceDelta() const; + quint64 balance() const; double amount() const; quint64 atomicAmount() const; QString displayAmount() const; @@ -80,7 +81,7 @@ public: QString rings_formatted() const; private: - explicit TransactionInfo(const Monero::TransactionInfo *pimpl, QObject *parent = nullptr); + explicit TransactionInfo(const Monero::TransactionInfo *pimpl, quint64 balance, QObject *parent = nullptr); private: friend class TransactionHistory; mutable QList m_transfers; @@ -102,6 +103,7 @@ private: QDateTime m_timestamp; quint64 m_unlockTime; bool m_coinbase; + quint64 m_balance; }; #endif // TRANSACTIONINFO_H diff --git a/src/model/HistoryView.cpp b/src/model/HistoryView.cpp index 4caefedb..03ce4c2d 100644 --- a/src/model/HistoryView.cpp +++ b/src/model/HistoryView.cpp @@ -181,6 +181,7 @@ void HistoryView::resetViewToDefaults() header()->showSection(TransactionHistoryModel::Description); header()->showSection(TransactionHistoryModel::Amount); header()->showSection(TransactionHistoryModel::FiatAmount); + header()->hideSection(TransactionHistoryModel::Balance); // Reset column order to logical indices for (int i = 0; i < header()->count(); ++i) { diff --git a/src/model/TransactionHistoryModel.cpp b/src/model/TransactionHistoryModel.cpp index a7e055b1..fd55e9aa 100644 --- a/src/model/TransactionHistoryModel.cpp +++ b/src/model/TransactionHistoryModel.cpp @@ -67,7 +67,7 @@ QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const bool found = m_transactionHistory->transaction(index.row(), [this, &index, &result, &role](const TransactionInfo &tInfo) { if(role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole) { - result = parseTransactionInfo(tInfo, index.column(), role); + result = parseTransactionInfo(tInfo, index.row(), index.column(), role); } else if (role == Qt::TextAlignmentRole) { switch (index.column()) { @@ -139,14 +139,14 @@ QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const return result; } -QVariant TransactionHistoryModel::parseTransactionInfo(const TransactionInfo &tInfo, int column, int role) const +QVariant TransactionHistoryModel::parseTransactionInfo(const TransactionInfo &tInfo, int row, int column, int role) const { switch (column) { case Column::Date: { if (role == Qt::UserRole) { - return tInfo.timestamp(); + return row; } return tInfo.timestamp().toString(QString("%1 %2 ").arg(config()->get(Config::dateFormat).toString(), config()->get(Config::timeFormat).toString())); @@ -158,7 +158,7 @@ QVariant TransactionHistoryModel::parseTransactionInfo(const TransactionInfo &tI if (role == Qt::UserRole) { return tInfo.balanceDelta(); } - QString amount = QString::number(tInfo.balanceDelta() / constants::cdiv, 'f', config()->get(Config::amountPrecision).toInt()); + auto amount = this->formatAmount(tInfo.balanceDelta()); amount = (tInfo.direction() == TransactionInfo::Direction_Out) ? "-" + amount : "+" + amount; return amount; } @@ -188,6 +188,10 @@ QVariant TransactionHistoryModel::parseTransactionInfo(const TransactionInfo &tI double fiat_rounded = ceil(Utils::roundSignificant(usd_amount, 3) * 100.0) / 100.0; return QString("%1").arg(Utils::amountToCurrencyString(fiat_rounded, preferredFiatCurrency)); } + case Column::Balance: + { + return this->formatAmount(tInfo.balance()); + } default: { qCritical() << "Unimplemented role"; @@ -196,6 +200,10 @@ QVariant TransactionHistoryModel::parseTransactionInfo(const TransactionInfo &tI } } +QString TransactionHistoryModel::formatAmount(quint64 amount) const { + return QString::number(amount / constants::cdiv, 'f', config()->get(Config::amountPrecision).toInt()); +} + QVariant TransactionHistoryModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(orientation) if (role != Qt::DisplayRole) { @@ -213,6 +221,8 @@ QVariant TransactionHistoryModel::headerData(int section, Qt::Orientation orient return QString("Txid"); case Column::FiatAmount: return QString("Fiat"); + case Column::Balance: + return QString("Balance"); default: return QVariant(); } diff --git a/src/model/TransactionHistoryModel.h b/src/model/TransactionHistoryModel.h index 582c57cc..2f0d5c45 100644 --- a/src/model/TransactionHistoryModel.h +++ b/src/model/TransactionHistoryModel.h @@ -27,6 +27,7 @@ public: Description, Amount, FiatAmount, + Balance, COUNT }; @@ -47,7 +48,8 @@ signals: void transactionHistoryChanged(); private: - QVariant parseTransactionInfo(const TransactionInfo &tInfo, int column, int role) const; + QVariant parseTransactionInfo(const TransactionInfo &tInfo, int row, int column, int role) const; + QString formatAmount(quint64 amount) const; TransactionHistory * m_transactionHistory; };