tkivy: improve settings and password dialogs - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 37e93928ab2786f107332a87551433341702ea27 DIR parent 0d5114b6c2ed648b7739b325b18458542a054684 HTML Author: ThomasV <thomasv@electrum.org> Date: Mon, 7 Dec 2015 14:33:18 +0100 kivy: improve settings and password dialogs Diffstat: M gui/kivy/main.kv | 21 +++++++++++++++++++++ M gui/kivy/main_window.py | 47 ++++++++++++++++++++++--------- M gui/kivy/uix/screens.py | 2 +- M gui/kivy/uix/ui_screens/settings.kv | 48 +++++++++++-------------------- 4 files changed, 73 insertions(+), 45 deletions(-) --- DIR diff --git a/gui/kivy/main.kv b/gui/kivy/main.kv t@@ -317,6 +317,27 @@ if self.parent: self.parent.parent.dismiss() app.popup_dialog(self.name) + +<SettingsItem@ButtonBehavior+BoxLayout> + orientation: 'vertical' + title: '' + description: '' + size_hint: 1, None + Label: + id: title + text: self.parent.title + size_hint: 1, 1 + bold: True + text_size: self.size + halign: 'left' + Label: + text: self.parent.description + size_hint: 1, 1 + text_size: self.size + color: 0.8, 0.8, 0.8, 1 + halign: 'left' + + BoxLayout: orientation: 'vertical' DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py t@@ -9,7 +9,7 @@ import electrum from electrum import WalletStorage, Wallet from electrum.i18n import _, set_language from electrum.contacts import Contacts -from electrum.util import profiler +from electrum.util import profiler, InvalidPassword from electrum.plugins import run_hook from electrum.util import format_satoshis, format_satoshis_plain t@@ -798,19 +798,40 @@ class ElectrumWindow(App): popup.on_dismiss = cb popup.open() + def protected(self, f, args): + if self.wallet.use_encryption: + self.password_dialog(_('Enter PIN'), f, args) + else: + apply(f, args + (None,)) + def change_password(self): - self.password_dialog(self._change_password, ()) + self.protected(self._change_password, ()) + + def _change_password(self, old_password): + if old_password: + try: + self.wallet.check_password(old_password) + except InvalidPassword: + self.show_error("Invalid PIN") + return + self.password_dialog(_('Enter new PIN'), self._change_password2, (old_password,)) - def _change_password(self, password): - print "zs", password + def _change_password2(self, old_password, new_password): + self.password_dialog(_('Confirm new PIN'), self._change_password3, (old_password, new_password)) - def password_dialog(self, f, args): - if self.wallet.use_encryption: - popup = Builder.load_file('gui/kivy/uix/ui_screens/password.kv') - def callback(): - pw = popup.ids.kb.password - Clock.schedule_once(lambda x: apply(f, args + (pw,)), 0.5) - popup.on_dismiss = callback - popup.open() + def _change_password3(self, old_password, new_password, confirmed_password): + if new_password == confirmed_password: + self.wallet.update_password(old_password, new_password) else: - apply(f, args + (None,)) + self.show_error("PIN numbers do not match") + + def password_dialog(self, title, f, args): + popup = Builder.load_file('gui/kivy/uix/ui_screens/password.kv') + popup.title = title + def callback(): + pw = popup.ids.kb.password + Clock.schedule_once(lambda x: apply(f, args + (pw,)), 0.1) + popup.on_dismiss = callback + popup.open() + + DIR diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py t@@ -218,7 +218,7 @@ class SendScreen(CScreen): message = unicode(self.screen.message) fee = None outputs = [('address', address, amount)] - self.app.password_dialog(self.send_tx, (outputs, fee, message)) + self.app.protected(self.send_tx, (outputs, fee, message)) def send_tx(self, *args): self.app.show_info("Sending...") DIR diff --git a/gui/kivy/uix/ui_screens/settings.kv b/gui/kivy/uix/ui_screens/settings.kv t@@ -3,38 +3,24 @@ Popup: title: _('Settings') BoxLayout: - orientation: 'vertical' - - Button: - text: _('Set PIN Code') - size_hint: 1, None - height: '48dp' - on_release: app.change_password() - - GridLayout: - cols: 2 - size_hint: 1, None - height: '100dp' - Label: - text: _('Base unit') - size_hint: 1, None - height: '48dp' - Button: - text: app.base_unit - size_hint: 1, None - height: '48dp' - on_release: - app._rotate_bu() - self.text = app.base_unit - Label: - size_hint: 1, None - text: 'OpenAlias' - height: '48dp' - TextInput: - size_hint: 1, None - height: '48dp' - multiline: False + SettingsItem: + title: _('PIN Code') + ' (%s)'%('ON' if app.wallet.use_encryption else 'OFF') + description: _("Your PIN code will be required in order to spend bitcoins.") + on_release: + app.change_password() + self.title = _('PIN Code') + ' (%s)'%('ON' if app.wallet.use_encryption else 'OFF') + CardSeparator + SettingsItem: + title: _('Denomination') + ' (' + app.base_unit + ')' + description: "Base unit for Bitcoin amounts." + on_release: + app._rotate_bu() + self.title = _('Denomination') + ' (' + app.base_unit + ')' + CardSeparator + SettingsItem: + title: _('OpenAlias') + description: "Email-like address." Widget: size_hint: 1, 1