mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Remove direct bitcoin calls from qt transaction table files
This commit is contained in:
committed by
John Newbery
parent
3cab2ce5f9
commit
58845587e1
@@ -14,11 +14,12 @@
|
||||
#include <qt/walletmodel.h>
|
||||
|
||||
#include <core_io.h>
|
||||
#include <interface/handler.h>
|
||||
#include <interface/node.h>
|
||||
#include <validation.h>
|
||||
#include <sync.h>
|
||||
#include <uint256.h>
|
||||
#include <util.h>
|
||||
#include <wallet/wallet.h>
|
||||
|
||||
#include <QColor>
|
||||
#include <QDateTime>
|
||||
@@ -57,13 +58,11 @@ struct TxLessThan
|
||||
class TransactionTablePriv
|
||||
{
|
||||
public:
|
||||
TransactionTablePriv(CWallet *_wallet, TransactionTableModel *_parent) :
|
||||
wallet(_wallet),
|
||||
TransactionTablePriv(TransactionTableModel *_parent) :
|
||||
parent(_parent)
|
||||
{
|
||||
}
|
||||
|
||||
CWallet *wallet;
|
||||
TransactionTableModel *parent;
|
||||
|
||||
/* Local cache of wallet.
|
||||
@@ -74,16 +73,15 @@ public:
|
||||
|
||||
/* Query entire wallet anew from core.
|
||||
*/
|
||||
void refreshWallet()
|
||||
void refreshWallet(interface::Wallet& wallet)
|
||||
{
|
||||
qDebug() << "TransactionTablePriv::refreshWallet";
|
||||
cachedWallet.clear();
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
for (const auto& entry : wallet->mapWallet)
|
||||
{
|
||||
if (TransactionRecord::showTransaction(entry.second))
|
||||
cachedWallet.append(TransactionRecord::decomposeTransaction(wallet, entry.second));
|
||||
for (const auto& wtx : wallet.getWalletTxs()) {
|
||||
if (TransactionRecord::showTransaction()) {
|
||||
cachedWallet.append(TransactionRecord::decomposeTransaction(wtx));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,7 +91,7 @@ public:
|
||||
|
||||
Call with transaction that was added, removed or changed.
|
||||
*/
|
||||
void updateWallet(const uint256 &hash, int status, bool showTransaction)
|
||||
void updateWallet(interface::Wallet& wallet, const uint256 &hash, int status, bool showTransaction)
|
||||
{
|
||||
qDebug() << "TransactionTablePriv::updateWallet: " + QString::fromStdString(hash.ToString()) + " " + QString::number(status);
|
||||
|
||||
@@ -128,17 +126,16 @@ public:
|
||||
}
|
||||
if(showTransaction)
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
// Find transaction in wallet
|
||||
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash);
|
||||
if(mi == wallet->mapWallet.end())
|
||||
interface::WalletTx wtx = wallet.getWalletTx(hash);
|
||||
if(!wtx.tx)
|
||||
{
|
||||
qWarning() << "TransactionTablePriv::updateWallet: Warning: Got CT_NEW, but transaction is not in wallet";
|
||||
break;
|
||||
}
|
||||
// Added -- insert at the right position
|
||||
QList<TransactionRecord> toInsert =
|
||||
TransactionRecord::decomposeTransaction(wallet, mi->second);
|
||||
TransactionRecord::decomposeTransaction(wtx);
|
||||
if(!toInsert.isEmpty()) /* only if something to insert */
|
||||
{
|
||||
parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1);
|
||||
@@ -179,7 +176,7 @@ public:
|
||||
return cachedWallet.size();
|
||||
}
|
||||
|
||||
TransactionRecord *index(int idx)
|
||||
TransactionRecord *index(interface::Wallet& wallet, int idx)
|
||||
{
|
||||
if(idx >= 0 && idx < cachedWallet.size())
|
||||
{
|
||||
@@ -192,61 +189,42 @@ public:
|
||||
// If a status update is needed (blocks came in since last check),
|
||||
// update the status of this transaction from the wallet. Otherwise,
|
||||
// simply re-use the cached status.
|
||||
TRY_LOCK(cs_main, lockMain);
|
||||
if(lockMain)
|
||||
{
|
||||
TRY_LOCK(wallet->cs_wallet, lockWallet);
|
||||
if(lockWallet && rec->statusUpdateNeeded())
|
||||
{
|
||||
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
|
||||
|
||||
if(mi != wallet->mapWallet.end())
|
||||
{
|
||||
rec->updateStatus(mi->second);
|
||||
}
|
||||
}
|
||||
interface::WalletTxStatus wtx;
|
||||
int numBlocks;
|
||||
int64_t adjustedTime;
|
||||
if (wallet.tryGetTxStatus(rec->hash, wtx, numBlocks, adjustedTime) && rec->statusUpdateNeeded(numBlocks)) {
|
||||
rec->updateStatus(wtx, numBlocks, adjustedTime);
|
||||
}
|
||||
return rec;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
QString describe(TransactionRecord *rec, int unit)
|
||||
QString describe(interface::Node& node, interface::Wallet& wallet, TransactionRecord *rec, int unit)
|
||||
{
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
|
||||
if(mi != wallet->mapWallet.end())
|
||||
{
|
||||
return TransactionDesc::toHTML(wallet, mi->second, rec, unit);
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
return TransactionDesc::toHTML(node, wallet, rec, unit);
|
||||
}
|
||||
|
||||
QString getTxHex(TransactionRecord *rec)
|
||||
QString getTxHex(interface::Wallet& wallet, TransactionRecord *rec)
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
|
||||
if(mi != wallet->mapWallet.end())
|
||||
{
|
||||
std::string strHex = EncodeHexTx(*mi->second.tx);
|
||||
auto tx = wallet.getTx(rec->hash);
|
||||
if (tx) {
|
||||
std::string strHex = EncodeHexTx(*tx);
|
||||
return QString::fromStdString(strHex);
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
};
|
||||
|
||||
TransactionTableModel::TransactionTableModel(const PlatformStyle *_platformStyle, CWallet* _wallet, WalletModel *parent):
|
||||
TransactionTableModel::TransactionTableModel(const PlatformStyle *_platformStyle, WalletModel *parent):
|
||||
QAbstractTableModel(parent),
|
||||
wallet(_wallet),
|
||||
walletModel(parent),
|
||||
priv(new TransactionTablePriv(_wallet, this)),
|
||||
priv(new TransactionTablePriv(this)),
|
||||
fProcessingQueuedTransactions(false),
|
||||
platformStyle(_platformStyle)
|
||||
{
|
||||
columns << QString() << QString() << tr("Date") << tr("Type") << tr("Label") << BitcoinUnits::getAmountColumnTitle(walletModel->getOptionsModel()->getDisplayUnit());
|
||||
priv->refreshWallet();
|
||||
priv->refreshWallet(walletModel->wallet());
|
||||
|
||||
connect(walletModel->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
|
||||
|
||||
@@ -271,7 +249,7 @@ void TransactionTableModel::updateTransaction(const QString &hash, int status, b
|
||||
uint256 updated;
|
||||
updated.SetHex(hash.toStdString());
|
||||
|
||||
priv->updateWallet(updated, status, showTransaction);
|
||||
priv->updateWallet(walletModel->wallet(), updated, status, showTransaction);
|
||||
}
|
||||
|
||||
void TransactionTableModel::updateConfirmations()
|
||||
@@ -608,7 +586,7 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
|
||||
case WatchonlyDecorationRole:
|
||||
return txWatchonlyDecoration(rec);
|
||||
case LongDescriptionRole:
|
||||
return priv->describe(rec, walletModel->getOptionsModel()->getDisplayUnit());
|
||||
return priv->describe(walletModel->node(), walletModel->wallet(), rec, walletModel->getOptionsModel()->getDisplayUnit());
|
||||
case AddressRole:
|
||||
return QString::fromStdString(rec->address);
|
||||
case LabelRole:
|
||||
@@ -618,7 +596,7 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const
|
||||
case TxHashRole:
|
||||
return rec->getTxHash();
|
||||
case TxHexRole:
|
||||
return priv->getTxHex(rec);
|
||||
return priv->getTxHex(walletModel->wallet(), rec);
|
||||
case TxPlainTextRole:
|
||||
{
|
||||
QString details;
|
||||
@@ -694,10 +672,10 @@ QVariant TransactionTableModel::headerData(int section, Qt::Orientation orientat
|
||||
QModelIndex TransactionTableModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
TransactionRecord *data = priv->index(row);
|
||||
TransactionRecord *data = priv->index(walletModel->wallet(), row);
|
||||
if(data)
|
||||
{
|
||||
return createIndex(row, column, priv->index(row));
|
||||
return createIndex(row, column, priv->index(walletModel->wallet(), row));
|
||||
}
|
||||
return QModelIndex();
|
||||
}
|
||||
@@ -735,13 +713,11 @@ private:
|
||||
static bool fQueueNotifications = false;
|
||||
static std::vector< TransactionNotification > vQueueNotifications;
|
||||
|
||||
static void NotifyTransactionChanged(TransactionTableModel *ttm, CWallet *wallet, const uint256 &hash, ChangeType status)
|
||||
static void NotifyTransactionChanged(TransactionTableModel *ttm, const uint256 &hash, ChangeType status)
|
||||
{
|
||||
// Find transaction in wallet
|
||||
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash);
|
||||
// Determine whether to show transaction or not (determine this here so that no relocking is needed in GUI thread)
|
||||
bool inWallet = mi != wallet->mapWallet.end();
|
||||
bool showTransaction = (inWallet && TransactionRecord::showTransaction(mi->second));
|
||||
bool showTransaction = TransactionRecord::showTransaction();
|
||||
|
||||
TransactionNotification notification(hash, status, showTransaction);
|
||||
|
||||
@@ -777,13 +753,13 @@ static void ShowProgress(TransactionTableModel *ttm, const std::string &title, i
|
||||
void TransactionTableModel::subscribeToCoreSignals()
|
||||
{
|
||||
// Connect signals to wallet
|
||||
wallet->NotifyTransactionChanged.connect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3));
|
||||
wallet->ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
|
||||
m_handler_transaction_changed = walletModel->wallet().handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, _1, _2));
|
||||
m_handler_show_progress = walletModel->wallet().handleShowProgress(boost::bind(ShowProgress, this, _1, _2));
|
||||
}
|
||||
|
||||
void TransactionTableModel::unsubscribeFromCoreSignals()
|
||||
{
|
||||
// Disconnect signals from wallet
|
||||
wallet->NotifyTransactionChanged.disconnect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3));
|
||||
wallet->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
|
||||
m_handler_transaction_changed->disconnect();
|
||||
m_handler_show_progress->disconnect();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user