From 291f0ce2359c9f01a680600f97447c78f2b17af6 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Tue, 16 Jan 2024 15:56:49 +0100 Subject: [PATCH] qml: handle exception more gracefully when attempting to delete last address from imported wallet --- electrum/gui/qml/components/AddressDetails.qml | 14 +++++++++++--- electrum/gui/qml/qeaddressdetails.py | 12 +++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/electrum/gui/qml/components/AddressDetails.qml b/electrum/gui/qml/components/AddressDetails.qml index 9093a8cf4..0c6830f00 100644 --- a/electrum/gui/qml/components/AddressDetails.qml +++ b/electrum/gui/qml/components/AddressDetails.qml @@ -315,9 +315,11 @@ Pane { yesno: true }) confirmdialog.accepted.connect(function () { - addressdetails.deleteAddress() - addressDeleted() - app.stack.pop() + var success = addressdetails.deleteAddress() + if (success) { + addressDeleted() + app.stack.pop() + } }) confirmdialog.open() } @@ -335,5 +337,11 @@ Pane { onAuthRequired: (method, authMessage) => { app.handleAuthRequired(addressdetails, method, authMessage) } + onAddressDeleteFailed: (message) => { + var dialog = app.messageDialog.createObject(root, { + text: message + }) + dialog.open() + } } } diff --git a/electrum/gui/qml/qeaddressdetails.py b/electrum/gui/qml/qeaddressdetails.py index 4fe3b9844..26c9889c1 100644 --- a/electrum/gui/qml/qeaddressdetails.py +++ b/electrum/gui/qml/qeaddressdetails.py @@ -1,6 +1,7 @@ from PyQt6.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from electrum.logging import get_logger +from electrum.util import UserFacingException from .auth import auth_protect, AuthMixin from .qetransactionlistmodel import QETransactionListModel @@ -12,6 +13,7 @@ class QEAddressDetails(AuthMixin, QObject): _logger = get_logger(__name__) detailsChanged = pyqtSignal() + addressDeleteFailed = pyqtSignal([str], arguments=['message']) def __init__(self, parent=None): super().__init__(parent) @@ -84,7 +86,6 @@ class QEAddressDetails(AuthMixin, QObject): def canDelete(self): return self._candelete - frozenChanged = pyqtSignal() @pyqtProperty(bool, notify=frozenChanged) def isFrozen(self): @@ -131,10 +132,15 @@ class QEAddressDetails(AuthMixin, QObject): self.detailsChanged.emit() - @pyqtSlot() + @pyqtSlot(result=bool) def deleteAddress(self): assert self.canDelete - self._wallet.wallet.delete_address(self._address) + try: + self._wallet.wallet.delete_address(self._address) + except UserFacingException as e: + self.addressDeleteFailed.emit(str(e)) + return False + return True def update(self): if self._wallet is None: