tMerge branch 'master' of git://github.com/spesmilo/electrum - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 93e8c7da6ee3217db7f0195fc782c936b25688c2 DIR parent 7933ac4324738173925277f4d9f5e28a167fe8f7 HTML Author: ThomasV <thomasv@gitorious> Date: Sat, 4 Jul 2015 12:07:37 +0200 Merge branch 'master' of git://github.com/spesmilo/electrum Diffstat: M gui/qt/main_window.py | 71 +++++++++++++++++-------------- M gui/qt/transaction_dialog.py | 9 +++++++-- 2 files changed, 46 insertions(+), 34 deletions(-) --- DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py t@@ -1043,7 +1043,31 @@ class ElectrumWindow(QMainWindow): self.completions.setStringList(l) def protected(func): - return lambda s, *args: s.do_protect(func, args) + '''Password request wrapper. The password is passed to the function + as the 'password' named argument. Return value is a 2-element + tuple: (Cancelled, Result) where Cancelled is True if the user + cancels the password request, otherwise False. Result is the + return value of the wrapped function, or None if cancelled. + ''' + 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: + self.wallet.check_password(password) + break + except Exception as e: + QMessageBox.warning(parent, _('Error'), str(e), _('OK')) + continue + else: + password = None + + kwargs['password'] = password + return False, func(self, *args, **kwargs) + return request_password def read_send_tab(self): if self.payment_request and self.payment_request.has_expired(): t@@ -1141,10 +1165,12 @@ class ElectrumWindow(QMainWindow): @protected - def sign_tx(self, tx, callback, password): + def sign_tx(self, tx, callback, password, parent=None): '''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) # call hook to see if plugin needs gui interaction t@@ -1162,11 +1188,11 @@ class ElectrumWindow(QMainWindow): callback(success[0]) # keep a reference to WaitingDialog or the gui might crash - self.waiting_dialog = WaitingDialog(self, 'Signing transaction...', sign_thread, on_sign_successful, on_dialog_close) + self.waiting_dialog = WaitingDialog(parent, 'Signing transaction...', sign_thread, on_sign_successful, on_dialog_close) self.waiting_dialog.start() - def broadcast_transaction(self, tx, tx_desc): + def broadcast_transaction(self, tx, tx_desc, parent=None): def broadcast_thread(): # non-GUI thread t@@ -1193,14 +1219,16 @@ class ElectrumWindow(QMainWindow): if status: if tx_desc is not None and tx.is_complete(): self.wallet.set_label(tx.hash(), tx_desc) - QMessageBox.information(self, '', _('Payment sent.') + '\n' + msg, _('OK')) + QMessageBox.information(parent, '', _('Payment sent.') + '\n' + msg, _('OK')) self.update_invoices_list() self.do_clear() else: - QMessageBox.warning(self, _('Error'), msg, _('OK')) + QMessageBox.warning(parent, _('Error'), msg, _('OK')) self.send_button.setDisabled(False) - self.waiting_dialog = WaitingDialog(self, 'Broadcasting transaction...', broadcast_thread, broadcast_done) + if parent == None: + parent = self + self.waiting_dialog = WaitingDialog(parent, 'Broadcasting transaction...', broadcast_thread, broadcast_done) self.waiting_dialog.start() t@@ -1858,29 +1886,6 @@ class ElectrumWindow(QMainWindow): d = QRDialog(data, self, title) d.exec_() - - def do_protect(self, func, args): - if self.wallet.use_encryption: - while True: - password = self.password_dialog() - if not password: - return - try: - self.wallet.check_password(password) - break - except Exception as e: - QMessageBox.warning(self, _('Error'), str(e), _('OK')) - continue - else: - password = None - - if args != (False,): - args = (self,) + args + (password,) - else: - args = (self, password) - apply(func, args) - - def show_public_keys(self, address): if not address: return try: t@@ -2060,8 +2065,10 @@ class ElectrumWindow(QMainWindow): def show_warning(self, msg): QMessageBox.warning(self, _('Warning'), msg, _('OK')) - def password_dialog(self, msg=None): - d = QDialog(self) + def password_dialog(self, msg=None, parent=None): + if parent == None: + parent = self + d = QDialog(parent) d.setModal(1) d.setWindowTitle(_("Enter Password")) pw = QLineEdit() DIR diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py t@@ -116,7 +116,7 @@ class TxDialog(QWidget): self.update() def do_broadcast(self): - self.parent.broadcast_transaction(self.tx, self.desc) + self.parent.broadcast_transaction(self.tx, self.desc, parent=self) self.broadcast = True self.update() t@@ -142,10 +142,15 @@ class TxDialog(QWidget): def sign(self): def sign_done(success): + self.sign_button.setDisabled(False) self.prompt_if_unsaved = True self.saved = False self.update() - self.parent.sign_tx(self.tx, sign_done) + self.sign_button.setDisabled(True) + cancelled, ret = self.parent.sign_tx(self.tx, sign_done, parent=self) + if cancelled: + self.sign_button.setDisabled(False) + def save(self): name = 'signed_%s.txn' % (self.tx.hash()[0:8]) if self.tx.is_complete() else 'unsigned.txn'