Code cleanup
[novacoin.git] / src / qt / mintingtablemodel.cpp
index 139116c..430b535 100644 (file)
@@ -1,4 +1,5 @@
 #include "mintingtablemodel.h"
+#include "mintingfilterproxy.h"
 #include "transactiontablemodel.h"
 #include "guiutil.h"
 #include "kernelrecord.h"
 extern double GetDifficulty(const CBlockIndex* blockindex);
 
 static int column_alignments[] = {
-    Qt::AlignCenter|Qt::AlignVCenter,
-    Qt::AlignCenter|Qt::AlignVCenter,
-    Qt::AlignCenter|Qt::AlignVCenter,
-    Qt::AlignCenter|Qt::AlignVCenter,
-    Qt::AlignCenter|Qt::AlignVCenter,
-    Qt::AlignCenter|Qt::AlignVCenter,
-    Qt::AlignCenter|Qt::AlignVCenter
+    Qt::AlignLeft|Qt::AlignVCenter,
+    Qt::AlignLeft|Qt::AlignVCenter,
+    Qt::AlignLeft|Qt::AlignVCenter,
+    Qt::AlignLeft|Qt::AlignVCenter,
+    Qt::AlignLeft|Qt::AlignVCenter,
+    Qt::AlignLeft|Qt::AlignVCenter,
+    Qt::AlignLeft|Qt::AlignVCenter
 };
 
 struct TxLessThan
@@ -135,16 +136,17 @@ public:
                             KernelRecord::decomposeOutput(wallet, mi->second);
                     if(!toInsert.empty()) /* only if something to insert */
                     {
-                        parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1);
                         int insert_idx = lowerIndex;
                         BOOST_FOREACH(const KernelRecord &rec, toInsert)
                         {
-                            if(!rec.spent) {
+                            if(!rec.spent) 
+                            {
+                                parent->beginInsertRows(QModelIndex(), insert_idx, insert_idx);
                                 cachedWallet.insert(insert_idx, rec);
+                                parent->endInsertRows();
                                 insert_idx += 1;
                             }
                         }
-                        parent->endInsertRows();
                     }
                 }
                 else if(!inWallet && inModel)
@@ -156,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;
+                                }
+                            }
+                        }
+                    }
                 }
             }
         }
@@ -203,7 +225,7 @@ MintingTableModel::MintingTableModel(CWallet *wallet, WalletModel *parent):
         mintingInterval(10),
         priv(new MintingTablePriv(wallet, this))
 {
-    columns << tr("Transaction") <<  tr("Address") << tr("Age") << tr("Balance") << tr("CoinDay") << tr("MintProbability") << tr("MintReward");
+    columns << tr("Transaction") <<  tr("Address") << tr("Balance") << tr("Age") << tr("CoinDay") << tr("MintProbability") << tr("MintReward");
     priv->refreshWallet();
 
     QTimer *timer = new QTimer(this);
@@ -228,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();
         }
@@ -236,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);
@@ -312,11 +350,11 @@ QVariant MintingTableModel::data(const QModelIndex &index, int role) const
         case TxHash:
             return formatTxHash(rec);
         case Age:
-            return rec->getAge();
+            return static_cast<qlonglong>(rec->getAge());
         case CoinDay:
-            return rec->coinAge;
+            return static_cast<qlonglong>(rec->coinAge);
         case Balance:
-            return rec->nValue;
+            return static_cast<qlonglong>(rec->nValue);
         case MintProbability:
             return getDayToMint(rec);
         case MintReward:
@@ -367,10 +405,9 @@ QString MintingTableModel::lookupAddress(const std::string &address, bool toolti
 QString MintingTableModel::formatTxPoSReward(KernelRecord *wtx) const
 {
     QString posReward;
-    const CBlockIndex *p = GetLastBlockIndex(pindexBest, true);
-    double difficulty = GetDifficulty(p);
-    posReward += QString(QObject::tr("from  %1 NVC to %2 NVC")).arg(QString::number(wtx->getPoSReward(difficulty, 0),'f', 6), 
-                 QString::number(wtx->getPoSReward(difficulty, mintingInterval),'f', 6)); 
+    int nBits = GetLastBlockIndex(pindexBest, true)->nBits;
+    posReward += QString(QObject::tr("from  %1 to %2")).arg(BitcoinUnits::formatWithUnit(walletModel->getOptionsModel()->getDisplayUnit(), wtx->getPoSReward(nBits, 0)), 
+        BitcoinUnits::formatWithUnit(walletModel->getOptionsModel()->getDisplayUnit(), wtx->getPoSReward(nBits, mintingInterval))); 
     return posReward;
 }
 
@@ -402,18 +439,18 @@ QString MintingTableModel::formatTxHash(const KernelRecord *wtx) const
 
 QString MintingTableModel::formatTxCoinDay(const KernelRecord *wtx) const
 {
-    return QString::number(wtx->coinAge);
+    return QString::number(wtx->getCoinDay());
 }
 
 QString MintingTableModel::formatTxAge(const KernelRecord *wtx) const
 {
-    int64 nAge = wtx->getAge();
+    int64_t nAge = wtx->getAge();
     return QString::number(nAge);
 }
 
 QString MintingTableModel::formatTxBalance(const KernelRecord *wtx) const
 {
-    return BitcoinUnits::format(walletModel->getOptionsModel()->getDisplayUnit(), wtx->nValue);
+    return BitcoinUnits::formatWithUnit(walletModel->getOptionsModel()->getDisplayUnit(), wtx->nValue);
 }
 
 QVariant MintingTableModel::headerData(int section, Qt::Orientation orientation, int role) const
@@ -464,4 +501,3 @@ QModelIndex MintingTableModel::index(int row, int column, const QModelIndex &par
         return QModelIndex();
     }
 }
-