From 3a22cb9c484975b85a48923f0129ef4197e0bb33 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Tue, 12 Dec 2023 16:24:13 +0100 Subject: [PATCH 1/2] labels: emit callback when labels received. write labels regardless if there's already a label set for an ID. --- electrum/gui/qml/qewallet.py | 1 - electrum/plugins/labels/labels.py | 9 +++++---- electrum/plugins/labels/qml.py | 3 --- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index 16236256b..c384630d8 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 a6dd40f2b..9d395658f 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 _ @@ -137,7 +138,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"]: @@ -156,14 +157,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): From 8ba7a00097fec96a2437e792484bf01095dc994a Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Tue, 12 Dec 2023 16:33:58 +0100 Subject: [PATCH 2/2] qml: update new labels in history and addresscoinlist --- electrum/gui/qml/qeaddresslistmodel.py | 19 ++++++++++++++++--- electrum/gui/qml/qetransactionlistmodel.py | 5 +++++ 2 files changed, 21 insertions(+), 3 deletions(-) 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)