Implement saving for individual editors

This commit is contained in:
Kovid Goyal 2013-11-04 15:34:15 +05:30
parent 39228513f4
commit bcd9e53904
3 changed files with 53 additions and 11 deletions

View File

@ -51,13 +51,17 @@ class Boss(QObject):
fl.edit_file.connect(self.edit_file_requested) fl.edit_file.connect(self.edit_file_requested)
self.gui.central.current_editor_changed.connect(self.apply_current_editor_state) self.gui.central.current_editor_changed.connect(self.apply_current_editor_state)
def mkdtemp(self): def mkdtemp(self, prefix=''):
self.container_count += 1 self.container_count += 1
return tempfile.mkdtemp(prefix='%05d-' % self.container_count, dir=self.tdir) return tempfile.mkdtemp(prefix='%s%05d-' % (prefix, self.container_count), dir=self.tdir)
def check_dirtied(self): def check_dirtied(self):
# TODO: Implement this dirtied = {name for name, ed in self.editors.iteritems() if ed.is_modified}
if not dirtied:
return True return True
return question_dialog(self.gui, _('Unsaved changes'), _(
'You have unsaved changes in the files %s. If you proceeed,'
' you will lose them. Proceed anyway?') % ', '.join(dirtied))
def open_book(self, path=None): def open_book(self, path=None):
if not self.check_dirtied(): if not self.check_dirtied():
@ -201,9 +205,15 @@ class Boss(QObject):
# }}} # }}}
def save_book(self): def save_book(self):
c = current_container()
for name, ed in self.editors.iteritems():
if ed.is_modified:
with c.open(name, 'wb') as f:
f.write(ed.data)
ed.is_modified = False
self.gui.action_save.setEnabled(False) self.gui.action_save.setEnabled(False)
tdir = tempfile.mkdtemp(prefix='save-%05d-' % self.container_count, dir=self.tdir) tdir = self.mkdtemp(prefix='save-')
container = clone_container(current_container(), tdir) container = clone_container(c, tdir)
self.save_manager.schedule(tdir, container) self.save_manager.schedule(tdir, container)
def report_save_error(self, tb): def report_save_error(self, tb):
@ -221,7 +231,8 @@ class Boss(QObject):
editor.undo_redo_state_changed.connect(self.editor_undo_redo_state_changed) editor.undo_redo_state_changed.connect(self.editor_undo_redo_state_changed)
self.gui.central.add_editor(name, editor) self.gui.central.add_editor(name, editor)
c = current_container() c = current_container()
editor.load_text(c.decode(c.open(name).read())) with c.open(name) as f:
editor.data = c.decode(f.read())
editor.modification_state_changed.connect(self.editor_modification_state_changed) editor.modification_state_changed.connect(self.editor_modification_state_changed)
self.gui.central.show_editor(editor) self.gui.central.show_editor(editor)
@ -263,7 +274,29 @@ class Boss(QObject):
self.gui.keyboard.set_mode(ed.syntax) self.gui.keyboard.set_mode(ed.syntax)
def do_editor_save(self): def do_editor_save(self):
pass # TODO: Implement this ed = self.gui.central.current_editor
if ed is None:
return
name = None
for n, x in self.editors.iteritems():
if x is ed:
name = n
break
if name is None:
return
c = current_container()
with c.open(name, 'wb') as f:
f.write(ed.data)
ed.is_modified = False
tdir = self.mkdtemp(prefix='save-')
container = clone_container(c, tdir)
self.save_manager.schedule(tdir, container)
is_modified = False
for ed in self.editors.itervalues():
if ed.is_modified:
is_modified = True
break
self.gui.action_save.setEnabled(is_modified)
# Shutdown {{{ # Shutdown {{{
def quit(self): def quit(self):

View File

@ -63,7 +63,7 @@ class TextEdit(QPlainTextEdit):
def fget(self): def fget(self):
return self.document().isModified() return self.document().isModified()
def fset(self, val): def fset(self, val):
self.document.setModified(bool(val)) self.document().setModified(bool(val))
return property(fget=fget, fset=fset) return property(fget=fget, fset=fset)
def sizeHint(self): def sizeHint(self):

View File

@ -8,6 +8,7 @@ __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
from PyQt4.Qt import QMainWindow, Qt, QApplication, pyqtSignal from PyQt4.Qt import QMainWindow, Qt, QApplication, pyqtSignal
from calibre import xml_replace_entities
from calibre.gui2.tweak_book import actions from calibre.gui2.tweak_book import actions
from calibre.gui2.tweak_book.editor.text import TextEdit from calibre.gui2.tweak_book.editor.text import TextEdit
@ -38,8 +39,16 @@ class Editor(QMainWindow):
self.redo_available = available self.redo_available = available
self.undo_redo_state_changed.emit(self.undo_available, self.redo_available) self.undo_redo_state_changed.emit(self.undo_available, self.redo_available)
def load_text(self, raw): @dynamic_property
self.editor.load_text(raw, syntax=self.syntax) def data(self):
def fget(self):
ans = unicode(self.editor.toPlainText())
if self.syntax == 'html':
ans = xml_replace_entities(ans)
return ans.encode('utf-8')
def fset(self, val):
self.editor.load_text(val, syntax=self.syntax)
return property(fget=fget, fset=fset)
def undo(self): def undo(self):
self.editor.undo() self.editor.undo()