diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index ce2f89408d..61ed929be8 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -51,13 +51,17 @@ class Boss(QObject): fl.edit_file.connect(self.edit_file_requested) self.gui.central.current_editor_changed.connect(self.apply_current_editor_state) - def mkdtemp(self): + def mkdtemp(self, prefix=''): 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): - # TODO: Implement this - return True + dirtied = {name for name, ed in self.editors.iteritems() if ed.is_modified} + if not dirtied: + 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): if not self.check_dirtied(): @@ -201,9 +205,15 @@ class Boss(QObject): # }}} 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) - tdir = tempfile.mkdtemp(prefix='save-%05d-' % self.container_count, dir=self.tdir) - container = clone_container(current_container(), tdir) + tdir = self.mkdtemp(prefix='save-') + container = clone_container(c, tdir) self.save_manager.schedule(tdir, container) 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) self.gui.central.add_editor(name, editor) 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) self.gui.central.show_editor(editor) @@ -263,7 +274,29 @@ class Boss(QObject): self.gui.keyboard.set_mode(ed.syntax) 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 {{{ def quit(self): diff --git a/src/calibre/gui2/tweak_book/editor/text.py b/src/calibre/gui2/tweak_book/editor/text.py index 741deed9c5..91efa90f8e 100644 --- a/src/calibre/gui2/tweak_book/editor/text.py +++ b/src/calibre/gui2/tweak_book/editor/text.py @@ -63,7 +63,7 @@ class TextEdit(QPlainTextEdit): def fget(self): return self.document().isModified() def fset(self, val): - self.document.setModified(bool(val)) + self.document().setModified(bool(val)) return property(fget=fget, fset=fset) def sizeHint(self): diff --git a/src/calibre/gui2/tweak_book/editor/widget.py b/src/calibre/gui2/tweak_book/editor/widget.py index 72e615a1e7..0619f479f8 100644 --- a/src/calibre/gui2/tweak_book/editor/widget.py +++ b/src/calibre/gui2/tweak_book/editor/widget.py @@ -8,6 +8,7 @@ __copyright__ = '2013, Kovid Goyal ' 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.editor.text import TextEdit @@ -38,8 +39,16 @@ class Editor(QMainWindow): self.redo_available = available self.undo_redo_state_changed.emit(self.undo_available, self.redo_available) - def load_text(self, raw): - self.editor.load_text(raw, syntax=self.syntax) + @dynamic_property + 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): self.editor.undo()