commit 5f5e9b0a171c71e0ccd2d04d34ae307b68ef6ec3
parent 744b74f2b58def257a7e055ef475aced43da03e8
Author: ThomasV <thomasv@electrum.org>
Date: Sat, 13 Feb 2016 10:00:20 +0100
kivy: improve PIN dialog
Diffstat:
3 files changed, 51 insertions(+), 30 deletions(-)
diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
@@ -682,14 +682,14 @@ class ElectrumWindow(App):
popup = AmountDialog(show_max, amount, cb)
popup.open()
- def protected(self, f, args):
+ def protected(self, msg, f, args):
if self.wallet.use_encryption:
- self.password_dialog(_('Enter PIN'), f, args)
+ self.password_dialog(msg, f, args)
else:
apply(f, args + (None,))
def show_seed(self, label):
- self.protected(self._show_seed, (label,))
+ self.protected(_("Enter your PIN code in order to decrypt your seed"), self._show_seed, (label,))
def _show_seed(self, label, password):
try:
@@ -700,7 +700,7 @@ class ElectrumWindow(App):
label.text = _('Seed') + ':\n' + seed
def change_password(self):
- self.protected(self._change_password, ())
+ self.protected(_("Changing PIN code.") + '\n' + _("Enter your current PIN:"), self._change_password, ())
def _change_password(self, old_password):
if self.wallet.use_encryption:
@@ -720,10 +720,10 @@ class ElectrumWindow(App):
else:
self.show_error("PIN numbers do not match")
- def password_dialog(self, title, f, args):
+ def password_dialog(self, msg, f, args):
from uix.dialogs.password_dialog import PasswordDialog
def callback(pw):
Clock.schedule_once(lambda x: apply(f, args + (pw,)), 0.1)
- popup = PasswordDialog(title, callback)
+ popup = PasswordDialog(msg, callback)
popup.open()
diff --git a/gui/kivy/uix/dialogs/password_dialog.py b/gui/kivy/uix/dialogs/password_dialog.py
@@ -8,27 +8,31 @@ Builder.load_string('''
<PasswordDialog@Popup>
id: popup
- title: _('Enter PIN Code')
+ title: _('PIN Code')
+ message: ''
size_hint: 0.9, 0.9
-
BoxLayout:
-
orientation: 'vertical'
- size_hint: 0.8, 1
-
+ Widget:
+ size_hint: 1, 1
+ Label:
+ text: root.message
+ text_size: self.width, None
+ size: self.texture_size
+ Widget:
+ size_hint: 1, 1
Label:
id: a
text: ' * '*len(kb.password) + ' o '*(6-len(kb.password))
- size_hint: 1, None
- height: '48dp'
-
+ Widget:
+ size_hint: 1, 1
GridLayout:
id: kb
update_amount: popup.update_password
password: ''
on_password: popup.on_password(self.password)
size_hint: 1, None
- height: '300dp'
+ height: '200dp'
cols: 3
KButton:
text: '1'
@@ -54,18 +58,25 @@ Builder.load_string('''
text: '0'
KButton:
text: '<'
-
- Widget:
- size_hint: 1, 1
+ BoxLayout:
+ size_hint: 1, None
+ height: '48dp'
+ Widget:
+ size_hint: 0.5, None
+ Button:
+ size_hint: 0.5, None
+ height: '48dp'
+ text: _('Cancel')
+ on_release: popup.dismiss()
''')
class PasswordDialog(Factory.Popup):
- def __init__(self, title, cb):
+ def __init__(self, message, callback):
Factory.Popup.__init__(self)
- self.title = title
- self.callback = cb
+ self.message = message
+ self.callback = callback
def update_password(self, c):
kb = self.ids.kb
diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py
@@ -250,23 +250,32 @@ class SendScreen(CScreen):
return
outputs = [(bitcoin.TYPE_ADDRESS, address, amount)]
message = unicode(self.screen.message)
- fee = None
- self.app.protected(self.send_tx, (outputs, fee, message))
-
- def send_tx(self, *args):
- self.app.show_info("Sending...")
- threading.Thread(target=self.send_tx_thread, args=args).start()
-
- def send_tx_thread(self, outputs, fee, label, password):
+ amount = sum(map(lambda x:x[2], outputs))
# make unsigned transaction
coins = self.app.wallet.get_spendable_coins()
+ config = self.app.electrum_config
try:
- tx = self.app.wallet.make_unsigned_transaction(coins, outputs, self.app.electrum_config, fee)
+ tx = self.app.wallet.make_unsigned_transaction(coins, outputs, config, None)
except Exception as e:
traceback.print_exc(file=sys.stdout)
self.app.show_error(str(e))
return
+ fee = tx.get_fee()
+ msg = [
+ _("Amount to be sent") + ": " + self.app.format_amount_and_units(amount),
+ _("Mining fee") + ": " + self.app.format_amount_and_units(fee),
+ ]
+ if fee >= config.get('confirm_fee', 100000):
+ msg.append(_('Warning')+ ': ' + _("The fee for this transaction seems unusually high."))
+ msg.append(_("Enter your PIN code to proceed"))
+ self.app.protected('\n'.join(msg), self.send_tx, (tx,))
+
+ def send_tx(self, *args):
+ threading.Thread(target=self.send_tx_thread, args=args).start()
+
+ def send_tx_thread(self, tx, password):
# sign transaction
+ self.app.show_info("Signing...")
try:
self.app.wallet.sign_transaction(tx, password)
except Exception as e:
@@ -277,6 +286,7 @@ class SendScreen(CScreen):
self.app.tx_dialog(tx)
return
# broadcast
+ self.app.show_info("Sending...")
ok, txid = self.app.wallet.sendtx(tx)
self.app.show_info(txid)