electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 8f91af28a5c45b02d16130e921b69a6bf0e1c2eb
parent a58c19d7c0627216e126f621270866c16dd8711a
Author: Neil Booth <kyuupichan@gmail.com>
Date:   Sat, 26 Dec 2015 11:18:32 +0900

More cleanup of WaitingDialog

Simplify its interface

Diffstat:
Mgui/qt/main_window.py | 75+++++++++++++++++++++++++++++++++------------------------------------------
Mgui/qt/transaction_dialog.py | 17+++++++++--------
Mgui/qt/util.py | 16+++++-----------
Mplugins/audio_modem/qt.py | 4++--
Mplugins/trustedcoin/qt.py | 7+++----
5 files changed, 52 insertions(+), 67 deletions(-)

diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py @@ -1144,22 +1144,19 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): ''' def request_password(self, *args, **kwargs): parent = kwargs.get('parent', self) - if self.wallet.use_encryption: - while True: - password = self.password_dialog(parent=parent) - if not password: - return True, None - try: + password = None + while self.wallet.use_encryption: + password = self.password_dialog(parent=parent) + try: + if password: self.wallet.check_password(password) - break - except Exception as e: - self.show_error(str(e), parent=parent) - continue - else: - password = None + break + except Exception as e: + self.show_error(str(e), parent=parent) + continue kwargs['password'] = password - return False, func(self, *args, **kwargs) + return func(self, *args, **kwargs) return request_password def read_send_tab(self): @@ -1259,39 +1256,32 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.show_transaction(tx) self.do_clear() else: - self.broadcast_transaction(tx, tx_desc) - self.sign_tx_with_password(tx, sign_done, password) + self.broadcast_transaction(tx, tx_desc, self) + self.sign_tx_with_password(tx, sign_done, password, self) @protected - def sign_tx(self, tx, callback, password, parent=None): + def sign_tx(self, tx, callback, password, parent): self.sign_tx_with_password(tx, callback, password, parent) - def sign_tx_with_password(self, tx, callback, password, parent=None): + def sign_tx_with_password(self, tx, callback, password, parent): '''Sign the transaction in a separate thread. When done, calls the callback with a success code of True or False. ''' - if parent == None: - parent = self - self.send_button.setDisabled(True) + if self.wallet.use_encryption and not password: + callback(False) # User cancelled password input + return # call hook to see if plugin needs gui interaction run_hook('sign_tx', parent, tx) - # sign the tx - success = [False] # Array to work around python scoping def sign_thread(): - if not self.wallet.is_watching_only(): - self.wallet.sign_transaction(tx, password) - def on_signed(ret): - success[0] = True - def on_finished(): - self.send_button.setDisabled(False) - callback(success[0]) + self.wallet.sign_transaction(tx, password) + return True WaitingDialog(parent, _('Signing transaction...'), sign_thread, - on_success=on_signed, on_finished=on_finished) + callback) - def broadcast_transaction(self, tx, tx_desc, parent=None): + def broadcast_transaction(self, tx, tx_desc, parent): def broadcast_thread(): # non-GUI thread @@ -1313,19 +1303,20 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): msg = ack_msg return status, msg - def broadcast_done(status, msg): + def broadcast_done(result): # GUI thread - if status: - if tx_desc is not None and tx.is_complete(): - self.wallet.set_label(tx.hash(), tx_desc) - self.show_message(_('Payment sent.') + '\n' + msg, parent=parent) - self.invoices_list.update() - self.do_clear() - else: - self.show_error(msg, parent=parent) - self.send_button.setDisabled(False) + if result: + status, msg = result + if status: + if tx_desc is not None and tx.is_complete(): + self.wallet.set_label(tx.hash(), tx_desc) + self.show_message(_('Payment sent.') + '\n' + msg, + parent=parent) + self.invoices_list.update() + self.do_clear() + else: + self.show_error(msg, parent=parent) - parent = parent or self WaitingDialog(parent, _('Broadcasting transaction...'), broadcast_thread, broadcast_done) diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py @@ -116,7 +116,7 @@ class TxDialog(QDialog, MessageBoxMixin): self.update() def do_broadcast(self): - self.parent.broadcast_transaction(self.tx, self.desc, parent=self) + self.parent.broadcast_transaction(self.tx, self.desc, self) self.broadcast = True self.update() @@ -140,14 +140,15 @@ class TxDialog(QDialog, MessageBoxMixin): def sign(self): def sign_done(success): self.sign_button.setDisabled(False) - self.prompt_if_unsaved = False - self.saved = False - self.update() - self.sign_button.setDisabled(True) - cancelled, ret = self.parent.sign_tx(self.tx, sign_done, parent=self) - if cancelled: - self.sign_button.setDisabled(False) + if success: + self.prompt_if_unsaved = False + self.saved = False + self.update() + self.sign_button.setDisabled(True) + # Note sign_tx is wrapped and parent= is actually passed + # to the password input dialog box + self.parent.sign_tx(self.tx, sign_done, parent=self) def save(self): name = 'signed_%s.txn' % (self.tx.hash()[0:8]) if self.tx.is_complete() else 'unsigned.txn' diff --git a/gui/qt/util.py b/gui/qt/util.py @@ -200,13 +200,11 @@ class WindowModalDialog(QDialog): class WaitingDialog(QThread, MessageBoxMixin): '''Shows a please wait dialog whilst runnning a task. It is not necessary to maintain a reference to this dialog.''' - def __init__(self, parent, message, task, on_success=None, - on_finished=None): + def __init__(self, parent, message, task, on_finished=None): global dialogs dialogs.append(self) # Prevent GC QThread.__init__(self) self.task = task - self.on_success = on_success self.on_finished = on_finished self.dialog = WindowModalDialog(parent, _("Please wait")) vbox = QVBoxLayout(self.dialog) @@ -216,26 +214,22 @@ class WaitingDialog(QThread, MessageBoxMixin): self.start() def run(self): - self.error = None try: self.result = self.task() + self.error = None except BaseException as e: traceback.print_exc(file=sys.stdout) self.error = str(e) + self.result = None def finished(self): global dialogs dialogs.remove(self) + self.dialog.accept() if self.error: self.show_error(self.error, parent=self.dialog.parent()) - elif self.on_success: - result = self.result - if type(result) is not tuple: - result = (result,) - self.on_success(*result) if self.on_finished: - self.on_finished() - self.dialog.accept() + self.on_finished(self.result) def line_dialog(parent, title, label, ok_label, default=None): dialog = WindowModalDialog(parent, title) diff --git a/plugins/audio_modem/qt.py b/plugins/audio_modem/qt.py @@ -116,7 +116,7 @@ class Plugin(BasePlugin): amodem.main.recv(config=self.modem_config, src=src, dst=dst) return dst.getvalue() - def on_success(blob): + def on_finished(blob): if blob: blob = zlib.decompress(blob) print_msg('Received:', repr(blob)) @@ -124,4 +124,4 @@ class Plugin(BasePlugin): kbps = self.modem_config.modem_bps / 1e3 msg = 'Receiving from Audio MODEM ({0:.1f} kbps)...'.format(kbps) - WaitingDialog(parent, msg, receiver_thread, on_success=on_success) + WaitingDialog(parent, msg, receiver_thread, on_finished) diff --git a/plugins/trustedcoin/qt.py b/plugins/trustedcoin/qt.py @@ -85,10 +85,10 @@ class Plugin(TrustedCoinPlugin): self.print_error("twofactor: xpub3 not needed") window.wallet.auth_code = auth_code - def waiting_dialog(self, window, on_success=None): + def waiting_dialog(self, window, on_finished=None): task = partial(self.request_billing_info, window.wallet) return WaitingDialog(window, 'Getting billing information...', task, - on_success=on_success) + on_finished) @hook def abort_send(self, window): @@ -104,8 +104,7 @@ class Plugin(TrustedCoinPlugin): def settings_dialog(self, window): - on_success = partial(self.show_settings_dialog, window) - self.waiting_dialog(window, on_success) + self.waiting_dialog(window, partial(self.show_settings_dialog, window)) def show_settings_dialog(self, window, success): if not success: