From d2a0c21492bba6b0a78cc6114da7120eb2f46dba Mon Sep 17 00:00:00 2001 From: fsb4000 Date: Fri, 12 Dec 2014 12:21:44 +0600 Subject: [PATCH] Remove spent transactions from minting table. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Спасибо разработчикам PeerUnity https://github.com/Peerunity/Peerunity/commit/df9b6c25942e94aee61326aa028e9eb3b3ca7bc4 --- src/qt/mintingtablemodel.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/qt/mintingtablemodel.h | 4 +++- src/qt/mintingview.cpp | 1 + 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/qt/mintingtablemodel.cpp b/src/qt/mintingtablemodel.cpp index 1007c95..7eece74 100644 --- a/src/qt/mintingtablemodel.cpp +++ b/src/qt/mintingtablemodel.cpp @@ -1,4 +1,5 @@ #include "mintingtablemodel.h" +#include "mintingfilterproxy.h" #include "transactiontablemodel.h" #include "guiutil.h" #include "kernelrecord.h" @@ -157,7 +158,27 @@ public: } else if(inWallet && inModel) { - // Updated -- nothing to do, status update will take care of this + // Updated -- remove spent coins from table + std::vector toCheck = KernelRecord::decomposeOutput(wallet, mi->second); + BOOST_FOREACH(const KernelRecord &rec, toCheck) + { + if(rec.spent) + { + for(int i = 0; i < cachedWallet.size(); i++) + { + KernelRecord cachedRec = cachedWallet.at(i); + if((rec.hash == cachedRec.hash) + && (rec.nTime == cachedRec.nTime) + && (rec.nValue == cachedRec.nValue)) + { + parent->beginRemoveRows(QModelIndex(), i, i); + cachedWallet.removeAt(i); + parent->endRemoveRows(); + break; + } + } + } + } } } } @@ -229,6 +250,16 @@ void MintingTableModel::update() BOOST_FOREACH(uint256 hash, wallet->vMintingWalletUpdated) { updated.append(hash); + + // Also check the inputs to remove spent outputs from the table if necessary + CWalletTx wtx; + if(wallet->GetTransaction(hash, wtx)) + { + BOOST_FOREACH(const CTxIn& txin, wtx.vin) + { + updated.append(txin.prevout.hash); + } + } } wallet->vMintingWalletUpdated.clear(); } @@ -237,9 +268,15 @@ void MintingTableModel::update() if(!updated.empty()) { priv->updateWallet(updated); + mintingProxyModel->invalidate(); // Force deletion of empty rows } } +void MintingTableModel::setMintingProxyModel(MintingFilterProxy *mintingProxy) +{ + mintingProxyModel = mintingProxy; +} + int MintingTableModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); diff --git a/src/qt/mintingtablemodel.h b/src/qt/mintingtablemodel.h index 47c5120..86b6465 100644 --- a/src/qt/mintingtablemodel.h +++ b/src/qt/mintingtablemodel.h @@ -7,6 +7,7 @@ class CWallet; class MintingTablePriv; +class MintingFilterProxy; class KernelRecord; class WalletModel; @@ -27,7 +28,7 @@ public: MintReward = 6 }; - + void setMintingProxyModel(MintingFilterProxy *mintingProxy); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; @@ -42,6 +43,7 @@ private: QStringList columns; int mintingInterval; MintingTablePriv *priv; + MintingFilterProxy *mintingProxyModel; QString lookupAddress(const std::string &address, bool tooltip) const; diff --git a/src/qt/mintingview.cpp b/src/qt/mintingview.cpp index 9a227e8..1fdef92 100644 --- a/src/qt/mintingview.cpp +++ b/src/qt/mintingview.cpp @@ -129,6 +129,7 @@ void MintingView::setModel(WalletModel *model) mintingProxyModel->setSourceModel(model->getMintingTableModel()); mintingProxyModel->setDynamicSortFilter(true); mintingProxyModel->setSortRole(Qt::EditRole); + model->getMintingTableModel()->setMintingProxyModel(mintingProxyModel); mintingView->setModel(mintingProxyModel); mintingView->setAlternatingRowColors(true); -- 1.7.1