URI: 
       tWaitingDialog class for better encapsulation - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 6665a70a494913d15966a0e7b952ddb1eeab06c7
   DIR parent 9e2db24f5da2b8e5a34b21933fa075a01ae99d5a
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Sat, 10 May 2014 20:36:07 +0200
       
       WaitingDialog class for better encapsulation
       
       Diffstat:
         M gui/qt/main_window.py               |      76 ++++++++++++-------------------
         M gui/qt/util.py                      |      23 +++++++++++++++++++++++
       
       2 files changed, 52 insertions(+), 47 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -154,8 +154,6 @@ class ElectrumWindow(QMainWindow):
                self.connect(self, QtCore.SIGNAL('update_status'), self.update_status)
                self.connect(self, QtCore.SIGNAL('banner_signal'), lambda: self.console.showMessage(self.network.banner) )
                self.connect(self, QtCore.SIGNAL('transaction_signal'), lambda: self.notify_transactions() )
       -        self.connect(self, QtCore.SIGNAL('send_tx2'), self.send_tx2)
       -        self.connect(self, QtCore.SIGNAL('send_tx3'), self.send_tx3)
                self.connect(self, QtCore.SIGNAL('payment_request_ok'), self.payment_request_ok)
                self.connect(self, QtCore.SIGNAL('payment_request_error'), self.payment_request_error)
        
       t@@ -814,15 +812,6 @@ class ElectrumWindow(QMainWindow):
                self.send_tx(outputs, fee, label)
        
        
       -    def waiting_dialog(self, message):
       -        d = QDialog(self)
       -        d.setWindowTitle('Please wait')
       -        l = QLabel(message)
       -        vbox = QVBoxLayout(d)
       -        vbox.addWidget(l)
       -        d.show()
       -        return d
       -
        
            @protected
            def send_tx(self, outputs, fee, label, password):
       t@@ -846,55 +835,48 @@ class ElectrumWindow(QMainWindow):
                    keypairs = {}
                    self.wallet.add_keypairs_from_wallet(tx, keypairs, password)
                    self.wallet.sign_transaction(tx, keypairs, password)
       -            self.signed_tx_data = (tx, fee, label)
       -            self.emit(SIGNAL('send_tx2'))
       -        self.tx_wait_dialog = self.waiting_dialog('Signing..')
       -        threading.Thread(target=sign_thread).start()
       +            return tx, fee, label
        
       +        def sign_done(tx, fee, label):
       +            if tx.error:
       +                self.show_message(tx.error)
       +                return
       +            if tx.requires_fee(self.wallet.verifier) and fee < MIN_RELAY_TX_FEE:
       +                QMessageBox.warning(self, _('Error'), _("This transaction requires a higher fee, or it will not be propagated by the network."), _('OK'))
       +                return
       +            if label:
       +                self.wallet.set_label(tx.hash(), label)
        
       +            if not self.gui_object.payment_request:
       +                if not tx.is_complete() or self.config.get('show_before_broadcast'):
       +                    self.show_transaction(tx)
       +                    return
        
       -    def send_tx2(self):
       -        tx, fee, label = self.signed_tx_data
       -        self.tx_wait_dialog.accept()
       -        
       -        if tx.error:
       -            self.show_message(tx.error)
       -            return
       +            self.broadcast_transaction(tx)
        
       -        if tx.requires_fee(self.wallet.verifier) and fee < MIN_RELAY_TX_FEE:
       -            QMessageBox.warning(self, _('Error'), _("This transaction requires a higher fee, or it will not be propagated by the network."), _('OK'))
       -            return
       +        WaitingDialog(self, 'Signing..').start(sign_thread, sign_done)
        
       -        if label:
       -            self.wallet.set_label(tx.hash(), label)
        
       -        if not tx.is_complete() or self.config.get('show_before_broadcast'):
       -            self.show_transaction(tx)
       -            return
       +
       +    def broadcast_transaction(self, tx):
        
                def broadcast_thread():
                    if self.gui_object.payment_request:
       -                print "sending ack"
                        refund_address = self.wallet.addresses()[0]
       -                self.gui_object.payment_request.send_ack(str(tx), refund_address)
       +                status, msg = self.gui_object.payment_request.send_ack(str(tx), refund_address)
                        self.gui_object.payment_request = None
       -            # note: BIP 70 recommends not broadcasting the tx to the network and letting the merchant do that
       -            self.tx_broadcast_result =  self.wallet.sendtx(tx)
       -            self.emit(SIGNAL('send_tx3'))
       -
       -        self.tx_broadcast_dialog = self.waiting_dialog('Broadcasting..')
       -        threading.Thread(target=broadcast_thread).start()
       -
       +            else:
       +                status, msg =  self.wallet.sendtx(tx)
       +            return status, msg
        
       +        def broadcast_done(status, msg):
       +            if status:
       +                QMessageBox.information(self, '', _('Payment sent.') + '\n' + msg, _('OK'))
       +                self.do_clear()
       +            else:
       +                QMessageBox.warning(self, _('Error'), msg, _('OK'))
        
       -    def send_tx3(self):
       -        self.tx_broadcast_dialog.accept()
       -        status, msg = self.tx_broadcast_result
       -        if status:
       -            QMessageBox.information(self, '', _('Payment sent.') + '\n' + msg, _('OK'))
       -            self.do_clear()
       -        else:
       -            QMessageBox.warning(self, _('Error'), msg, _('OK'))
       +        WaitingDialog(self, 'Broadcasting..').start(broadcast_thread, broadcast_done)
        
        
        
   DIR diff --git a/gui/qt/util.py b/gui/qt/util.py
       t@@ -4,6 +4,29 @@ from PyQt4.QtCore import *
        import os.path
        import time
        
       +import threading
       +
       +class WaitingDialog(QDialog):
       +    def __init__(self, parent, message):
       +        QDialog.__init__(self, parent)
       +        self.setWindowTitle('Please wait')
       +        l = QLabel(message)
       +        vbox = QVBoxLayout(self)
       +        vbox.addWidget(l)
       +        self.show()
       +
       +    def start(self, run_thread, on_complete=None):
       +        def my_thread():
       +            self.result = run_thread()
       +            self.emit(SIGNAL('done'))
       +            self.accept()
       +
       +        if on_complete:
       +            self.connect(self, SIGNAL('done'), lambda: on_complete(*self.result))
       +        
       +        threading.Thread(target=my_thread).start()
       +
       +
        
        class Timer(QThread):
            def run(self):