Browse Source

Merge pull request #1559 from sje397/BalanceSignalFix

Add a timer to check for changes in immature or unconfirmed balances,
metaverse
Wladimir J. van der Laan 12 years ago
parent
commit
9502ee3b5f
  1. 2
      src/qt/clientmodel.cpp
  2. 56
      src/qt/walletmodel.cpp
  3. 11
      src/qt/walletmodel.h

2
src/qt/clientmodel.cpp

@ -18,7 +18,7 @@ ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
{
numBlocksAtStartup = -1;
pollTimer = new QTimer();
pollTimer = new QTimer(this);
pollTimer->setInterval(MODEL_UPDATE_DELAY);
pollTimer->start();
connect(pollTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));

56
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 @@ void WalletModel::updateStatus()
emit encryptionStatusChanged(newEncryptionStatus);
}
void WalletModel::updateTransaction(const QString &hash, int status)
void WalletModel::pollBalanceChanged()
{
if(transactionTableModel)
transactionTableModel->updateTransaction(hash, status);
if(nBestHeight != cachedNumBlocks) {
cachedNumBlocks = nBestHeight;
checkBalanceChanged();
}
// Balance and number of transactions might have changed
if(cachedUnconfirmedBalance || cachedImmatureBalance)
pollTimer->start();
}
void WalletModel::checkBalanceChanged()
{
qint64 newBalance = getBalance();
qint64 newUnconfirmedBalance = getUnconfirmedBalance();
qint64 newImmatureBalance = getImmatureBalance();
int newNumTransactions = getNumTransactions();
if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance || cachedImmatureBalance != newImmatureBalance)
if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance || cachedImmatureBalance != newImmatureBalance) {
cachedBalance = newBalance;
cachedUnconfirmedBalance = newUnconfirmedBalance;
cachedImmatureBalance = newImmatureBalance;
emit balanceChanged(newBalance, newUnconfirmedBalance, newImmatureBalance);
}
}
if(cachedNumTransactions != newNumTransactions)
emit numTransactionsChanged(newNumTransactions);
void WalletModel::updateTransaction(const QString &hash, int status)
{
if(transactionTableModel)
transactionTableModel->updateTransaction(hash, status);
cachedBalance = newBalance;
cachedUnconfirmedBalance = newUnconfirmedBalance;
cachedImmatureBalance = newImmatureBalance;
cachedNumTransactions = newNumTransactions;
// Balance and number of transactions might have changed
checkBalanceChanged();
if(cachedUnconfirmedBalance || cachedImmatureBalance)
pollTimer->start();
int newNumTransactions = getNumTransactions();
if(cachedNumTransactions != newNumTransactions) {
emit numTransactionsChanged(newNumTransactions);
cachedNumTransactions = newNumTransactions;
}
}
void WalletModel::updateAddressBook(const QString &address, const QString &label, bool isMine, int status)

11
src/qt/walletmodel.h

@ -10,6 +10,10 @@ class AddressTableModel;
class TransactionTableModel;
class CWallet;
QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE
class SendCoinsRecipient
{
public:
@ -120,9 +124,14 @@ private:
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 @@ public slots:
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();
};

Loading…
Cancel
Save