electrum

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

commit 9cf0a9720fac7020486530462319a6b61fae73a2
parent 83cc5e2001a1413920bd3afe61211d9f7246c039
Author: Neil Booth <kyuupichan@gmail.com>
Date:   Sun, 10 Jan 2016 12:16:34 +0900

QT handler improvements

Now we have the top_level_window() function, stop using the window
stack.

Diffstat:
Mgui/qt/util.py | 3++-
Mplugins/trezor/qt_generic.py | 28++++++++++------------------
2 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/gui/qt/util.py b/gui/qt/util.py @@ -159,7 +159,8 @@ class MessageBoxMixin(object): def top_level_window(self, window=None): window = window or self for n, child in enumerate(window.children()): - if isinstance(child, WindowModalDialog): + # Test for visibility as old closed dialogs may not be GC-ed + if isinstance(child, WindowModalDialog) and child.isVisible(): return self.top_level_window(child) return window diff --git a/plugins/trezor/qt_generic.py b/plugins/trezor/qt_generic.py @@ -31,13 +31,15 @@ class QtHandler(PrintError): win.connect(win, SIGNAL('pin_dialog'), self.pin_dialog) win.connect(win, SIGNAL('passphrase_dialog'), self.passphrase_dialog) win.connect(win, SIGNAL('word_dialog'), self.word_dialog) - self.window_stack = [win] self.win = win self.pin_matrix_widget_class = pin_matrix_widget_class self.device = device self.dialog = None self.done = threading.Event() + def top_level_window(self): + return self.win.top_level_window() + def watching_only_changed(self): self.win.emit(SIGNAL('watching_only_changed')) @@ -71,7 +73,7 @@ class QtHandler(PrintError): def pin_dialog(self, msg): # Needed e.g. when resetting a device self.clear_dialog() - dialog = WindowModalDialog(self.window_stack[-1], _("Enter PIN")) + dialog = WindowModalDialog(self.top_level_window(), _("Enter PIN")) matrix = self.pin_matrix_widget_class() vbox = QVBoxLayout() vbox.addWidget(QLabel(msg)) @@ -83,7 +85,7 @@ class QtHandler(PrintError): self.done.set() def passphrase_dialog(self, msg): - d = PasswordDialog(self.window_stack[-1], None, msg, + d = PasswordDialog(self.top_level_window(), None, msg, PasswordDialog.PW_PASSPHRASE) confirmed, p, passphrase = d.run() if confirmed: @@ -92,7 +94,7 @@ class QtHandler(PrintError): self.done.set() def word_dialog(self, msg): - dialog = WindowModalDialog(self.window_stack[-1], "") + dialog = WindowModalDialog(self.top_level_window(), "") hbox = QHBoxLayout(dialog) hbox.addWidget(QLabel(msg)) text = QLineEdit() @@ -100,7 +102,7 @@ class QtHandler(PrintError): text.returnPressed.connect(dialog.accept) hbox.addWidget(text) hbox.addStretch(1) - if not self.exec_dialog(dialog): + if not dialog.exec_(): return None self.word = unicode(text.text()) self.done.set() @@ -109,8 +111,7 @@ class QtHandler(PrintError): # Called more than once during signing, to confirm output and fee self.clear_dialog() title = _('Please check your %s device') % self.device - self.dialog = dialog = WindowModalDialog(self.window_stack[-1], title) - self.window_stack.append(dialog) + self.dialog = dialog = WindowModalDialog(self.top_level_window(), title) l = QLabel(msg) vbox = QVBoxLayout(dialog) if cancel_callback: @@ -120,21 +121,13 @@ class QtHandler(PrintError): dialog.show() def error_dialog(self, msg): - self.win.show_error(msg, parent=self.window_stack[-1]) + self.win.show_error(msg, parent=self.top_level_window()) def clear_dialog(self): if self.dialog: self.dialog.accept() - self.window_stack.remove(self.dialog) self.dialog = None - def exec_dialog(self, dialog): - self.window_stack.append(dialog) - try: - return dialog.exec_() - finally: - assert dialog == self.window_stack.pop() - def query_choice(self, msg, labels): return self.win.query_choice(msg, labels) @@ -263,8 +256,7 @@ def qt_plugin_class(base_plugin_class): def settings_dialog(self, window): hid_id = self.choose_device(window) if hid_id: - dialog = SettingsDialog(window, self, hid_id) - window.wallet.handler.exec_dialog(dialog) + SettingsDialog(window, self, hid_id).exec_() def choose_device(self, window): '''This dialog box should be usable even if the user has