TxEditor: rework update methods, separate _update_message from _update_send_button
This commit is contained in:
@@ -67,6 +67,9 @@ class TxEditor(WindowModalDialog):
|
|||||||
self.make_tx = make_tx
|
self.make_tx = make_tx
|
||||||
self.output_value = output_value
|
self.output_value = output_value
|
||||||
self.tx = None # type: Optional[PartialTransaction]
|
self.tx = None # type: Optional[PartialTransaction]
|
||||||
|
self.message = '' # set by side effect
|
||||||
|
self.error = '' # set by side effect
|
||||||
|
|
||||||
self.config = window.config
|
self.config = window.config
|
||||||
self.wallet = window.wallet
|
self.wallet = window.wallet
|
||||||
self.not_enough_funds = False
|
self.not_enough_funds = False
|
||||||
@@ -109,11 +112,14 @@ class TxEditor(WindowModalDialog):
|
|||||||
|
|
||||||
def timer_actions(self):
|
def timer_actions(self):
|
||||||
if self.needs_update:
|
if self.needs_update:
|
||||||
self.update_tx()
|
|
||||||
self.set_locktime()
|
|
||||||
self.update()
|
self.update()
|
||||||
self.needs_update = False
|
self.needs_update = False
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
self.update_tx()
|
||||||
|
self.set_locktime()
|
||||||
|
self._update_widgets()
|
||||||
|
|
||||||
def stop_editor_updates(self):
|
def stop_editor_updates(self):
|
||||||
self.main_window.gui_object.timer.timeout.disconnect(self.timer_actions)
|
self.main_window.gui_object.timer.timeout.disconnect(self.timer_actions)
|
||||||
|
|
||||||
@@ -127,6 +133,7 @@ class TxEditor(WindowModalDialog):
|
|||||||
self.config.set_key('fee_per_kb', fee_rate, False)
|
self.config.set_key('fee_per_kb', fee_rate, False)
|
||||||
|
|
||||||
def update_tx(self, *, fallback_to_zero_fee: bool = False):
|
def update_tx(self, *, fallback_to_zero_fee: bool = False):
|
||||||
|
# expected to set self.tx, self.message and self.error
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def update_fee_target(self):
|
def update_fee_target(self):
|
||||||
@@ -215,7 +222,9 @@ class TxEditor(WindowModalDialog):
|
|||||||
def trigger_update(self):
|
def trigger_update(self):
|
||||||
# set tx to None so that the ok button is disabled while we compute the new tx
|
# set tx to None so that the ok button is disabled while we compute the new tx
|
||||||
self.tx = None
|
self.tx = None
|
||||||
self.update()
|
self.message = ''
|
||||||
|
self.error = ''
|
||||||
|
self._update_widgets()
|
||||||
self.needs_update = True
|
self.needs_update = True
|
||||||
|
|
||||||
def fee_slider_callback(self, dyn, pos, fee_rate):
|
def fee_slider_callback(self, dyn, pos, fee_rate):
|
||||||
@@ -447,47 +456,40 @@ class TxEditor(WindowModalDialog):
|
|||||||
self.is_preview = True
|
self.is_preview = True
|
||||||
self.accept()
|
self.accept()
|
||||||
|
|
||||||
def toggle_send_button(self, enable: bool, *, message: str = None):
|
def _update_widgets(self):
|
||||||
if message is None:
|
|
||||||
self.message_label.setStyleSheet(None)
|
|
||||||
self.message_label.setText(' ')
|
|
||||||
else:
|
|
||||||
self.message_label.setStyleSheet(ColorScheme.RED.as_stylesheet())
|
|
||||||
self.message_label.setText(message)
|
|
||||||
|
|
||||||
self.preview_button.setEnabled(enable)
|
|
||||||
self.ok_button.setEnabled(enable)
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
tx = self.tx
|
|
||||||
self._update_amount_label()
|
self._update_amount_label()
|
||||||
if self.not_enough_funds:
|
if self.not_enough_funds:
|
||||||
text = self.main_window.send_tab.get_text_not_enough_funds_mentioning_frozen()
|
self.error = self.main_window.send_tab.get_text_not_enough_funds_mentioning_frozen()
|
||||||
self.toggle_send_button(False, message=text)
|
if not self.tx:
|
||||||
return
|
|
||||||
if not tx:
|
|
||||||
self.toggle_send_button(False)
|
|
||||||
self.set_feerounding_visibility(False)
|
self.set_feerounding_visibility(False)
|
||||||
return
|
else:
|
||||||
self.update_fee_fields()
|
self.check_tx_fee_warning()
|
||||||
if self.locktime_e.get_locktime() is None:
|
self.update_fee_fields()
|
||||||
self.locktime_e.set_locktime(self.tx.locktime)
|
if self.locktime_e.get_locktime() is None:
|
||||||
self.io_widget.update(tx)
|
self.locktime_e.set_locktime(self.tx.locktime)
|
||||||
fee = tx.get_fee()
|
self.io_widget.update(self.tx)
|
||||||
|
self.fee_label.setText(self.main_window.config.format_amount_and_units(self.tx.get_fee()))
|
||||||
|
self._update_extra_fees()
|
||||||
|
|
||||||
|
self._update_send_button()
|
||||||
|
self._update_message()
|
||||||
|
|
||||||
|
|
||||||
|
def check_tx_fee_warning(self):
|
||||||
|
# side effects: self.error, self.message
|
||||||
|
fee = self.tx.get_fee()
|
||||||
assert fee is not None
|
assert fee is not None
|
||||||
self.fee_label.setText(self.main_window.config.format_amount_and_units(fee))
|
amount = self.tx.output_value() if self.output_value == '!' else self.output_value
|
||||||
|
tx_size = self.tx.estimated_size()
|
||||||
self.update_extra_fees()
|
|
||||||
|
|
||||||
amount = tx.output_value() if self.output_value == '!' else self.output_value
|
|
||||||
tx_size = tx.estimated_size()
|
|
||||||
fee_warning_tuple = self.wallet.get_tx_fee_warning(
|
fee_warning_tuple = self.wallet.get_tx_fee_warning(
|
||||||
invoice_amt=amount, tx_size=tx_size, fee=fee)
|
invoice_amt=amount, tx_size=tx_size, fee=fee)
|
||||||
if fee_warning_tuple:
|
if fee_warning_tuple:
|
||||||
allow_send, long_warning, short_warning = fee_warning_tuple
|
allow_send, long_warning, short_warning = fee_warning_tuple
|
||||||
self.toggle_send_button(allow_send, message=long_warning)
|
if not allow_send:
|
||||||
else:
|
self.error = long_warning
|
||||||
self.toggle_send_button(True)
|
else:
|
||||||
|
# note: this may overrride existing message
|
||||||
|
self.message = long_warning
|
||||||
|
|
||||||
def set_locktime(self):
|
def set_locktime(self):
|
||||||
if not self.tx:
|
if not self.tx:
|
||||||
@@ -499,9 +501,19 @@ class TxEditor(WindowModalDialog):
|
|||||||
def _update_amount_label(self):
|
def _update_amount_label(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def update_extra_fees(self):
|
def _update_extra_fees(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _update_message(self):
|
||||||
|
style = ColorScheme.RED if self.error else ColorScheme.BLUE
|
||||||
|
self.message_label.setStyleSheet(style.as_stylesheet())
|
||||||
|
self.message_label.setText(self.error or self.message)
|
||||||
|
|
||||||
|
def _update_send_button(self):
|
||||||
|
enabled = bool(self.tx) and not self.error
|
||||||
|
self.preview_button.setEnabled(enabled)
|
||||||
|
self.ok_button.setEnabled(enabled)
|
||||||
|
|
||||||
|
|
||||||
class ConfirmTxDialog(TxEditor):
|
class ConfirmTxDialog(TxEditor):
|
||||||
help_text = ''#_('Set the mining fee of your transaction')
|
help_text = ''#_('Set the mining fee of your transaction')
|
||||||
@@ -516,8 +528,7 @@ class ConfirmTxDialog(TxEditor):
|
|||||||
title=_("New Transaction"), # todo: adapt title for channel funding tx, swaps
|
title=_("New Transaction"), # todo: adapt title for channel funding tx, swaps
|
||||||
allow_preview=allow_preview)
|
allow_preview=allow_preview)
|
||||||
|
|
||||||
BlockingWaitingDialog(window, _("Preparing transaction..."), self.update_tx)
|
BlockingWaitingDialog(window, _("Preparing transaction..."), self.update)
|
||||||
self.update()
|
|
||||||
|
|
||||||
def _update_amount_label(self):
|
def _update_amount_label(self):
|
||||||
tx = self.tx
|
tx = self.tx
|
||||||
@@ -538,6 +549,8 @@ class ConfirmTxDialog(TxEditor):
|
|||||||
self.tx = self.make_tx(fee_estimator)
|
self.tx = self.make_tx(fee_estimator)
|
||||||
self.not_enough_funds = False
|
self.not_enough_funds = False
|
||||||
self.no_dynfee_estimates = False
|
self.no_dynfee_estimates = False
|
||||||
|
error = ''
|
||||||
|
message = ''
|
||||||
except NotEnoughFunds:
|
except NotEnoughFunds:
|
||||||
self.not_enough_funds = True
|
self.not_enough_funds = True
|
||||||
self.tx = None
|
self.tx = None
|
||||||
@@ -610,7 +623,7 @@ class ConfirmTxDialog(TxEditor):
|
|||||||
|
|
||||||
return grid
|
return grid
|
||||||
|
|
||||||
def update_extra_fees(self):
|
def _update_extra_fees(self):
|
||||||
x_fee = run_hook('get_tx_extra_fee', self.wallet, self.tx)
|
x_fee = run_hook('get_tx_extra_fee', self.wallet, self.tx)
|
||||||
if x_fee:
|
if x_fee:
|
||||||
x_fee_address, x_fee_amount = x_fee
|
x_fee_address, x_fee_amount = x_fee
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ class _BaseRBFDialog(TxEditor):
|
|||||||
|
|
||||||
new_fee_rate = self.old_fee_rate + max(1, self.old_fee_rate // 20)
|
new_fee_rate = self.old_fee_rate + max(1, self.old_fee_rate // 20)
|
||||||
self.feerate_e.setAmount(new_fee_rate)
|
self.feerate_e.setAmount(new_fee_rate)
|
||||||
self._update_tx(new_fee_rate)
|
self.update()
|
||||||
self._update_message()
|
|
||||||
self.fee_slider.activate()
|
self.fee_slider.activate()
|
||||||
# are we paying max?
|
# are we paying max?
|
||||||
invoices = self.wallet.get_relevant_invoices_for_tx(txid)
|
invoices = self.wallet.get_relevant_invoices_for_tx(txid)
|
||||||
@@ -111,22 +110,18 @@ class _BaseRBFDialog(TxEditor):
|
|||||||
|
|
||||||
def update_tx(self):
|
def update_tx(self):
|
||||||
fee_rate = self.feerate_e.get_amount()
|
fee_rate = self.feerate_e.get_amount()
|
||||||
self._update_tx(fee_rate)
|
|
||||||
self._update_message()
|
|
||||||
|
|
||||||
def _update_tx(self, fee_rate):
|
|
||||||
if fee_rate is None:
|
if fee_rate is None:
|
||||||
self.tx = None
|
self.tx = None
|
||||||
self.message = ''
|
self.error = _('No fee rate')
|
||||||
elif fee_rate <= self.old_fee_rate:
|
elif fee_rate <= self.old_fee_rate:
|
||||||
self.tx = None
|
self.tx = None
|
||||||
self.message = _("The new fee rate needs to be higher than the old fee rate.")
|
self.error = _("The new fee rate needs to be higher than the old fee rate.")
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
self.tx = self.make_tx(fee_rate)
|
self.tx = self.make_tx(fee_rate)
|
||||||
except CannotBumpFee as e:
|
except CannotBumpFee as e:
|
||||||
self.tx = None
|
self.tx = None
|
||||||
self.message = str(e)
|
self.error = str(e)
|
||||||
if not self.tx:
|
if not self.tx:
|
||||||
return
|
return
|
||||||
delta = self.tx.get_fee() - self.old_tx.get_fee()
|
delta = self.tx.get_fee() - self.old_tx.get_fee()
|
||||||
@@ -135,15 +130,6 @@ class _BaseRBFDialog(TxEditor):
|
|||||||
else:
|
else:
|
||||||
self.message = _("The recipient will receive {} less.").format(self.main_window.format_amount_and_units(delta))
|
self.message = _("The recipient will receive {} less.").format(self.main_window.format_amount_and_units(delta))
|
||||||
|
|
||||||
def _update_message(self):
|
|
||||||
enabled = bool(self.tx)
|
|
||||||
self.ok_button.setEnabled(enabled)
|
|
||||||
if enabled:
|
|
||||||
style = ColorScheme.BLUE.as_stylesheet()
|
|
||||||
else:
|
|
||||||
style = ColorScheme.RED.as_stylesheet()
|
|
||||||
self.message_label.setStyleSheet(style)
|
|
||||||
self.message_label.setText(self.message)
|
|
||||||
|
|
||||||
|
|
||||||
class BumpFeeDialog(_BaseRBFDialog):
|
class BumpFeeDialog(_BaseRBFDialog):
|
||||||
|
|||||||
Reference in New Issue
Block a user