diff --git a/electrum/gui/qml/components/AddressDetails.qml b/electrum/gui/qml/components/AddressDetails.qml index 2c7ab2ef4..9093a8cf4 100644 --- a/electrum/gui/qml/components/AddressDetails.qml +++ b/electrum/gui/qml/components/AddressDetails.qml @@ -16,6 +16,7 @@ Pane { property string address signal addressDetailsChanged + signal addressDeleted ColumnLayout { anchors.fill: parent @@ -192,6 +193,7 @@ Pane { Label { Layout.columnSpan: 2 Layout.topMargin: constants.paddingSmall + visible: addressdetails.pubkeys.length text: qsTr('Public keys') color: Material.accentColor } @@ -215,9 +217,10 @@ Pane { icon.source: '../../icons/share.png' enabled: modelData onClicked: { - var dialog = app.genericShareDialog.createObject(root, - { title: qsTr('Public key'), text: modelData } - ) + var dialog = app.genericShareDialog.createObject(root, { + title: qsTr('Public key'), + text: modelData + }) dialog.open() } } @@ -301,6 +304,25 @@ Pane { dialog.open() } } + FlatButton { + Layout.fillWidth: true + Layout.preferredWidth: 1 + visible: addressdetails.canDelete + text: qsTr('Delete') + onClicked: { + var confirmdialog = app.messageDialog.createObject(root, { + text: qsTr('Are you sure you want to delete this address from the wallet?'), + yesno: true + }) + confirmdialog.accepted.connect(function () { + addressdetails.deleteAddress() + addressDeleted() + app.stack.pop() + }) + confirmdialog.open() + } + icon.source: '../../icons/delete.png' + } } } diff --git a/electrum/gui/qml/components/Addresses.qml b/electrum/gui/qml/components/Addresses.qml index 26e5b2158..04c68de29 100644 --- a/electrum/gui/qml/components/Addresses.qml +++ b/electrum/gui/qml/components/Addresses.qml @@ -176,6 +176,10 @@ Pane { // update listmodel when details change listview.backingModel.updateAddress(model.address) }) + page.addressDeleted.connect(function() { + // update listmodel when address removed + listview.backingModel.deleteAddress(model.address) + }) } else { loader.toggle() } diff --git a/electrum/gui/qml/qeaddressdetails.py b/electrum/gui/qml/qeaddressdetails.py index 1c399cddc..4fe3b9844 100644 --- a/electrum/gui/qml/qeaddressdetails.py +++ b/electrum/gui/qml/qeaddressdetails.py @@ -28,6 +28,7 @@ class QEAddressDetails(AuthMixin, QObject): self._privkey = None self._derivationPath = None self._numtx = 0 + self._candelete = False self._historyModel = None @@ -79,6 +80,10 @@ class QEAddressDetails(AuthMixin, QObject): def numTx(self): return self._numtx + @pyqtProperty(bool, notify=detailsChanged) + def canDelete(self): + return self._candelete + frozenChanged = pyqtSignal() @pyqtProperty(bool, notify=frozenChanged) @@ -126,6 +131,11 @@ class QEAddressDetails(AuthMixin, QObject): self.detailsChanged.emit() + @pyqtSlot() + def deleteAddress(self): + assert self.canDelete + self._wallet.wallet.delete_address(self._address) + def update(self): if self._wallet is None: self._logger.error('wallet undefined') @@ -143,4 +153,5 @@ class QEAddressDetails(AuthMixin, QObject): if self._wallet.derivationPrefix: self._derivationPath = self._derivationPath.replace('m', self._wallet.derivationPrefix) self._numtx = self._wallet.wallet.adb.get_address_history_len(self._address) + self._candelete = self.wallet.wallet.can_delete_address() self.detailsChanged.emit() diff --git a/electrum/gui/qml/qeaddresslistmodel.py b/electrum/gui/qml/qeaddresslistmodel.py index 00715f59a..43ffbddb0 100644 --- a/electrum/gui/qml/qeaddresslistmodel.py +++ b/electrum/gui/qml/qeaddresslistmodel.py @@ -216,6 +216,9 @@ class QEAddressCoinListModel(QAbstractListModel): self._dirty = False + if self._filterModel is not None: + self._filterModel.invalidate() + @pyqtSlot(str) def updateAddress(self, address): for i, a in enumerate(self._items): @@ -223,6 +226,21 @@ class QEAddressCoinListModel(QAbstractListModel): self.do_update(i, a) return + @pyqtSlot(str) + def deleteAddress(self, address): + first = -1 + last = -1 + for i, a in enumerate(self._items): + if a['address'] == address: + if first < 0: + first = i + last = i + if not first >= 0: + return + self.beginRemoveRows(QModelIndex(), first, last) + self._items = self._items[0:first] + self._items[last+1:] + self.endRemoveRows() + def updateCoin(self, outpoint): for i, a in enumerate(self._items): if a.get('outpoint') == outpoint: diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index 12f714b7c..daea2e8cf 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -709,11 +709,15 @@ class QEWallet(AuthMixin, QObject, QtEventListener): @pyqtSlot(str) def importAddresses(self, addresslist): self.wallet.import_addresses(addresslist.split()) + if self._addressCoinModel: + self._addressCoinModel.setDirty() self.dataChanged.emit() @pyqtSlot(str) def importPrivateKeys(self, keyslist): self.wallet.import_private_keys(keyslist.split(), self.password) + if self._addressCoinModel: + self._addressCoinModel.setDirty() self.dataChanged.emit() @pyqtSlot(str) diff --git a/electrum/wallet.py b/electrum/wallet.py index 42c7e990f..1594c0eda 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -3127,7 +3127,8 @@ class Simple_Wallet(Abstract_Wallet): pass def get_public_keys(self, address: str) -> Sequence[str]: - return [self.get_public_key(address)] + pk = self.get_public_key(address) + return [pk] if pk else [] class Imported_Wallet(Simple_Wallet):