bump_fee_dialog.py (3585B)
1 from typing import TYPE_CHECKING 2 3 from kivy.app import App 4 from kivy.factory import Factory 5 from kivy.properties import ObjectProperty 6 from kivy.lang import Builder 7 8 from electrum.gui.kivy.i18n import _ 9 10 if TYPE_CHECKING: 11 from ...main_window import ElectrumWindow 12 13 14 Builder.load_string(''' 15 <BumpFeeDialog@Popup> 16 title: _('Bump fee') 17 size_hint: 0.8, 0.8 18 pos_hint: {'top':0.9} 19 BoxLayout: 20 orientation: 'vertical' 21 padding: '10dp' 22 23 GridLayout: 24 height: self.minimum_height 25 size_hint_y: None 26 cols: 1 27 spacing: '10dp' 28 BoxLabel: 29 id: old_fee 30 text: _('Current Fee') 31 value: '' 32 BoxLabel: 33 id: old_feerate 34 text: _('Current Fee rate') 35 value: '' 36 Label: 37 id: tooltip1 38 text: '' 39 size_hint_y: None 40 Label: 41 id: tooltip2 42 text: '' 43 size_hint_y: None 44 Slider: 45 id: slider 46 range: 0, 4 47 step: 1 48 on_value: root.on_slider(self.value) 49 BoxLayout: 50 orientation: 'horizontal' 51 size_hint: 1, 0.2 52 Label: 53 text: _('Final') 54 CheckBox: 55 id: final_cb 56 Widget: 57 size_hint: 1, 1 58 BoxLayout: 59 orientation: 'horizontal' 60 size_hint: 1, 0.5 61 Button: 62 text: 'Cancel' 63 size_hint: 0.5, None 64 height: '48dp' 65 on_release: root.dismiss() 66 Button: 67 text: 'OK' 68 size_hint: 0.5, None 69 height: '48dp' 70 on_release: 71 root.dismiss() 72 root.on_ok() 73 ''') 74 75 class BumpFeeDialog(Factory.Popup): 76 77 def __init__(self, app: 'ElectrumWindow', fee, size, callback): 78 Factory.Popup.__init__(self) 79 self.app = app 80 self.init_fee = fee 81 self.tx_size = size 82 self.callback = callback 83 self.config = app.electrum_config 84 self.mempool = self.config.use_mempool_fees() 85 self.dynfees = self.config.is_dynfee() and bool(self.app.network) and self.config.has_dynamic_fees_ready() 86 self.ids.old_fee.value = self.app.format_amount_and_units(self.init_fee) 87 self.ids.old_feerate.value = self.app.format_fee_rate(fee / self.tx_size * 1000) 88 self.update_slider() 89 self.update_text() 90 91 def update_text(self): 92 pos = int(self.ids.slider.value) 93 new_fee_rate = self.get_fee_rate() 94 text, tooltip = self.config.get_fee_text(pos, self.dynfees, self.mempool, new_fee_rate) 95 self.ids.tooltip1.text = text 96 self.ids.tooltip2.text = tooltip 97 98 def update_slider(self): 99 slider = self.ids.slider 100 maxp, pos, fee_rate = self.config.get_fee_slider(self.dynfees, self.mempool) 101 slider.range = (0, maxp) 102 slider.step = 1 103 slider.value = pos 104 105 def get_fee_rate(self): 106 pos = int(self.ids.slider.value) 107 if self.dynfees: 108 fee_rate = self.config.depth_to_fee(pos) if self.mempool else self.config.eta_to_fee(pos) 109 else: 110 fee_rate = self.config.static_fee(pos) 111 return fee_rate # sat/kbyte 112 113 def on_ok(self): 114 new_fee_rate = self.get_fee_rate() / 1000 115 is_final = self.ids.final_cb.active 116 self.callback(new_fee_rate, is_final) 117 118 def on_slider(self, value): 119 self.update_text()