diff --git a/electrum/gui/qml/qeaddresslistmodel.py b/electrum/gui/qml/qeaddresslistmodel.py index 43ffbddb0..f07186af7 100644 --- a/electrum/gui/qml/qeaddresslistmodel.py +++ b/electrum/gui/qml/qeaddresslistmodel.py @@ -7,6 +7,7 @@ from electrum.logging import get_logger from electrum.util import Satoshis from .qetypes import QEAmount +from .util import qt_event_listener, QtEventListener if TYPE_CHECKING: from electrum.wallet import Abstract_Wallet @@ -102,7 +103,7 @@ class QEAddressCoinFilterProxyModel(QSortFilterProxyModel): self.filterTextChanged.emit() -class QEAddressCoinListModel(QAbstractListModel): +class QEAddressCoinListModel(QAbstractListModel, QtEventListener): _logger = get_logger(__name__) # define listmodel rolemap @@ -118,9 +119,20 @@ class QEAddressCoinListModel(QAbstractListModel): self._items = [] self._filterModel = None + self.register_callbacks() + self.destroyed.connect(lambda: self.on_destroy()) + self._dirty = True self.initModel() + def on_destroy(self): + self.unregister_callbacks() + + @qt_event_listener + def on_event_labels_received(self, wallet, labels): + if wallet == self.wallet: + self.setDirty() + def rowCount(self, index): return len(self._items) @@ -185,8 +197,9 @@ class QEAddressCoinListModel(QAbstractListModel): # initial model data @pyqtSlot() - def initModel(self): - if not self._dirty: + @pyqtSlot(bool) + def initModel(self, force: bool = False): + if not self._dirty and not force: return r_addresses = self.wallet.get_receiving_addresses() diff --git a/electrum/gui/qml/qetransactionlistmodel.py b/electrum/gui/qml/qetransactionlistmodel.py index 9de352ba1..c177fbfd1 100644 --- a/electrum/gui/qml/qetransactionlistmodel.py +++ b/electrum/gui/qml/qetransactionlistmodel.py @@ -81,6 +81,11 @@ class QETransactionListModel(QAbstractListModel, QtEventListener): roles = [self._ROLE_RMAP['date']] self.dataChanged.emit(index, index, roles) + @qt_event_listener + def on_event_labels_received(self, wallet, labels): + if wallet == self.wallet: + self.initModel(True) # TODO: be less dramatic + def rowCount(self, index): return len(self.tx_history) diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index 6febc387b..2f4b5fe68 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -72,7 +72,6 @@ class QEWallet(AuthMixin, QObject, QtEventListener): saveTxSuccess = pyqtSignal([str], arguments=['txid']) saveTxError = pyqtSignal([str, str, str], arguments=['txid', 'code', 'message']) importChannelBackupFailed = pyqtSignal([str], arguments=['message']) - labelsUpdated = pyqtSignal() otpRequested = pyqtSignal() otpSuccess = pyqtSignal() otpFailed = pyqtSignal([str, str], arguments=['code', 'message']) diff --git a/electrum/plugins/labels/labels.py b/electrum/plugins/labels/labels.py index 9d9d63233..20e9946e9 100644 --- a/electrum/plugins/labels/labels.py +++ b/electrum/plugins/labels/labels.py @@ -7,6 +7,7 @@ from typing import Union, TYPE_CHECKING import base64 +from electrum import util from electrum.plugin import BasePlugin, hook from electrum.crypto import aes_encrypt_with_iv, aes_decrypt_with_iv from electrum.i18n import _ @@ -140,7 +141,7 @@ class LabelsPlugin(BasePlugin): if response["labels"] is None or len(response["labels"]) == 0: self.logger.info('no new labels') return - #self.logger.debug(f"labels received {response!r}") + self.logger.info(f'received {len(response["labels"])} labels') result = {} for label in response["labels"]: @@ -159,14 +160,14 @@ class LabelsPlugin(BasePlugin): result[key] = value for key, value in result.items(): - if force or not wallet._get_label(key): - wallet._set_label(key, value) + wallet._set_label(key, value) self.set_nonce(wallet, response["nonce"] + 1) + util.trigger_callback('labels_received', wallet, result) self.on_pulled(wallet) def on_pulled(self, wallet: 'Abstract_Wallet') -> None: - raise NotImplementedError() + pass @ignore_exceptions @log_exceptions diff --git a/electrum/plugins/labels/qml.py b/electrum/plugins/labels/qml.py index b6045d8a0..fd20c5b9e 100644 --- a/electrum/plugins/labels/qml.py +++ b/electrum/plugins/labels/qml.py @@ -113,11 +113,8 @@ class Plugin(LabelsPlugin): threading.Thread(target=pull_thread, args=[wallet]).start() def on_pulled(self, wallet): - self.logger.info('on pulled') _wallet = QEWallet.getInstanceFor(wallet) self.logger.debug('wallet ' + ('found' if _wallet else 'not found')) - if _wallet: - _wallet.labelsUpdated.emit() @hook def init_qml(self, app):