Remove spent transactions from minting table.
[novacoin.git] / src / qt / mintingtablemodel.cpp
index 1007c95..7eece74 100644 (file)
@@ -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<KernelRecord> 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);