Browse Source

Merge pull request #8675 from accumulator/address_delete

qml: implement delete address for imported wallets
master
ThomasV 2 years ago committed by GitHub
parent
commit
de0dc93a9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 28
      electrum/gui/qml/components/AddressDetails.qml
  2. 4
      electrum/gui/qml/components/Addresses.qml
  3. 11
      electrum/gui/qml/qeaddressdetails.py
  4. 18
      electrum/gui/qml/qeaddresslistmodel.py
  5. 4
      electrum/gui/qml/qewallet.py
  6. 3
      electrum/wallet.py

28
electrum/gui/qml/components/AddressDetails.qml

@ -16,6 +16,7 @@ Pane {
property string address property string address
signal addressDetailsChanged signal addressDetailsChanged
signal addressDeleted
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
@ -192,6 +193,7 @@ Pane {
Label { Label {
Layout.columnSpan: 2 Layout.columnSpan: 2
Layout.topMargin: constants.paddingSmall Layout.topMargin: constants.paddingSmall
visible: addressdetails.pubkeys.length
text: qsTr('Public keys') text: qsTr('Public keys')
color: Material.accentColor color: Material.accentColor
} }
@ -215,9 +217,10 @@ Pane {
icon.source: '../../icons/share.png' icon.source: '../../icons/share.png'
enabled: modelData enabled: modelData
onClicked: { onClicked: {
var dialog = app.genericShareDialog.createObject(root, var dialog = app.genericShareDialog.createObject(root, {
{ title: qsTr('Public key'), text: modelData } title: qsTr('Public key'),
) text: modelData
})
dialog.open() dialog.open()
} }
} }
@ -301,6 +304,25 @@ Pane {
dialog.open() 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'
}
} }
} }

4
electrum/gui/qml/components/Addresses.qml

@ -176,6 +176,10 @@ Pane {
// update listmodel when details change // update listmodel when details change
listview.backingModel.updateAddress(model.address) listview.backingModel.updateAddress(model.address)
}) })
page.addressDeleted.connect(function() {
// update listmodel when address removed
listview.backingModel.deleteAddress(model.address)
})
} else { } else {
loader.toggle() loader.toggle()
} }

11
electrum/gui/qml/qeaddressdetails.py

@ -28,6 +28,7 @@ class QEAddressDetails(AuthMixin, QObject):
self._privkey = None self._privkey = None
self._derivationPath = None self._derivationPath = None
self._numtx = 0 self._numtx = 0
self._candelete = False
self._historyModel = None self._historyModel = None
@ -79,6 +80,10 @@ class QEAddressDetails(AuthMixin, QObject):
def numTx(self): def numTx(self):
return self._numtx return self._numtx
@pyqtProperty(bool, notify=detailsChanged)
def canDelete(self):
return self._candelete
frozenChanged = pyqtSignal() frozenChanged = pyqtSignal()
@pyqtProperty(bool, notify=frozenChanged) @pyqtProperty(bool, notify=frozenChanged)
@ -126,6 +131,11 @@ class QEAddressDetails(AuthMixin, QObject):
self.detailsChanged.emit() self.detailsChanged.emit()
@pyqtSlot()
def deleteAddress(self):
assert self.canDelete
self._wallet.wallet.delete_address(self._address)
def update(self): def update(self):
if self._wallet is None: if self._wallet is None:
self._logger.error('wallet undefined') self._logger.error('wallet undefined')
@ -143,4 +153,5 @@ class QEAddressDetails(AuthMixin, QObject):
if self._wallet.derivationPrefix: if self._wallet.derivationPrefix:
self._derivationPath = self._derivationPath.replace('m', 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._numtx = self._wallet.wallet.adb.get_address_history_len(self._address)
self._candelete = self.wallet.wallet.can_delete_address()
self.detailsChanged.emit() self.detailsChanged.emit()

18
electrum/gui/qml/qeaddresslistmodel.py

@ -216,6 +216,9 @@ class QEAddressCoinListModel(QAbstractListModel):
self._dirty = False self._dirty = False
if self._filterModel is not None:
self._filterModel.invalidate()
@pyqtSlot(str) @pyqtSlot(str)
def updateAddress(self, address): def updateAddress(self, address):
for i, a in enumerate(self._items): for i, a in enumerate(self._items):
@ -223,6 +226,21 @@ class QEAddressCoinListModel(QAbstractListModel):
self.do_update(i, a) self.do_update(i, a)
return 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): def updateCoin(self, outpoint):
for i, a in enumerate(self._items): for i, a in enumerate(self._items):
if a.get('outpoint') == outpoint: if a.get('outpoint') == outpoint:

4
electrum/gui/qml/qewallet.py

@ -709,11 +709,15 @@ class QEWallet(AuthMixin, QObject, QtEventListener):
@pyqtSlot(str) @pyqtSlot(str)
def importAddresses(self, addresslist): def importAddresses(self, addresslist):
self.wallet.import_addresses(addresslist.split()) self.wallet.import_addresses(addresslist.split())
if self._addressCoinModel:
self._addressCoinModel.setDirty()
self.dataChanged.emit() self.dataChanged.emit()
@pyqtSlot(str) @pyqtSlot(str)
def importPrivateKeys(self, keyslist): def importPrivateKeys(self, keyslist):
self.wallet.import_private_keys(keyslist.split(), self.password) self.wallet.import_private_keys(keyslist.split(), self.password)
if self._addressCoinModel:
self._addressCoinModel.setDirty()
self.dataChanged.emit() self.dataChanged.emit()
@pyqtSlot(str) @pyqtSlot(str)

3
electrum/wallet.py

@ -3127,7 +3127,8 @@ class Simple_Wallet(Abstract_Wallet):
pass pass
def get_public_keys(self, address: str) -> Sequence[str]: 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): class Imported_Wallet(Simple_Wallet):

Loading…
Cancel
Save