Basic editor actions

This commit is contained in:
Kovid Goyal 2013-11-07 21:08:00 +05:30
parent e1f23c9352
commit f6635f6f1f
3 changed files with 66 additions and 15 deletions

View File

@ -238,6 +238,7 @@ class Boss(QObject):
editor = editors[name] = editor_from_syntax(syntax, self.gui.editor_tabs) editor = editors[name] = editor_from_syntax(syntax, self.gui.editor_tabs)
editor.undo_redo_state_changed.connect(self.editor_undo_redo_state_changed) editor.undo_redo_state_changed.connect(self.editor_undo_redo_state_changed)
editor.data_changed.connect(self.editor_data_changed) editor.data_changed.connect(self.editor_data_changed)
editor.copy_available_state_changed.connect(self.editor_copy_available_state_changed)
c = current_container() c = current_container()
with c.open(name) as f: with c.open(name) as f:
editor.data = c.decode(f.read()) editor.data = c.decode(f.read())
@ -256,6 +257,7 @@ class Boss(QObject):
_('Editing files of type %s is not supported' % mime), show=True) _('Editing files of type %s is not supported' % mime), show=True)
self.edit_file(name, syntax) self.edit_file(name, syntax)
# Editor basic controls {{{
def do_editor_undo(self): def do_editor_undo(self):
ed = self.gui.central.current_editor ed = self.gui.central.current_editor
if ed is not None: if ed is not None:
@ -266,16 +268,35 @@ class Boss(QObject):
if ed is not None: if ed is not None:
ed.redo() ed.redo()
def do_editor_copy(self):
ed = self.gui.central.current_editor
if ed is not None:
ed.copy()
def do_editor_cut(self):
ed = self.gui.central.current_editor
if ed is not None:
ed.cut()
def do_editor_paste(self):
ed = self.gui.central.current_editor
if ed is not None:
ed.paste()
def editor_data_changed(self, editor): def editor_data_changed(self, editor):
self.gui.preview.refresh_timer.start(tprefs['preview_refresh_time'] * 1000) self.gui.preview.refresh_timer.start(tprefs['preview_refresh_time'] * 1000)
def editor_undo_redo_state_changed(self, *args): def editor_undo_redo_state_changed(self, *args):
self.apply_current_editor_state(update_keymap=False) self.apply_current_editor_state(update_keymap=False)
def editor_copy_available_state_changed(self, *args):
self.apply_current_editor_state(update_keymap=False)
def editor_modification_state_changed(self, is_modified): def editor_modification_state_changed(self, is_modified):
self.apply_current_editor_state(update_keymap=False) self.apply_current_editor_state(update_keymap=False)
if is_modified: if is_modified:
actions['save-book'].setEnabled(True) actions['save-book'].setEnabled(True)
# }}}
def apply_current_editor_state(self, update_keymap=True): def apply_current_editor_state(self, update_keymap=True):
ed = self.gui.central.current_editor ed = self.gui.central.current_editor
@ -283,6 +304,8 @@ class Boss(QObject):
actions['editor-undo'].setEnabled(ed.undo_available) actions['editor-undo'].setEnabled(ed.undo_available)
actions['editor-redo'].setEnabled(ed.redo_available) actions['editor-redo'].setEnabled(ed.redo_available)
actions['editor-save'].setEnabled(ed.is_modified) actions['editor-save'].setEnabled(ed.is_modified)
actions['editor-cut'].setEnabled(ed.copy_available)
actions['editor-copy'].setEnabled(ed.cut_available)
self.gui.keyboard.set_mode(ed.syntax) self.gui.keyboard.set_mode(ed.syntax)
name = None name = None
for n, x in editors.iteritems(): for n, x in editors.iteritems():

View File

@ -16,6 +16,7 @@ class Editor(QMainWindow):
modification_state_changed = pyqtSignal(object) modification_state_changed = pyqtSignal(object)
undo_redo_state_changed = pyqtSignal(object, object) undo_redo_state_changed = pyqtSignal(object, object)
copy_available_state_changed = pyqtSignal(object)
data_changed = pyqtSignal(object) data_changed = pyqtSignal(object)
def __init__(self, syntax, parent=None): def __init__(self, syntax, parent=None):
@ -29,20 +30,11 @@ class Editor(QMainWindow):
self.create_toolbars() self.create_toolbars()
self.undo_available = False self.undo_available = False
self.redo_available = False self.redo_available = False
self.copy_available = self.cut_available = False
self.editor.undoAvailable.connect(self._undo_available) self.editor.undoAvailable.connect(self._undo_available)
self.editor.redoAvailable.connect(self._redo_available) self.editor.redoAvailable.connect(self._redo_available)
self.editor.textChanged.connect(self._data_changed) self.editor.textChanged.connect(self._data_changed)
self.editor.copyAvailable.connect(self._copy_available)
def _data_changed(self):
self.data_changed.emit(self)
def _undo_available(self, available):
self.undo_available = available
self.undo_redo_state_changed.emit(self.undo_available, self.redo_available)
def _redo_available(self, available):
self.redo_available = available
self.undo_redo_state_changed.emit(self.undo_available, self.redo_available)
@dynamic_property @dynamic_property
def data(self): def data(self):
@ -73,22 +65,51 @@ class Editor(QMainWindow):
return property(fget=fget, fset=fset) return property(fget=fget, fset=fset)
def create_toolbars(self): def create_toolbars(self):
self.action_bar = b = self.addToolBar(_('Edit actions tool bar')) self.action_bar = b = self.addToolBar(_('File actions tool bar'))
b.setObjectName('action_bar') # Needed for saveState b.setObjectName('action_bar') # Needed for saveState
b.addAction(actions['editor-save']) for x in ('save', 'undo', 'redo'):
b.addAction(actions['editor-undo']) b.addAction(actions['editor-%s' % x])
b.addAction(actions['editor-redo']) self.edit_bar = b = self.addToolBar(_('Edit actions tool bar'))
for x in ('cut', 'copy', 'paste'):
b.addAction(actions['editor-%s' % x])
def break_cycles(self): def break_cycles(self):
self.modification_state_changed.disconnect() self.modification_state_changed.disconnect()
self.undo_redo_state_changed.disconnect() self.undo_redo_state_changed.disconnect()
self.copy_available_state_changed.disconnect()
self.data_changed.disconnect() self.data_changed.disconnect()
self.editor.undoAvailable.disconnect() self.editor.undoAvailable.disconnect()
self.editor.redoAvailable.disconnect() self.editor.redoAvailable.disconnect()
self.editor.modificationChanged.disconnect() self.editor.modificationChanged.disconnect()
self.editor.textChanged.disconnect() self.editor.textChanged.disconnect()
self.editor.copyAvailable.disconnect()
self.editor.setPlainText('') self.editor.setPlainText('')
def _data_changed(self):
self.data_changed.emit(self)
def _undo_available(self, available):
self.undo_available = available
self.undo_redo_state_changed.emit(self.undo_available, self.redo_available)
def _redo_available(self, available):
self.redo_available = available
self.undo_redo_state_changed.emit(self.undo_available, self.redo_available)
def _copy_available(self, available):
self.copy_available = self.cut_available = available
self.copy_available_state_changed.emit(available)
def cut(self):
self.editor.cut()
def copy(self):
self.editor.copy()
def paste(self):
self.editor.paste()
def launch_editor(path_to_edit, path_is_raw=False, syntax='html'): def launch_editor(path_to_edit, path_is_raw=False, syntax='html'):
if path_is_raw: if path_is_raw:
raw = path_to_edit raw = path_to_edit

View File

@ -20,6 +20,7 @@ from calibre.gui2.tweak_book.keyboard import KeyboardManager
from calibre.gui2.tweak_book.preview import Preview from calibre.gui2.tweak_book.preview import Preview
class Central(QStackedWidget): class Central(QStackedWidget):
' The central widget, hosts the editors ' ' The central widget, hosts the editors '
current_editor_changed = pyqtSignal() current_editor_changed = pyqtSignal()
@ -162,6 +163,12 @@ class Main(MainWindow):
_('Redo typing')) _('Redo typing'))
self.action_editor_save = reg('save.png', _('&Save'), self.boss.do_editor_save, 'editor-save', 'Ctrl+S', self.action_editor_save = reg('save.png', _('&Save'), self.boss.do_editor_save, 'editor-save', 'Ctrl+S',
_('Save changes to the current file')) _('Save changes to the current file'))
self.action_editor_cut = reg('edit-cut.png', _('C&ut text'), self.boss.do_editor_cut, 'editor-cut', 'Ctrl+X',
_('Cut text'))
self.action_editor_copy = reg('edit-copy.png', _('&Copy text'), self.boss.do_editor_copy, 'editor-copy', 'Ctrl+C',
_('Copy text'))
self.action_editor_paste = reg('edit-paste.png', _('&Paste text'), self.boss.do_editor_paste, 'editor-paste', 'Ctrl+V',
_('Paste text'))
def create_menubar(self): def create_menubar(self):
b = self.menuBar() b = self.menuBar()