Top level window fix for tx_dialog and h/w wallets
This commit is contained in:
@@ -178,9 +178,24 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
self.fetch_alias()
|
||||
self.require_fee_update = False
|
||||
self.tx_notifications = []
|
||||
self.tl_windows = []
|
||||
self.load_wallet(wallet)
|
||||
self.connect_slots(gui_object.timer)
|
||||
|
||||
def push_top_level_window(self, window):
|
||||
'''Used for e.g. tx dialog box to ensure new dialogs are appropriately
|
||||
parented. This used to be done by explicitly providing the parent
|
||||
window, but that isn't something hardware wallet prompts know.'''
|
||||
self.tl_windows.append(window)
|
||||
|
||||
def pop_top_level_window(self, window):
|
||||
self.tl_windows.remove(window)
|
||||
|
||||
def top_level_window(self):
|
||||
'''Do the right thing in the presence of tx dialog windows'''
|
||||
override = self.tl_windows[-1] if self.tl_windows else None
|
||||
return self.top_level_window_recurse(override)
|
||||
|
||||
def diagnostic_name(self):
|
||||
return "%s/%s" % (PrintError.diagnostic_name(self),
|
||||
self.wallet.basename() if self.wallet else "None")
|
||||
@@ -1141,7 +1156,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
return value of the wrapped function, or None if cancelled.
|
||||
'''
|
||||
def request_password(self, *args, **kwargs):
|
||||
parent = kwargs.get('parent', self.top_level_window())
|
||||
parent = self.top_level_window()
|
||||
password = None
|
||||
while self.wallet.use_encryption:
|
||||
password = self.password_dialog(parent=parent)
|
||||
@@ -1254,14 +1269,14 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
self.show_transaction(tx)
|
||||
self.do_clear()
|
||||
else:
|
||||
self.broadcast_transaction(tx, tx_desc, self)
|
||||
self.sign_tx_with_password(tx, sign_done, password, self)
|
||||
self.broadcast_transaction(tx, tx_desc)
|
||||
self.sign_tx_with_password(tx, sign_done, password)
|
||||
|
||||
@protected
|
||||
def sign_tx(self, tx, callback, password, parent):
|
||||
self.sign_tx_with_password(tx, callback, password, parent)
|
||||
def sign_tx(self, tx, callback, password):
|
||||
self.sign_tx_with_password(tx, callback, password)
|
||||
|
||||
def sign_tx_with_password(self, tx, callback, password, parent):
|
||||
def sign_tx_with_password(self, tx, callback, password):
|
||||
'''Sign the transaction in a separate thread. When done, calls
|
||||
the callback with a success code of True or False.
|
||||
'''
|
||||
@@ -1270,7 +1285,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
return
|
||||
|
||||
# call hook to see if plugin needs gui interaction
|
||||
run_hook('sign_tx', parent, tx)
|
||||
run_hook('sign_tx', self, tx)
|
||||
|
||||
def on_signed(result):
|
||||
callback(True)
|
||||
@@ -1279,10 +1294,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
callback(False)
|
||||
|
||||
task = partial(self.wallet.sign_transaction, tx, password)
|
||||
WaitingDialog(parent, _('Signing transaction...'), task,
|
||||
WaitingDialog(self, _('Signing transaction...'), task,
|
||||
on_signed, on_failed)
|
||||
|
||||
def broadcast_transaction(self, tx, tx_desc, parent):
|
||||
def broadcast_transaction(self, tx, tx_desc):
|
||||
|
||||
def broadcast_thread():
|
||||
# non-GUI thread
|
||||
@@ -1304,6 +1319,9 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
msg = ack_msg
|
||||
return status, msg
|
||||
|
||||
# Capture current TL window; override might be removed on return
|
||||
parent = self.top_level_window()
|
||||
|
||||
def broadcast_done(result):
|
||||
# GUI thread
|
||||
if result:
|
||||
@@ -1311,14 +1329,13 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||
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)
|
||||
parent.show_message(_('Payment sent.') + '\n' + msg)
|
||||
self.invoices_list.update()
|
||||
self.do_clear()
|
||||
else:
|
||||
self.show_error(msg, parent=parent)
|
||||
parent.show_error(msg)
|
||||
|
||||
WaitingDialog(parent, _('Broadcasting transaction...'),
|
||||
WaitingDialog(self, _('Broadcasting transaction...'),
|
||||
broadcast_thread, broadcast_done, self.on_error)
|
||||
|
||||
def prepare_for_payment_request(self):
|
||||
|
||||
Reference in New Issue
Block a user