tamount_dialog.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
tamount_dialog.py (5256B)
---
1 from kivy.app import App
2 from kivy.factory import Factory
3 from kivy.properties import ObjectProperty
4 from kivy.lang import Builder
5 from decimal import Decimal
6
7 Builder.load_string('''
8
9 <AmountDialog@Popup>
10 id: popup
11 title: _('Amount')
12 AnchorLayout:
13 anchor_x: 'center'
14 BoxLayout:
15 orientation: 'vertical'
16 size_hint: 0.9, 1
17 Widget:
18 size_hint: 1, 0.2
19 BoxLayout:
20 size_hint: 1, None
21 height: '80dp'
22 Button:
23 background_color: 0, 0, 0, 0
24 id: btc
25 text: kb.amount + ' ' + app.base_unit
26 color: (0.7, 0.7, 1, 1) if kb.is_fiat else (1, 1, 1, 1)
27 halign: 'right'
28 size_hint: 1, None
29 font_size: '20dp'
30 height: '48dp'
31 on_release:
32 kb.is_fiat = False
33 Button:
34 background_color: 0, 0, 0, 0
35 id: fiat
36 text: kb.fiat_amount + ' ' + app.fiat_unit
37 color: (1, 1, 1, 1) if kb.is_fiat else (0.7, 0.7, 1, 1)
38 halign: 'right'
39 size_hint: 1, None
40 font_size: '20dp'
41 height: '48dp'
42 disabled: not app.fx.is_enabled()
43 on_release:
44 kb.is_fiat = True
45 Widget:
46 size_hint: 1, 0.2
47 GridLayout:
48 id: kb
49 amount: ''
50 fiat_amount: ''
51 is_fiat: False
52 is_max: False
53 on_fiat_amount: if self.is_fiat: self.amount = app.fiat_to_btc(self.fiat_amount)
54 on_amount: if not self.is_fiat: self.fiat_amount = app.btc_to_fiat(self.amount)
55 size_hint: 1, None
56 update_amount: popup.update_amount
57 height: '300dp'
58 cols: 3
59 KButton:
60 text: '1'
61 KButton:
62 text: '2'
63 KButton:
64 text: '3'
65 KButton:
66 text: '4'
67 KButton:
68 text: '5'
69 KButton:
70 text: '6'
71 KButton:
72 text: '7'
73 KButton:
74 text: '8'
75 KButton:
76 text: '9'
77 KButton:
78 text: '.'
79 KButton:
80 text: '0'
81 KButton:
82 text: '<'
83 Widget:
84 size_hint: 1, None
85 height: '48dp'
86 Button:
87 id: but_max
88 opacity: 1 if root.show_max else 0
89 disabled: not root.show_max
90 size_hint: 1, None
91 height: '48dp'
92 text: 'Max'
93 on_release:
94 kb.is_fiat = False
95 kb.amount = app.get_max_amount()
96 kb.is_max = True
97 Button:
98 size_hint: 1, None
99 height: '48dp'
100 text: 'Clear'
101 on_release:
102 kb.amount = ''
103 kb.fiat_amount = ''
104 kb.is_max = False
105 Widget:
106 size_hint: 1, 0.2
107 BoxLayout:
108 size_hint: 1, None
109 height: '48dp'
110 Widget:
111 size_hint: 1, None
112 height: '48dp'
113 Button:
114 size_hint: 1, None
115 height: '48dp'
116 text: _('OK')
117 on_release:
118 root.callback('!' if kb.is_max else btc.text if kb.amount else '')
119 popup.dismiss()
120 ''')
121
122 from kivy.properties import BooleanProperty
123
124 class AmountDialog(Factory.Popup):
125 show_max = BooleanProperty(False)
126 app = App.get_running_app()
127
128 def __init__(self, show_max, amount, cb):
129 Factory.Popup.__init__(self)
130 self.show_max = show_max
131 self.callback = cb
132 if amount:
133 self.ids.kb.amount = amount
134
135 def update_amount(self, c):
136 kb = self.ids.kb
137 amount = kb.fiat_amount if kb.is_fiat else kb.amount # type: str
138 if c == '<': # delete
139 amount = amount[:-1]
140 elif c == '.' and amount in ['0', '']:
141 amount = '0.'
142 elif amount == '0':
143 amount = c
144 else:
145 try:
146 Decimal(amount+c)
147 amount += c
148 except:
149 pass
150 # truncate btc amounts to max precision:
151 if not kb.is_fiat and '.' in amount:
152 p = amount.find('.')
153 amount = amount.replace('.', '')
154 amount = amount[:p] + '.' + amount[p:p + self.app.decimal_point()]
155 if kb.is_fiat:
156 kb.fiat_amount = amount
157 else:
158 kb.amount = amount