changeset 3150:0f0aad98e2a6 draft

Add a timer to check for changes in immature or unconfirmed balances, when these are non-zero. Fixed a minor mem leak.
author Scott Ellis <sje397@gmail.com>
date Fri, 06 Jul 2012 01:43:28 +1000
parents 2145835b6be7
children c8919cc94799
files src/qt/clientmodel.cpp src/qt/walletmodel.cpp src/qt/walletmodel.h
diffstat 3 files changed, 55 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -18,7 +18,7 @@
 {
     numBlocksAtStartup = -1;
 
-    pollTimer = new QTimer();
+    pollTimer = new QTimer(this);
     pollTimer->setInterval(MODEL_UPDATE_DELAY);
     pollTimer->start();
     connect(pollTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -10,17 +10,27 @@
 #include "base58.h"
 
 #include <QSet>
+#include <QTimer>
 
 WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent) :
     QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0),
     transactionTableModel(0),
     cachedBalance(0), cachedUnconfirmedBalance(0), cachedImmatureBalance(0),
     cachedNumTransactions(0),
-    cachedEncryptionStatus(Unencrypted)
+    cachedEncryptionStatus(Unencrypted),
+    cachedNumBlocks(0)
 {
     addressTableModel = new AddressTableModel(wallet, this);
     transactionTableModel = new TransactionTableModel(wallet, this);
 
+    // This single-shot timer will be fired from the 'checkBalancedChanged'
+    // method repeatedly while either of the unconfirmed or immature balances
+    // are non-zero
+    pollTimer = new QTimer(this);
+    pollTimer->setInterval(MODEL_UPDATE_DELAY);
+    pollTimer->setSingleShot(true);
+    connect(pollTimer, SIGNAL(timeout()), this, SLOT(pollBalanceChanged()));
+
     subscribeToCoreSignals();
 }
 
@@ -62,27 +72,47 @@
         emit encryptionStatusChanged(newEncryptionStatus);
 }
 
+void WalletModel::pollBalanceChanged()
+{
+    if(nBestHeight != cachedNumBlocks) {
+        cachedNumBlocks = nBestHeight;
+        checkBalanceChanged();
+    }
+
+    if(cachedUnconfirmedBalance || cachedImmatureBalance)
+        pollTimer->start();
+}
+
+void WalletModel::checkBalanceChanged()
+{
+    qint64 newBalance = getBalance();
+    qint64 newUnconfirmedBalance = getUnconfirmedBalance();
+    qint64 newImmatureBalance = getImmatureBalance();
+
+    if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance || cachedImmatureBalance != newImmatureBalance) {
+        cachedBalance = newBalance;
+        cachedUnconfirmedBalance = newUnconfirmedBalance;
+        cachedImmatureBalance = newImmatureBalance;
+        emit balanceChanged(newBalance, newUnconfirmedBalance, newImmatureBalance);
+    }
+}
+
 void WalletModel::updateTransaction(const QString &hash, int status)
 {
     if(transactionTableModel)
         transactionTableModel->updateTransaction(hash, status);
 
     // Balance and number of transactions might have changed
-    qint64 newBalance = getBalance();
-    qint64 newUnconfirmedBalance = getUnconfirmedBalance();
-    qint64 newImmatureBalance = getImmatureBalance();
-    int newNumTransactions = getNumTransactions();
+    checkBalanceChanged();
 
-    if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance || cachedImmatureBalance != newImmatureBalance)
-        emit balanceChanged(newBalance, newUnconfirmedBalance, newImmatureBalance);
+    if(cachedUnconfirmedBalance || cachedImmatureBalance)
+        pollTimer->start();
 
-    if(cachedNumTransactions != newNumTransactions)
+    int newNumTransactions = getNumTransactions();
+    if(cachedNumTransactions != newNumTransactions) {
         emit numTransactionsChanged(newNumTransactions);
-
-    cachedBalance = newBalance;
-    cachedUnconfirmedBalance = newUnconfirmedBalance;
-    cachedImmatureBalance = newImmatureBalance;
-    cachedNumTransactions = newNumTransactions;
+        cachedNumTransactions = newNumTransactions;
+    }
 }
 
 void WalletModel::updateAddressBook(const QString &address, const QString &label, bool isMine, int status)
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -10,6 +10,10 @@
 class TransactionTableModel;
 class CWallet;
 
+QT_BEGIN_NAMESPACE
+class QTimer;
+QT_END_NAMESPACE
+
 class SendCoinsRecipient
 {
 public:
@@ -120,9 +124,14 @@
     qint64 cachedImmatureBalance;
     qint64 cachedNumTransactions;
     EncryptionStatus cachedEncryptionStatus;
+    int cachedNumBlocks;
+
+    QTimer *pollTimer;
 
     void subscribeToCoreSignals();
     void unsubscribeFromCoreSignals();
+    void checkBalanceChanged();
+
 signals:
     // Signal that balance in wallet changed
     void balanceChanged(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance);
@@ -148,6 +157,8 @@
     void updateTransaction(const QString &hash, int status);
     /* New, updated or removed address book entry */
     void updateAddressBook(const QString &address, const QString &label, bool isMine, int status);
+    /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
+    void pollBalanceChanged();
 };