-
Notifications
You must be signed in to change notification settings - Fork 267
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Early subscribe core signals in transaction table model #121
Changes from all commits
3bccd50
c6cbdf1
57785fb
cafef08
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -96,25 +96,29 @@ class TransactionTablePriv | |||||||
*/ | ||||||||
QList<TransactionRecord> cachedWallet; | ||||||||
|
||||||||
bool fQueueNotifications = false; | ||||||||
/** True when model finishes loading all wallet transactions on start */ | ||||||||
bool m_loaded = false; | ||||||||
/** True when transactions are being notified, for instance when scanning */ | ||||||||
bool m_loading = false; | ||||||||
std::vector< TransactionNotification > vQueueNotifications; | ||||||||
|
||||||||
void NotifyTransactionChanged(const uint256 &hash, ChangeType status); | ||||||||
void ShowProgress(const std::string &title, int nProgress); | ||||||||
void DispatchNotifications(); | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A doxygen comment? |
||||||||
|
||||||||
/* Query entire wallet anew from core. | ||||||||
*/ | ||||||||
void refreshWallet(interfaces::Wallet& wallet) | ||||||||
{ | ||||||||
qDebug() << "TransactionTablePriv::refreshWallet"; | ||||||||
promag marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
cachedWallet.clear(); | ||||||||
assert(!m_loaded); | ||||||||
{ | ||||||||
for (const auto& wtx : wallet.getWalletTxs()) { | ||||||||
if (TransactionRecord::showTransaction()) { | ||||||||
cachedWallet.append(TransactionRecord::decomposeTransaction(wtx)); | ||||||||
} | ||||||||
} | ||||||||
} | ||||||||
m_loaded = true; | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 3bccd50 nit, can drop extra brackets diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp
index 0175c88e7..8dc6d4c40 100644
--- a/src/qt/transactiontablemodel.cpp
+++ b/src/qt/transactiontablemodel.cpp
@@ -110,11 +110,9 @@ public:
void refreshWallet(interfaces::Wallet& wallet)
{
assert(!m_loaded);
- {
- for (const auto& wtx : wallet.getWalletTxs()) {
- if (TransactionRecord::showTransaction()) {
- cachedWallet.append(TransactionRecord::decomposeTransaction(wtx));
- }
+ for (const auto& wtx : wallet.getWalletTxs()) {
+ if (TransactionRecord::showTransaction()) {
+ cachedWallet.append(TransactionRecord::decomposeTransaction(wtx));
}
}
m_loaded = true; There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (similar to the change in the last commit, |
||||||||
DispatchNotifications(); | ||||||||
} | ||||||||
|
||||||||
/* Update our model of the wallet incrementally, to synchronize our model of the wallet | ||||||||
|
@@ -249,12 +253,12 @@ TransactionTableModel::TransactionTableModel(const PlatformStyle *_platformStyle | |||||||
fProcessingQueuedTransactions(false), | ||||||||
platformStyle(_platformStyle) | ||||||||
{ | ||||||||
subscribeToCoreSignals(); | ||||||||
|
||||||||
columns << QString() << QString() << tr("Date") << tr("Type") << tr("Label") << BitcoinUnits::getAmountColumnTitle(walletModel->getOptionsModel()->getDisplayUnit()); | ||||||||
priv->refreshWallet(walletModel->wallet()); | ||||||||
|
||||||||
connect(walletModel->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &TransactionTableModel::updateDisplayUnit); | ||||||||
|
||||||||
subscribeToCoreSignals(); | ||||||||
} | ||||||||
|
||||||||
TransactionTableModel::~TransactionTableModel() | ||||||||
|
@@ -719,44 +723,42 @@ void TransactionTablePriv::NotifyTransactionChanged(const uint256 &hash, ChangeT | |||||||
|
||||||||
TransactionNotification notification(hash, status, showTransaction); | ||||||||
|
||||||||
if (fQueueNotifications) | ||||||||
if (!m_loaded || m_loading) | ||||||||
{ | ||||||||
Comment on lines
+726
to
727
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. style nit:
Suggested change
|
||||||||
vQueueNotifications.push_back(notification); | ||||||||
return; | ||||||||
} | ||||||||
notification.invoke(parent); | ||||||||
} | ||||||||
|
||||||||
void TransactionTablePriv::ShowProgress(const std::string &title, int nProgress) | ||||||||
void TransactionTablePriv::DispatchNotifications() | ||||||||
{ | ||||||||
if (nProgress == 0) | ||||||||
fQueueNotifications = true; | ||||||||
if (!m_loaded || m_loading) return; | ||||||||
|
||||||||
if (nProgress == 100) | ||||||||
if (vQueueNotifications.size() > 10) { // prevent balloon spam, show maximum 10 balloons | ||||||||
bool invoked = QMetaObject::invokeMethod(parent, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, true)); | ||||||||
assert(invoked); | ||||||||
} | ||||||||
for (unsigned int i = 0; i < vQueueNotifications.size(); ++i) | ||||||||
{ | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. cafef08 nit, while removing the brackets in this commit could also diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp
index 0175c88e7..734605a47 100644
--- a/src/qt/transactiontablemodel.cpp
+++ b/src/qt/transactiontablemodel.cpp
@@ -739,8 +739,7 @@ void TransactionTablePriv::DispatchNotifications()
bool invoked = QMetaObject::invokeMethod(parent, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, true));
assert(invoked);
}
- for (unsigned int i = 0; i < vQueueNotifications.size(); ++i)
- {
+ for (unsigned int i = 0; i < vQueueNotifications.size(); ++i) { |
||||||||
fQueueNotifications = false; | ||||||||
if (vQueueNotifications.size() > 10) { // prevent balloon spam, show maximum 10 balloons | ||||||||
bool invoked = QMetaObject::invokeMethod(parent, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, true)); | ||||||||
if (vQueueNotifications.size() - i <= 10) { | ||||||||
bool invoked = QMetaObject::invokeMethod(parent, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, false)); | ||||||||
assert(invoked); | ||||||||
} | ||||||||
for (unsigned int i = 0; i < vQueueNotifications.size(); ++i) | ||||||||
{ | ||||||||
if (vQueueNotifications.size() - i <= 10) { | ||||||||
bool invoked = QMetaObject::invokeMethod(parent, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, false)); | ||||||||
assert(invoked); | ||||||||
} | ||||||||
|
||||||||
vQueueNotifications[i].invoke(parent); | ||||||||
} | ||||||||
vQueueNotifications.clear(); | ||||||||
vQueueNotifications[i].invoke(parent); | ||||||||
} | ||||||||
vQueueNotifications.clear(); | ||||||||
} | ||||||||
|
||||||||
void TransactionTableModel::subscribeToCoreSignals() | ||||||||
{ | ||||||||
// Connect signals to wallet | ||||||||
m_handler_transaction_changed = walletModel->wallet().handleTransactionChanged(std::bind(&TransactionTablePriv::NotifyTransactionChanged, priv, std::placeholders::_1, std::placeholders::_2)); | ||||||||
m_handler_show_progress = walletModel->wallet().handleShowProgress(std::bind(&TransactionTablePriv::ShowProgress, priv, std::placeholders::_1, std::placeholders::_2)); | ||||||||
m_handler_show_progress = walletModel->wallet().handleShowProgress([this](const std::string&, int progress) { | ||||||||
priv->m_loading = progress < 100; | ||||||||
priv->DispatchNotifications(); | ||||||||
}); | ||||||||
} | ||||||||
|
||||||||
void TransactionTableModel::unsubscribeFromCoreSignals() | ||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It could be just my bad English, but it seems should be "... are not being notified", no?
If I'm correct, maybe re-word the comment in positive one?
Or maybe we think about different notifications: (a) from the node vs (b) to a user?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, I'll rephrase.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In commit "qt: Refactor ShowProgress to DispatchNotifications" (c6cbdf1)
re: #121 (comment)
If you're still planning to update this, my attempt at a comment would be: "This will be true when blocks in the chain are being scanned for new transactions, and transaction notification popups should be suppressed until the scan is done. It can be true even after m_loaded is true if a rescan has been triggered." I think I would also call this
m_delay_notifications
instead ofm_loading
because it can be true whenm_loaded
is also true, but feel free to stick with whatever name you prefer.