mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Implement saving for individual editors
This commit is contained in:
parent
39228513f4
commit
bcd9e53904
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user