From abaefa362a044b8909f2a26b858a9a01017a9cf3 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 15 Mar 2021 10:17:30 +0100 Subject: [PATCH] kivy: unify fee dialogs - confirm_tx_dialog and bump_fee_dialog inherit from FeeSliderDialog - changing the slider method does not require an extra popup --- .../gui/kivy/uix/dialogs/bump_fee_dialog.py | 62 +++++++++---------- .../gui/kivy/uix/dialogs/confirm_tx_dialog.py | 29 ++++----- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py b/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py index 01979f1dd..3afd49f96 100644 --- a/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py @@ -10,16 +10,18 @@ from electrum.gui.kivy.i18n import _ if TYPE_CHECKING: from ...main_window import ElectrumWindow +from .fee_dialog import FeeSliderDialog + Builder.load_string(''' title: _('Bump fee') size_hint: 0.8, 0.8 pos_hint: {'top':0.9} + method: 0 BoxLayout: orientation: 'vertical' padding: '10dp' - GridLayout: height: self.minimum_height size_hint_y: None @@ -33,14 +35,24 @@ Builder.load_string(''' id: old_feerate text: _('Current Fee rate') value: '' - Label: - id: tooltip1 - text: '' - size_hint_y: None - Label: - id: tooltip2 - text: '' - size_hint_y: None + BoxLabel: + id: new_feerate + text: _('New Fee rate') + value: '' + BoxLayout: + orientation: 'horizontal' + size_hint: 1, 0.5 + Label: + text: _('Target') + ' (%s):' % (_('mempool') if root.method == 2 else _('ETA') if root.method == 1 else _('static')) + Button: + id: fee_target + text: '' + background_color: (0,0,0,0) + bold: True + on_release: + root.method = (root.method + 1) % 3 + root.update_slider() + root.update_text() Slider: id: slider range: 0, 4 @@ -72,48 +84,32 @@ Builder.load_string(''' root.on_ok() ''') -class BumpFeeDialog(Factory.Popup): +class BumpFeeDialog(FeeSliderDialog, Factory.Popup): def __init__(self, app: 'ElectrumWindow', fee, size, callback): Factory.Popup.__init__(self) + FeeSliderDialog.__init__(self, app.electrum_config, self.ids.slider) self.app = app self.init_fee = fee self.tx_size = size self.callback = callback self.config = app.electrum_config - self.mempool = self.config.use_mempool_fees() - self.dynfees = self.config.is_dynfee() and bool(self.app.network) and self.config.has_dynamic_fees_ready() self.ids.old_fee.value = self.app.format_amount_and_units(self.init_fee) self.ids.old_feerate.value = self.app.format_fee_rate(fee / self.tx_size * 1000) self.update_slider() self.update_text() def update_text(self): - pos = int(self.ids.slider.value) - new_fee_rate = self.get_fee_rate() - text, tooltip = self.config.get_fee_text(pos, self.dynfees, self.mempool, new_fee_rate) - self.ids.tooltip1.text = text - self.ids.tooltip2.text = tooltip - - def update_slider(self): - slider = self.ids.slider - maxp, pos, fee_rate = self.config.get_fee_slider(self.dynfees, self.mempool) - slider.range = (0, maxp) - slider.step = 1 - slider.value = pos - - def get_fee_rate(self): - pos = int(self.ids.slider.value) - if self.dynfees: - fee_rate = self.config.depth_to_fee(pos) if self.mempool else self.config.eta_to_fee(pos) - else: - fee_rate = self.config.static_fee(pos) - return fee_rate # sat/kbyte + target, tooltip, dyn = self.config.get_fee_target() + self.ids.fee_target.text = target + feerate = self.config.fee_per_kb() / 1000 + self.ids.new_feerate.value = f'{feerate:.1f} sat/B' def on_ok(self): - new_fee_rate = self.get_fee_rate() / 1000 + new_fee_rate = self.config.fee_per_kb() / 1000 is_final = self.ids.final_cb.active self.callback(new_fee_rate, is_final) def on_slider(self, value): + self.save_config() self.update_text() diff --git a/electrum/gui/kivy/uix/dialogs/confirm_tx_dialog.py b/electrum/gui/kivy/uix/dialogs/confirm_tx_dialog.py index d01c77f88..bc15dcbe7 100644 --- a/electrum/gui/kivy/uix/dialogs/confirm_tx_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/confirm_tx_dialog.py @@ -15,7 +15,7 @@ from electrum.gui.kivy.i18n import _ from electrum.plugin import run_hook from electrum.util import NotEnoughFunds -from .fee_dialog import FeeSliderDialog, FeeDialog +from .fee_dialog import FeeSliderDialog if TYPE_CHECKING: from electrum.gui.kivy.main_window import ElectrumWindow @@ -30,6 +30,7 @@ Builder.load_string(''' show_final: False size_hint: 0.8, 0.8 pos_hint: {'top':0.9} + method: 0 BoxLayout: orientation: 'vertical' BoxLayout: @@ -59,14 +60,23 @@ Builder.load_string(''' orientation: 'horizontal' size_hint: 1, 0.5 Label: - text: _('Fee target:') + text: _('Fee rate:') + Label: + id: feerate_label + text: '' + BoxLayout: + orientation: 'horizontal' + size_hint: 1, 0.5 + Label: + text: _('Target') + ' (%s):' % (_('mempool') if root.method == 2 else _('ETA') if root.method == 1 else _('static')) Button: id: fee_button text: '' background_color: (0,0,0,0) bold: True on_release: - root.on_fee_button() + root.method = (root.method + 1) % 3 + root.on_slider(root.slider.value) Slider: id: slider range: 0, 4 @@ -142,8 +152,9 @@ class ConfirmTxDialog(FeeSliderDialog, Factory.Popup): amount = self.amount if self.amount != '!' else tx.output_value() tx_size = tx.estimated_size() fee = tx.get_fee() + self.ids.fee_label.text = self.app.format_amount_and_units(fee) feerate = Decimal(fee) / tx_size # sat/byte - self.ids.fee_label.text = self.app.format_amount_and_units(fee) + f' ({feerate:.1f} sat/B)' + self.ids.feerate_label.text = f'{feerate:.1f} sat/B' self.ids.amount_label.text = self.app.format_amount_and_units(amount) x_fee = run_hook('get_tx_extra_fee', self.app.wallet, tx) if x_fee: @@ -168,13 +179,3 @@ class ConfirmTxDialog(FeeSliderDialog, Factory.Popup): def update_text(self): target, tooltip, dyn = self.config.get_fee_target() self.ids.fee_button.text = target - - def on_fee_button(self): - fee_dialog = FeeDialog(self, self.config, self.after_fee_changed) - fee_dialog.open() - - def after_fee_changed(self): - self.read_config() - self.update_slider() - self.update_text() - Clock.schedule_once(lambda dt: self.update_tx())