From b0d13adba7c6dd63b3cd985ec3d364b3d3a3da78 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 8 Feb 2012 14:01:29 +0530 Subject: [PATCH] A less crash prone (I hope) implementation of ProceedNotification --- src/calibre/gui2/dialogs/message_box.py | 25 ++++++++++++------------- src/calibre/gui2/ui.py | 7 +++++++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/dialogs/message_box.py b/src/calibre/gui2/dialogs/message_box.py index 84e5569a88..3a330fe1f9 100644 --- a/src/calibre/gui2/dialogs/message_box.py +++ b/src/calibre/gui2/dialogs/message_box.py @@ -180,7 +180,7 @@ class ProceedNotification(MessageBox): # {{{ self.payload = payload self.html_log = html_log self.log_viewer_title = log_viewer_title - self.finished.connect(self.do_proceed, type=Qt.QueuedConnection) + self.finished.connect(self.do_proceed) self.vlb = self.bb.addButton(_('View log'), self.bb.ActionRole) self.vlb.setIcon(QIcon(I('debug.png'))) @@ -195,18 +195,17 @@ class ProceedNotification(MessageBox): # {{{ parent=self) def do_proceed(self, result): - try: - if result == self.Accepted: - self.callback(self.payload) - elif self.cancel_callback is not None: - self.cancel_callback(self.payload) - finally: - # Ensure this notification is garbage collected - self.callback = self.cancel_callback = None - self.setParent(None) - self.finished.disconnect() - self.vlb.clicked.disconnect() - _proceed_memory.remove(self) + from calibre.gui2.ui import get_gui + func = (self.callback if result == self.Accepted else + self.cancel_callback) + gui = get_gui() + gui.proceed_requested.emit(func, self.payload) + # Ensure this notification is garbage collected + self.callback = self.cancel_callback = self.payload = None + self.setParent(None) + self.finished.disconnect() + self.vlb.clicked.disconnect() + _proceed_memory.remove(self) # }}} class ErrorNotification(MessageBox): # {{{ diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 98fd7981c9..fa62dba4bc 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -102,10 +102,13 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ ): 'The main GUI' + proceed_requested = pyqtSignal(object, object) def __init__(self, opts, parent=None, gui_debug=None): global _gui MainWindow.__init__(self, opts, parent=parent, disable_automatic_gc=True) + self.proceed_requested.connect(self.do_proceed, + type=Qt.QueuedConnection) self.keyboard = Manager(self) _gui = self self.opts = opts @@ -402,6 +405,10 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ except: pass + def do_proceed(self, func, payload): + if callable(func): + func(payload) + def no_op(self, *args): pass