dscancel_dialog.py (3368B)
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 <DSCancelDialog@Popup> 16 title: _('Cancel (double-spend) transaction') 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 Widget: 50 size_hint: 1, 1 51 BoxLayout: 52 orientation: 'horizontal' 53 size_hint: 1, 0.5 54 Button: 55 text: 'Cancel' 56 size_hint: 0.5, None 57 height: '48dp' 58 on_release: root.dismiss() 59 Button: 60 text: 'OK' 61 size_hint: 0.5, None 62 height: '48dp' 63 on_release: 64 root.dismiss() 65 root.on_ok() 66 ''') 67 68 class DSCancelDialog(Factory.Popup): 69 70 def __init__(self, app: 'ElectrumWindow', fee, size, callback): 71 Factory.Popup.__init__(self) 72 self.app = app 73 self.init_fee = fee 74 self.tx_size = size 75 self.callback = callback 76 self.config = app.electrum_config 77 self.mempool = self.config.use_mempool_fees() 78 self.dynfees = self.config.is_dynfee() and bool(self.app.network) and self.config.has_dynamic_fees_ready() 79 self.ids.old_fee.value = self.app.format_amount_and_units(self.init_fee) 80 self.ids.old_feerate.value = self.app.format_fee_rate(fee / self.tx_size * 1000) 81 self.update_slider() 82 self.update_text() 83 84 def update_text(self): 85 pos = int(self.ids.slider.value) 86 new_fee_rate = self.get_fee_rate() 87 text, tooltip = self.config.get_fee_text(pos, self.dynfees, self.mempool, new_fee_rate) 88 self.ids.tooltip1.text = text 89 self.ids.tooltip2.text = tooltip 90 91 def update_slider(self): 92 slider = self.ids.slider 93 maxp, pos, fee_rate = self.config.get_fee_slider(self.dynfees, self.mempool) 94 slider.range = (0, maxp) 95 slider.step = 1 96 slider.value = pos 97 98 def get_fee_rate(self): 99 pos = int(self.ids.slider.value) 100 if self.dynfees: 101 fee_rate = self.config.depth_to_fee(pos) if self.mempool else self.config.eta_to_fee(pos) 102 else: 103 fee_rate = self.config.static_fee(pos) 104 return fee_rate # sat/kbyte 105 106 def on_ok(self): 107 new_fee_rate = self.get_fee_rate() / 1000 108 self.callback(new_fee_rate) 109 110 def on_slider(self, value): 111 self.update_text()