tkivy: add sign/broadcast to tx dialog - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 744b74f2b58def257a7e055ef475aced43da03e8 DIR parent 5f590c9c648fd2c7b859f1aebd356dafab4a761f HTML Author: ThomasV <thomasv@electrum.org> Date: Sat, 13 Feb 2016 08:15:06 +0100 kivy: add sign/broadcast to tx dialog Diffstat: M gui/kivy/main_window.py | 34 +++---------------------------- A gui/kivy/uix/dialogs/tx_dialog.py | 137 +++++++++++++++++++++++++++++++ M gui/kivy/uix/screens.py | 5 +---- D gui/kivy/uix/ui_screens/transactio… | 42 ------------------------------- 4 files changed, 141 insertions(+), 77 deletions(-) --- DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py t@@ -655,37 +655,9 @@ class ElectrumWindow(App): info_bubble.show(pos, duration, width, modal=modal, exit=exit) def tx_dialog(self, tx): - tx_hash = tx.hash() - popup = Builder.load_file('gui/kivy/uix/ui_screens/transaction.kv') - conf, timestamp = self.wallet.get_confirmations(tx_hash) - is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) - if is_relevant: - if is_mine: - if fee is not None: - amount_str = _("Amount sent:")+' %s'% self.format_amount_and_units(-v+fee) - fee_str = _("Transaction fee")+': %s'% self.format_amount_and_units(-fee) - else: - amount_str = _("Amount sent:")+' %s'% self.format_amount_and_units(-v) - fee_str = _("Transaction fee")+': '+ _("unknown") - else: - amount_str = _("Amount received:")+' %s'% self.format_amount_and_units(v) - fee_str = '' - else: - amount_str = _("Transaction unrelated to your wallet") - fee_str = '' - if timestamp: - time_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ')[:-3] - else: - time_str = _('Pending') - status_str = _("%d confirmations")%conf - # update popup - popup.ids.txid_label.text = _('Transaction ID') + ' :\n' + ' '.join(map(''.join, zip(*[iter(tx_hash)]*4))) - popup.ids.amount_label.text = amount_str - popup.ids.fee_label.text = fee_str - popup.ids.status_label.text = _('Status') + ': ' + status_str - popup.ids.date_label.text = _('Date') + ': '+ time_str - popup.open() - + from uix.dialogs.tx_dialog import TxDialog + d = TxDialog(self, tx) + d.open() def address_dialog(self, screen): pass DIR diff --git a/gui/kivy/uix/dialogs/tx_dialog.py b/gui/kivy/uix/dialogs/tx_dialog.py t@@ -0,0 +1,137 @@ +from kivy.app import App +from kivy.factory import Factory +from kivy.properties import ObjectProperty +from kivy.lang import Builder + +from electrum_gui.kivy.i18n import _ +from datetime import datetime + +Builder.load_string(''' +<TxDialog@Popup> + id: popup + title: _('Transaction') + can_sign: False + can_broadcast: False + fee_str: '' + amount_str: '' + txid_str: '' + status_str: '' + time_str: '' + AnchorLayout: + anchor_x: 'center' + BoxLayout: + orientation: 'vertical' + Label: + id: txid_label + text: root.txid_str + text_size: self.width, None + size: self.texture_size + Label: + id: status_label + text: root.status_str + text_size: self.width, None + size_hint: 1, 0.3 + Label: + id: date_label + text: root.time_str + text_size: self.width, None + size_hint: 1, 0.3 + Label: + id: amount_label + text: root.amount_str + text_size: self.width, None + size_hint: 1, 0.3 + Label: + id: fee_label + text: root.fee_str + text_size: self.width, None + size_hint: 1, 0.3 + Widget: + size_hint: 1, 1 + BoxLayout: + size_hint: 1, None + height: '48dp' + Button: + size_hint: 0.5, None + height: '48dp' + text: _('Sign') if root.can_sign else _('Broadcast') if root.can_broadcast else '' + #opacity: 1 if root.can_sign or root.can_broadcast else 0 + disabled: not( root.can_sign or root.can_broadcast ) + on_release: + if root.can_sign: root.do_sign() + if root.can_broadcast: root.do_broadcast() + Button: + size_hint: 0.5, None + height: '48dp' + text: _('QR') + on_release: root.show_qr() + Button: + size_hint: 0.5, None + height: '48dp' + text: _('OK') + on_release: popup.dismiss() +''') + +class TxDialog(Factory.Popup): + + def __init__(self, app, tx): + Factory.Popup.__init__(self) + self.app = app + self.wallet = self.app.wallet + self.tx = tx + self.update() + + def update(self): + self.can_broadcast = False + if self.tx.is_complete(): + tx_hash = self.tx.hash() + self.txid_str = _('Transaction ID') + ' :\n' + ' '.join(map(''.join, zip(*[iter(tx_hash)]*4))) + if tx_hash in self.wallet.transactions.keys(): + conf, timestamp = self.wallet.get_confirmations(tx_hash) + self.status_str = _("%d confirmations")%conf + if timestamp: + self.time_str = datetime.fromtimestamp(timestamp).isoformat(' ')[:-3] + else: + self.time_str = _('Pending') + else: + self.can_broadcast = self.app.network is not None + else: + s, r = self.tx.signature_count() + self.txid_str = _("Unsigned") if s == 0 else _('Partially signed') + ' (%d/%d)'%(s,r) + + is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(self.tx) + if is_relevant: + if is_mine: + if fee is not None: + self.amount_str = _("Amount sent:")+' %s'% self.app.format_amount_and_units(-v+fee) + self.fee_str = _("Transaction fee")+': %s'% self.app.format_amount_and_units(-fee) + else: + self.amount_str = _("Amount sent:")+' %s'% self.app.format_amount_and_units(-v) + self.fee_str = _("Transaction fee")+': '+ _("unknown") + else: + self.amount_str = _("Amount received:")+' %s'% self.app.format_amount_and_units(v) + self.fee_str = '' + else: + self.amount_str = _("Transaction unrelated to your wallet") + self.fee_str = '' + self.can_sign = self.wallet.can_sign(self.tx) + + def do_sign(self): + self.app.protected(self._do_sign, ()) + + def _do_sign(self, password): + self.app.show_info(_('Signing')) + self.app.wallet.sign_transaction(self.tx, password) + self.app.show_info('') + self.update() + + def do_broadcast(self): + self.app.show_info(_('Broadcasting')) + ok, txid = self.app.wallet.sendtx(self.tx) + self.app.show_info(txid) + + def show_qr(self): + from electrum.bitcoin import base_encode + text = str(self.tx).decode('hex') + text = base_encode(text, base=43) + self.app.qr_dialog(_("Raw Transaction"), text) DIR diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py t@@ -274,10 +274,7 @@ class SendScreen(CScreen): self.app.show_error(str(e)) return if not tx.is_complete(): - from electrum.bitcoin import base_encode - text = str(tx).decode('hex') - text = base_encode(text, base=43) - self.app.qr_dialog(_("Unsigned Transaction"), text) + self.app.tx_dialog(tx) return # broadcast ok, txid = self.app.wallet.sendtx(tx) DIR diff --git a/gui/kivy/uix/ui_screens/transaction.kv b/gui/kivy/uix/ui_screens/transaction.kv t@@ -1,42 +0,0 @@ -#:import Decimal decimal.Decimal - -Popup: - id: popup - title: _('Transaction') - AnchorLayout: - anchor_x: 'center' - BoxLayout: - orientation: 'vertical' - Label: - id: txid_label - text_size: self.width, None - size: self.texture_size - Label: - id: status_label - text_size: self.width, None - size_hint: 1, 0.3 - Label: - id: date_label - text_size: self.width, None - size_hint: 1, 0.3 - Label: - id: amount_label - text_size: self.width, None - size_hint: 1, 0.3 - Label: - id: fee_label - text_size: self.width, None - size_hint: 1, 0.3 - Widget: - size_hint: 1, 0.3 - BoxLayout: - size_hint: 1, None - height: '48dp' - Widget: - size_hint: 0.5, None - height: '48dp' - Button: - size_hint: 0.5, None - height: '48dp' - text: _('OK') - on_release: popup.dismiss()