Saving implemented

This commit is contained in:
Kovid Goyal 2013-10-16 17:57:15 +05:30
parent f4d132b823
commit 494a252f3f
3 changed files with 45 additions and 6 deletions

View File

@ -745,6 +745,10 @@ class EpubContainer(Container):
f.write(guess_type('a.epub')) f.write(guess_type('a.epub'))
zip_rebuilder(self.root, outpath) zip_rebuilder(self.root, outpath)
@property
def path_to_ebook(self):
return self.pathtoepub
# }}} # }}}
# AZW3 {{{ # AZW3 {{{
@ -839,6 +843,11 @@ class AZW3Container(Container):
oeb = create_oebbook(default_log, opf, plumber.opts) oeb = create_oebbook(default_log, opf, plumber.opts)
set_cover(oeb) set_cover(oeb)
outp.convert(oeb, outpath, inp, plumber.opts, default_log) outp.convert(oeb, outpath, inp, plumber.opts, default_log)
@property
def path_to_ebook(self):
return self.pathtoepub
# }}} # }}}
def get_container(path, log=None, tdir=None): def get_container(path, log=None, tdir=None):

View File

@ -10,7 +10,7 @@ import tempfile, shutil
from PyQt4.Qt import QObject, QApplication from PyQt4.Qt import QObject, QApplication
from calibre.gui2 import error_dialog, choose_files from calibre.gui2 import error_dialog, choose_files, question_dialog, info_dialog
from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.ebooks.oeb.polish.main import SUPPORTED
from calibre.ebooks.oeb.polish.container import get_container, clone_container from calibre.ebooks.oeb.polish.container import get_container, clone_container
@ -26,6 +26,7 @@ class Boss(QObject):
self.container_count = 0 self.container_count = 0
self.tdir = None self.tdir = None
self.save_manager = SaveManager(parent) self.save_manager = SaveManager(parent)
self.save_manager.report_error.connect(self.report_save_error)
def __call__(self, gui): def __call__(self, gui):
self.gui = gui self.gui = gui
@ -42,7 +43,10 @@ class Boss(QObject):
def open_book(self, path=None): def open_book(self, path=None):
if not self.check_dirtied(): if not self.check_dirtied():
return return
# TODO: Check if a save is in progress and abort if it is if self.save_manager.has_tasks:
return info_dialog(self.gui, _('Cannot open'),
_('The current book is being saved, you cannot open a new book until'
' the saving is completed'), show=True)
if not hasattr(path, 'rpartition'): if not hasattr(path, 'rpartition'):
path = choose_files(self.gui, 'open-book-for-tweaking', _('Choose book'), path = choose_files(self.gui, 'open-book-for-tweaking', _('Choose book'),
@ -95,6 +99,7 @@ class Boss(QObject):
container = current_container() container = current_container()
self.gui.file_list.build(container) self.gui.file_list.build(container)
self.update_global_history_actions() self.update_global_history_actions()
self.gui.action_save.setEnabled(True)
# TODO: Apply to other GUI elements # TODO: Apply to other GUI elements
def do_global_undo(self): def do_global_undo(self):
@ -127,6 +132,11 @@ class Boss(QObject):
container = clone_container(current_container(), tdir) container = clone_container(current_container(), tdir)
self.save_manager.schedule(tdir, container) self.save_manager.schedule(tdir, container)
def report_save_error(self, tb):
error_dialog(self.gui, _('Could not save'),
_('Saving of the book failed. Click "Show Details"'
' for more information.'), det_msg=tb, show=True)
def quit(self): def quit(self):
if not self.confirm_quit(): if not self.confirm_quit():
return return
@ -134,10 +144,19 @@ class Boss(QObject):
QApplication.instance().quit() QApplication.instance().quit()
def confirm_quit(self): def confirm_quit(self):
if self.save_manager.has_tasks:
if not question_dialog(
self.gui, _('Are you sure?'), _(
'The current book is being saved in the background, quitting will abort'
' the save process, are you sure?'), default_yes=False):
return False
return True return True
def shutdown(self): def shutdown(self):
self.save_state() self.save_state()
self.save_manager.shutdown()
self.save_manager.wait(0.1)
def save_state(self): def save_state(self):
with tprefs: with tprefs:

View File

@ -6,14 +6,17 @@ from __future__ import (unicode_literals, division, absolute_import,
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
import shutil import shutil, os
from threading import Thread from threading import Thread
from Queue import LifoQueue, Empty from Queue import LifoQueue, Empty
from PyQt4.Qt import (QObject, pyqtSignal, QLabel, QWidget, QHBoxLayout, Qt) from PyQt4.Qt import (QObject, pyqtSignal, QLabel, QWidget, QHBoxLayout, Qt)
from calibre.utils import join_with_timeout from calibre.constants import iswindows
from calibre.ptempfile import PersistentTemporaryFile
from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.progress_indicator import ProgressIndicator
from calibre.utils import join_with_timeout
from calibre.utils.filenames import atomic_rename
class SaveWidget(QWidget): class SaveWidget(QWidget):
@ -101,10 +104,18 @@ class SaveManager(QObject):
self.save_done.emit() self.save_done.emit()
def do_save(self, tdir, container): def do_save(self, tdir, container):
temp = None
try: try:
import time path = container.path_to_ebook
time.sleep(10) temp = PersistentTemporaryFile(
prefix=('_' if iswindows else '.'), suffix=os.path.splitext(path)[1], dir=os.path.dirname(path))
temp.close()
temp = temp.name
container.commit(temp)
atomic_rename(temp, path)
finally: finally:
if temp and os.path.exists(temp):
os.remove(temp)
shutil.rmtree(tdir, ignore_errors=True) shutil.rmtree(tdir, ignore_errors=True)
@property @property