Abort terminal save on error instead of quitting editor

This commit is contained in:
Kovid Goyal 2014-08-19 11:38:56 +05:30
parent 796cba4b69
commit ae0adc82fb
2 changed files with 19 additions and 9 deletions

View File

@ -12,7 +12,7 @@ from urlparse import urlparse
from PyQt5.Qt import ( from PyQt5.Qt import (
QObject, QApplication, QDialog, QGridLayout, QLabel, QSize, Qt, QObject, QApplication, QDialog, QGridLayout, QLabel, QSize, Qt,
QDialogButtonBox, QIcon, QTimer, QPixmap, QInputDialog, QUrl) QDialogButtonBox, QIcon, QPixmap, QInputDialog, QUrl)
from calibre import prints, isbytestring from calibre import prints, isbytestring
from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory
@ -76,6 +76,7 @@ class Boss(QObject):
self.tdir = None self.tdir = None
self.save_manager = SaveManager(parent, notify) self.save_manager = SaveManager(parent, notify)
self.save_manager.report_error.connect(self.report_save_error) self.save_manager.report_error.connect(self.report_save_error)
self.save_manager.check_for_completion.connect(self.check_terminal_save)
self.doing_terminal_save = False self.doing_terminal_save = False
self.ignore_preview_to_editor_sync = False self.ignore_preview_to_editor_sync = False
setup_cssutils_serialization() setup_cssutils_serialization()
@ -951,8 +952,8 @@ class Boss(QObject):
def report_save_error(self, tb): def report_save_error(self, tb):
if self.doing_terminal_save: if self.doing_terminal_save:
prints(tb, file=sys.stderr) prints(tb, file=sys.stderr)
return self.abort_terminal_save()
self.gui.action_save.setEnabled(True) self.set_modified()
error_dialog(self.gui, _('Could not save'), error_dialog(self.gui, _('Could not save'),
_('Saving of the book failed. Click "Show Details"' _('Saving of the book failed. Click "Show Details"'
' for more information. You can try to save a copy' ' for more information. You can try to save a copy'
@ -1370,13 +1371,15 @@ class Boss(QObject):
self.gui.blocking_job.set_msg(_('Saving, please wait...')) self.gui.blocking_job.set_msg(_('Saving, please wait...'))
self.gui.blocking_job.start() self.gui.blocking_job.start()
self.doing_terminal_save = True self.doing_terminal_save = True
QTimer.singleShot(50, self.check_terminal_save)
def abort_terminal_save(self):
self.doing_terminal_save = False
self.gui.blocking_job.stop()
def check_terminal_save(self): def check_terminal_save(self):
if self.save_manager.has_tasks: if self.doing_terminal_save and not self.save_manager.has_tasks: # terminal save could have been aborted
return QTimer.singleShot(50, self.check_terminal_save) self.shutdown()
self.shutdown() QApplication.instance().quit()
QApplication.instance().quit()
def shutdown(self): def shutdown(self):
self.gui.preview.stop_refresh_timer() self.gui.preview.stop_refresh_timer()

View File

@ -99,6 +99,7 @@ class SaveManager(QObject):
start_save = pyqtSignal() start_save = pyqtSignal()
report_error = pyqtSignal(object) report_error = pyqtSignal(object)
save_done = pyqtSignal() save_done = pyqtSignal()
check_for_completion = pyqtSignal()
def __init__(self, parent, notify=None): def __init__(self, parent, notify=None):
QObject.__init__(self, parent) QObject.__init__(self, parent)
@ -128,14 +129,17 @@ class SaveManager(QObject):
self.requests.task_done() self.requests.task_done()
self.__empty_queue() self.__empty_queue()
break break
error_occurred = True
try: try:
count, tdir, container = x count, tdir, container = x
self.process_save(count, tdir, container) error_occurred = self.process_save(count, tdir, container)
except: except:
import traceback import traceback
traceback.print_exc() traceback.print_exc()
finally: finally:
self.requests.task_done() self.requests.task_done()
if not error_occurred:
self.check_for_completion.emit()
def notify_calibre(self): def notify_calibre(self):
while True: while True:
@ -162,14 +166,17 @@ class SaveManager(QObject):
return return
self.last_saved = count self.last_saved = count
self.start_save.emit() self.start_save.emit()
error_occurred = False
try: try:
self.do_save(tdir, container) self.do_save(tdir, container)
except: except:
import traceback import traceback
self.report_error.emit(traceback.format_exc()) self.report_error.emit(traceback.format_exc())
error_occurred = True
self.save_done.emit() self.save_done.emit()
if self.notify_data: if self.notify_data:
self.notify_requests.put(True) self.notify_requests.put(True)
return error_occurred
def do_save(self, tdir, container): def do_save(self, tdir, container):
try: try: