From 76c2781505bd4e97b64b737ce700ef28ba9058be Mon Sep 17 00:00:00 2001 From: Steven Barclay Date: Wed, 8 Mar 2023 17:18:54 +0800 Subject: [PATCH] Short circuit confidence updates in DepositListItem Add a 'lazyFields' volatile field to DepositListItem to detect initialisation of the associated memoised 'LazyFields' supplier, allowing confidence updates to be short-circuited when the corresponding indicator has not yet been lazily loaded. This is for consistency with the 'LazyFields' logic just added to TxConfidenceListItem and should make the UI more responsive if a new block arrives when the funds deposit list is in view, by avoiding the entire list of item tooltips & confidence indicators from being force- initialised. --- .../main/funds/deposit/DepositListItem.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/funds/deposit/DepositListItem.java b/desktop/src/main/java/bisq/desktop/main/funds/deposit/DepositListItem.java index 722b5a8c8b..f229c49efd 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/deposit/DepositListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/deposit/DepositListItem.java @@ -53,10 +53,11 @@ class DepositListItem implements FilterableListItem { private Coin balanceAsCoin; private final String addressString; private String usage = "-"; - private TxConfidenceListener txConfidenceListener; - private BalanceListener balanceListener; + private final TxConfidenceListener txConfidenceListener; + private final BalanceListener balanceListener; private int numTxOutputs = 0; private final Supplier lazyFieldsSupplier; + private volatile LazyFields lazyFields; private static class LazyFields { TxConfidenceIndicator txConfidenceIndicator; @@ -82,19 +83,21 @@ class DepositListItem implements FilterableListItem { tooltip = new Tooltip(Res.get("shared.notUsedYet")); txConfidenceIndicator.setProgress(0); txConfidenceIndicator.setTooltip(tooltip); - if (confidence != null) { - GUIUtil.updateConfidence(confidence, tooltip, txConfidenceIndicator); - } + + lazyFields = this; + updateConfidence(confidence); }}); if (confidence != null) { txConfidenceListener = new TxConfidenceListener(confidence.getTransactionHash().toString()) { @Override public void onTransactionConfidenceChanged(TransactionConfidence confidence) { - GUIUtil.updateConfidence(confidence, lazy().tooltip, lazy().txConfidenceIndicator); + updateConfidence(confidence); } }; walletService.addTxConfidenceListener(txConfidenceListener); + } else { + txConfidenceListener = null; } balanceListener = new BalanceListener(address) { @@ -102,8 +105,7 @@ class DepositListItem implements FilterableListItem { public void onBalanceChanged(Coin balanceAsCoin, Transaction tx) { DepositListItem.this.balanceAsCoin = balanceAsCoin; DepositListItem.this.balance.set(formatter.formatCoin(balanceAsCoin)); - var confidence = walletService.getConfidenceForTxId(tx.getTxId().toString()); - GUIUtil.updateConfidence(confidence, lazy().tooltip, lazy().txConfidenceIndicator); + updateConfidence(walletService.getConfidenceForTxId(tx.getTxId().toString())); updateUsage(address); } }; @@ -115,6 +117,12 @@ class DepositListItem implements FilterableListItem { updateUsage(address); } + private void updateConfidence(TransactionConfidence confidence) { + if (confidence != null && lazyFields != null) { + GUIUtil.updateConfidence(confidence, lazyFields.tooltip, lazyFields.txConfidenceIndicator); + } + } + private void updateUsage(Address address) { numTxOutputs = walletService.getNumTxOutputsForAddress(address); usage = numTxOutputs == 0 ? Res.get("funds.deposit.unused") : Res.get("funds.deposit.usedInTx", numTxOutputs);