Browse Source

qml: split updating userinfo from determine_can_pay, check determine_can_pay also in event handlers

master
Sander van Grieken 3 years ago
parent
commit
d064b38f1c
  1. 62
      electrum/gui/qml/qeinvoice.py

62
electrum/gui/qml/qeinvoice.py

@ -170,12 +170,14 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
def on_event_payment_succeeded(self, wallet, key): def on_event_payment_succeeded(self, wallet, key):
if wallet == self._wallet.wallet and key == self.key: if wallet == self._wallet.wallet and key == self.key:
self.statusChanged.emit() self.statusChanged.emit()
self.determine_can_pay()
self.userinfo = _('Paid!') self.userinfo = _('Paid!')
@event_listener @event_listener
def on_event_payment_failed(self, wallet, key, reason): def on_event_payment_failed(self, wallet, key, reason):
if wallet == self._wallet.wallet and key == self.key: if wallet == self._wallet.wallet and key == self.key:
self.statusChanged.emit() self.statusChanged.emit()
self.determine_can_pay()
self.userinfo = _('Payment failed: ') + reason self.userinfo = _('Payment failed: ') + reason
@event_listener @event_listener
@ -183,6 +185,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
if wallet == self._wallet.wallet and key == self.key: if wallet == self._wallet.wallet and key == self.key:
self.statusChanged.emit() self.statusChanged.emit()
if status in [PR_INFLIGHT, PR_ROUTING]: if status in [PR_INFLIGHT, PR_ROUTING]:
self.determine_can_pay()
self.userinfo = _('In progress...') self.userinfo = _('In progress...')
@pyqtProperty(int, notify=invoiceChanged) @pyqtProperty(int, notify=invoiceChanged)
@ -231,6 +234,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
if self._effectiveInvoice: if self._effectiveInvoice:
self._effectiveInvoice.amount_msat = '!' if new_amount.isMax else int(new_amount.satsInt * 1000) self._effectiveInvoice.amount_msat = '!' if new_amount.isMax else int(new_amount.satsInt * 1000)
self.update_userinfo()
self.determine_can_pay() self.determine_can_pay()
self.invoiceChanged.emit() self.invoiceChanged.emit()
@ -242,12 +246,11 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
def amountOverride(self, new_amount): def amountOverride(self, new_amount):
self._logger.debug(f'set new override amount {repr(new_amount)}') self._logger.debug(f'set new override amount {repr(new_amount)}')
self._amountOverride.copyFrom(new_amount) self._amountOverride.copyFrom(new_amount)
self.determine_can_pay()
self.amountOverrideChanged.emit() self.amountOverrideChanged.emit()
@pyqtSlot() @pyqtSlot()
def _on_amountoverride_value_changed(self): def _on_amountoverride_value_changed(self):
self.update_userinfo()
self.determine_can_pay() self.determine_can_pay()
@pyqtProperty('quint64', notify=invoiceChanged) @pyqtProperty('quint64', notify=invoiceChanged)
@ -338,6 +341,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
self.set_lnprops() self.set_lnprops()
self.update_userinfo()
self.determine_can_pay() self.determine_can_pay()
self.invoiceChanged.emit() self.invoiceChanged.emit()
@ -353,6 +357,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
self._timer.setInterval(interval) # msec self._timer.setInterval(interval) # msec
self._timer.start() self._timer.start()
else: else:
self.update_userinfo()
self.determine_can_pay() # status went to PR_EXPIRED self.determine_can_pay() # status went to PR_EXPIRED
@pyqtSlot() @pyqtSlot()
@ -360,9 +365,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
self.statusChanged.emit() self.statusChanged.emit()
self.set_status_timer() self.set_status_timer()
def determine_can_pay(self): def update_userinfo(self):
self.canPay = False
self.canSave = False
self.userinfo = '' self.userinfo = ''
if not self.amountOverride.isEmpty: if not self.amountOverride.isEmpty:
@ -370,8 +373,6 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
else: else:
amount = self.amount amount = self.amount
self.canSave = True
if self.amount.isEmpty: if self.amount.isEmpty:
self.userinfo = _('Enter the amount you want to send') self.userinfo = _('Enter the amount you want to send')
@ -384,13 +385,9 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
lnaddr = self._effectiveInvoice._lnaddr lnaddr = self._effectiveInvoice._lnaddr
if lnaddr.amount and amount.satsInt < lnaddr.amount * COIN: if lnaddr.amount and amount.satsInt < lnaddr.amount * COIN:
self.userinfo = _('Cannot pay less than the amount specified in the invoice') self.userinfo = _('Cannot pay less than the amount specified in the invoice')
else: elif self.address and self.get_max_spendable_onchain() < amount.satsInt:
self.canPay = True
elif self.address and self.get_max_spendable_onchain() > amount.satsInt:
# TODO: validate address? # TODO: validate address?
# TODO: subtract fee? # TODO: subtract fee?
self.canPay = True
else:
self.userinfo = _('Insufficient balance') self.userinfo = _('Insufficient balance')
else: else:
self.userinfo = { self.userinfo = {
@ -402,13 +399,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
}[self.status] }[self.status]
elif self.invoiceType == QEInvoice.Type.OnchainInvoice: elif self.invoiceType == QEInvoice.Type.OnchainInvoice:
if self.status in [PR_UNPAID, PR_FAILED]: if self.status in [PR_UNPAID, PR_FAILED]:
if amount.isMax and self.get_max_spendable_onchain() > 0: if not ((amount.isMax and self.get_max_spendable_onchain() > 0) or (self.get_max_spendable_onchain() >= amount.satsInt)):
# TODO: dust limit?
self.canPay = True
elif self.get_max_spendable_onchain() >= amount.satsInt:
# TODO: subtract fee?
self.canPay = True
else:
self.userinfo = _('Insufficient balance') self.userinfo = _('Insufficient balance')
else: else:
self.userinfo = { self.userinfo = {
@ -418,6 +409,39 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
PR_UNKNOWN: _('Invoice has unknown status'), PR_UNKNOWN: _('Invoice has unknown status'),
}[self.status] }[self.status]
def determine_can_pay(self):
self.canPay = False
self.canSave = False
if not self.amountOverride.isEmpty:
amount = self.amountOverride
else:
amount = self.amount
self.canSave = True
if amount.isEmpty and self.status == PR_UNPAID: # unspecified amount
return
if self.invoiceType == QEInvoice.Type.LightningInvoice:
if self.status in [PR_UNPAID, PR_FAILED]:
if self.get_max_spendable_lightning() >= amount.satsInt:
lnaddr = self._effectiveInvoice._lnaddr
if not (lnaddr.amount and amount.satsInt < lnaddr.amount * COIN):
self.canPay = True
elif self.address and self.get_max_spendable_onchain() > amount.satsInt:
# TODO: validate address?
# TODO: subtract fee?
self.canPay = True
elif self.invoiceType == QEInvoice.Type.OnchainInvoice:
if self.status in [PR_UNPAID, PR_FAILED]:
if amount.isMax and self.get_max_spendable_onchain() > 0:
# TODO: dust limit?
self.canPay = True
elif self.get_max_spendable_onchain() >= amount.satsInt:
# TODO: subtract fee?
self.canPay = True
def setValidOnchainInvoice(self, invoice: Invoice): def setValidOnchainInvoice(self, invoice: Invoice):
self._logger.debug('setValidOnchainInvoice') self._logger.debug('setValidOnchainInvoice')
if invoice.is_lightning(): if invoice.is_lightning():

Loading…
Cancel
Save