mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Don't show individual messages for each TX when too many come in at once (#3170)
This avoids locking up the whole Desktop on some systems where messages are sent through DBUS. Instead of showing each message, we'll now consolidate all TXs into a single message when more then 9 arrive at once (in 100ms).
This commit is contained in:
parent
589c892506
commit
0d1a049059
@ -275,6 +275,10 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
|
|||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
m_app_nap_inhibitor = new CAppNapInhibitor;
|
m_app_nap_inhibitor = new CAppNapInhibitor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
incomingTransactionsTimer = new QTimer(this);
|
||||||
|
incomingTransactionsTimer->setSingleShot(true);
|
||||||
|
connect(incomingTransactionsTimer, SIGNAL(timeout()), SLOT(showIncomingTransactions()));
|
||||||
}
|
}
|
||||||
|
|
||||||
BitcoinGUI::~BitcoinGUI()
|
BitcoinGUI::~BitcoinGUI()
|
||||||
@ -1248,16 +1252,83 @@ void BitcoinGUI::showEvent(QShowEvent *event)
|
|||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
void BitcoinGUI::incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address, const QString& label)
|
void BitcoinGUI::incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address, const QString& label)
|
||||||
{
|
{
|
||||||
// On new transaction, make an info balloon
|
IncomingTransactionMessage itx = {
|
||||||
QString msg = tr("Date: %1\n").arg(date) +
|
date, unit, amount, type, address, label
|
||||||
tr("Amount: %1\n").arg(BitcoinUnits::formatWithUnit(unit, amount, true)) +
|
};
|
||||||
tr("Type: %1\n").arg(type);
|
incomingTransactions.emplace_back(itx);
|
||||||
if (!label.isEmpty())
|
|
||||||
msg += tr("Label: %1\n").arg(label);
|
if (incomingTransactions.size() == 1) {
|
||||||
else if (!address.isEmpty())
|
// first TX since we last showed pending messages, let's wait 100ms and then show each individual message
|
||||||
msg += tr("Address: %1\n").arg(address);
|
incomingTransactionsTimer->start(100);
|
||||||
message((amount)<0 ? tr("Sent transaction") : tr("Incoming transaction"),
|
} else if (incomingTransactions.size() == 10) {
|
||||||
msg, CClientUIInterface::MSG_INFORMATION);
|
// we seem to have received 10 TXs in 100ms and we can expect even more, so let's pause for 1 sec and
|
||||||
|
// show a "Multiple TXs sent/received!" message instead of individual messages
|
||||||
|
incomingTransactionsTimer->start(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void BitcoinGUI::showIncomingTransactions()
|
||||||
|
{
|
||||||
|
auto txs = std::move(this->incomingTransactions);
|
||||||
|
|
||||||
|
if (txs.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (txs.size() >= 100) {
|
||||||
|
// Show one balloon for all transactions instead of showing one for each individual one
|
||||||
|
// (which would kill some systems)
|
||||||
|
|
||||||
|
CAmount sentAmount = 0;
|
||||||
|
CAmount receivedAmount = 0;
|
||||||
|
int sentCount = 0;
|
||||||
|
int receivedCount = 0;
|
||||||
|
for (auto& itx : txs) {
|
||||||
|
if (itx.amount < 0) {
|
||||||
|
sentAmount += itx.amount;
|
||||||
|
sentCount++;
|
||||||
|
} else {
|
||||||
|
receivedAmount += itx.amount;
|
||||||
|
receivedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString title;
|
||||||
|
if (sentCount > 0 && receivedCount > 0) {
|
||||||
|
title = tr("Received and sent multiple transactions");
|
||||||
|
} else if (sentCount > 0) {
|
||||||
|
title = tr("Sent multiple transactions");
|
||||||
|
} else if (receivedCount > 0) {
|
||||||
|
title = tr("Received multiple transactions");
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use display unit of last entry
|
||||||
|
int unit = txs.back().unit;
|
||||||
|
|
||||||
|
QString msg;
|
||||||
|
if (sentCount > 0) {
|
||||||
|
msg += tr("Sent Amount: %1\n").arg(BitcoinUnits::formatWithUnit(unit, sentAmount, true));
|
||||||
|
}
|
||||||
|
if (receivedCount > 0) {
|
||||||
|
msg += tr("Received Amount: %1\n").arg(BitcoinUnits::formatWithUnit(unit, receivedAmount, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
message(title, msg, CClientUIInterface::MSG_INFORMATION);
|
||||||
|
} else {
|
||||||
|
for (auto& itx : txs) {
|
||||||
|
// On new transaction, make an info balloon
|
||||||
|
QString msg = tr("Date: %1\n").arg(itx.date) +
|
||||||
|
tr("Amount: %1\n").arg(BitcoinUnits::formatWithUnit(itx.unit, itx.amount, true)) +
|
||||||
|
tr("Type: %1\n").arg(itx.type);
|
||||||
|
if (!itx.label.isEmpty())
|
||||||
|
msg += tr("Label: %1\n").arg(itx.label);
|
||||||
|
else if (!itx.address.isEmpty())
|
||||||
|
msg += tr("Address: %1\n").arg(itx.address);
|
||||||
|
message((itx.amount)<0 ? tr("Sent transaction") : tr("Incoming transaction"),
|
||||||
|
msg, CClientUIInterface::MSG_INFORMATION);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
|
@ -145,6 +145,17 @@ private:
|
|||||||
|
|
||||||
const PlatformStyle *platformStyle;
|
const PlatformStyle *platformStyle;
|
||||||
|
|
||||||
|
struct IncomingTransactionMessage {
|
||||||
|
QString date;
|
||||||
|
int unit;
|
||||||
|
CAmount amount;
|
||||||
|
QString type;
|
||||||
|
QString address;
|
||||||
|
QString label;
|
||||||
|
};
|
||||||
|
std::list<IncomingTransactionMessage> incomingTransactions;
|
||||||
|
QTimer* incomingTransactionsTimer;
|
||||||
|
|
||||||
/** Create the main UI actions. */
|
/** Create the main UI actions. */
|
||||||
void createActions();
|
void createActions();
|
||||||
/** Create the menu bar and sub-menus. */
|
/** Create the menu bar and sub-menus. */
|
||||||
@ -213,6 +224,7 @@ public Q_SLOTS:
|
|||||||
|
|
||||||
/** Show incoming transaction notification for new transactions. */
|
/** Show incoming transaction notification for new transactions. */
|
||||||
void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address, const QString& label);
|
void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address, const QString& label);
|
||||||
|
void showIncomingTransactions();
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
|
Loading…
Reference in New Issue
Block a user