URI: 
       tMore cleanup of WaitingDialog - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 8f91af28a5c45b02d16130e921b69a6bf0e1c2eb
   DIR parent a58c19d7c0627216e126f621270866c16dd8711a
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sat, 26 Dec 2015 11:18:32 +0900
       
       More cleanup of WaitingDialog
       
       Simplify its interface
       
       Diffstat:
         M gui/qt/main_window.py               |      75 ++++++++++++++-----------------
         M gui/qt/transaction_dialog.py        |      17 +++++++++--------
         M gui/qt/util.py                      |      16 +++++-----------
         M plugins/audio_modem/qt.py           |       4 ++--
         M plugins/trustedcoin/qt.py           |       7 +++----
       
       5 files changed, 52 insertions(+), 67 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -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):
       t@@ -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
       t@@ -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)
        
   DIR diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py
       t@@ -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()
        
       t@@ -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'
   DIR diff --git a/gui/qt/util.py b/gui/qt/util.py
       t@@ -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)
       t@@ -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)
   DIR diff --git a/plugins/audio_modem/qt.py b/plugins/audio_modem/qt.py
       t@@ -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))
       t@@ -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)
   DIR diff --git a/plugins/trustedcoin/qt.py b/plugins/trustedcoin/qt.py
       t@@ -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):
       t@@ -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: