diff --git a/src/calibre/gui2/tweak_book/editor/snippets.py b/src/calibre/gui2/tweak_book/editor/snippets.py index 9853fa03a4..26c244a80a 100644 --- a/src/calibre/gui2/tweak_book/editor/snippets.py +++ b/src/calibre/gui2/tweak_book/editor/snippets.py @@ -159,6 +159,8 @@ class EditorTabStop(object): self.mirrors = tuple(EditorTabStop(left, [ts], editor) for ts in tab_stops[1:]) self.ignore_position_update = False self.join_previous_edit = False + self.transform = None + self.has_transform = self.transform is not None def __enter__(self): self.join_previous_edit = True @@ -271,6 +273,8 @@ class Template(list): return ts ts = self.active_tab_stop if not ts.is_deleted: + if ts.has_transform: + ts.text = ts.transform(ts.text) for m in ts.mirrors: if not m.is_deleted: m.text = ts.text @@ -280,6 +284,15 @@ class Template(list): x.set_editor_cursor(editor) return x + def remains_active(self): + if self.active_tab_stop is None: + return False + ts = self.active_tab_stop + for x in self: + if x.num > ts.num and not x.is_deleted: + return True + return bool(ts.mirrors) or ts.has_transform + def find_closest_tab_stop(self, position): ans = dist = None for c in self: @@ -346,6 +359,9 @@ class SnippetManager(QObject): if at is not None: if at.jump_to_next(editor) is None: self.active_templates.remove(at) + else: + if not at.remains_active(): + self.active_templates.remove(at) ev.accept() return True lst, self.last_selected_text = self.last_selected_text, editor.selected_text