From c3f536017aff2453df35aea1657ea4043d9a76f4 Mon Sep 17 00:00:00 2001 From: Tobias Manske Date: Fri, 24 Mar 2023 21:48:44 +0100 Subject: [PATCH] WIP: Keep scroll position steady --- src/__init__.py | 40 +++++++++++++++++++++++++++++++++++----- src/config.json | 3 ++- src/config.md | 3 +++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 3e7fd9e..ae4889f 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -19,6 +19,7 @@ class EditorPreview(object): def __init__(self): gui_hooks.editor_did_init.append(self.editor_init_hook) gui_hooks.editor_did_init_buttons.append(self.editor_init_button_hook) + self.scrollLock = config["enableScrollLockByDefault"] if int(buildinfo.version.split(".")[2]) < 45: # < 2.1.45 self.js = [ "js/vendor/jquery.min.js", @@ -86,20 +87,38 @@ class EditorPreview(object): split = self._get_splitter(editor) layout.insertWidget(web_index, split) + def isScrollLocked(self): + return self.scrollLock + + def toggleScrollLock(self): + self.scrollLock = not self.scrollLock + def editor_note_hook(self, editor): - self.onedit_hook(editor, editor.note) + # Dont lock the editor in place when loading a new note + # i.e. when using the cards browser + self.onedit_hook(editor, editor.note, keep_scrollbar_value=False) def editor_init_button_hook(self, buttons, editor): addon_path = os.path.dirname(__file__) icons_dir = os.path.join(addon_path, "icons") - b = editor.addButton( + previewButton = editor.addButton( icon=os.path.join(icons_dir, "file.svg"), cmd="_editor_toggle_preview", tip="Toggle Live Preview", func=lambda o=editor: self.onEditorPreviewButton(o), disables=False, ) - buttons.append(b) + scrollLockButton = editor.addButton( + # icon=os.path.join(icons_dir, "file.svg"), + icon=None, + label="🔒", + cmd="_editor_toggle_scroll_lock", + tip="Toggle Scroll Locking", + func=lambda o=editor: self.onEditorScrollLockButton(o), + disables=True, + ) + buttons.append(previewButton) + buttons.append(scrollLockButton) def onEditorPreviewButton(self, origin: editor.Editor): if origin.editor_preview.isHidden(): @@ -107,18 +126,29 @@ class EditorPreview(object): else: origin.editor_preview.hide() + def onEditorScrollLockButton(self, origin: editor.Editor): + self.toggleScrollLock() + def _obtainCardText(self, note): c = note.ephemeral_card() a = mw.prepare_card_text_for_display(c.answer()) a = gui_hooks.card_will_show(a, c, "clayoutAnswer") - bodyclass = theme_manager.body_classes_for_card_ord(c.ord, theme_manager.night_mode) + bodyclass = theme_manager.body_classes_for_card_ord( + c.ord, theme_manager.night_mode + ) bodyclass += " editor-preview" return f"_showAnswer({json.dumps(a)},'{bodyclass}');" - def onedit_hook(self, editor, origin): + def onedit_hook(self, editor, origin, keep_scrollbar_value=True): if editor.note == origin: + page: QWebEnginePage = editor.editor_preview.page() + scrollbar_value = page.scrollPosition() editor.editor_preview.eval(self._obtainCardText(editor.note)) + if keep_scrollbar_value and self.isScrollLocked(): + page.runJavaScript( + f"window.scrollTo({scrollbar_value.x()}, {scrollbar_value.y()});" + ) eprev = EditorPreview() diff --git a/src/config.json b/src/config.json index 8ab917f..4612117 100644 --- a/src/config.json +++ b/src/config.json @@ -1,5 +1,6 @@ { "showPreviewAutomatically": true, "splitRatio": "1:1", - "location": "below" + "location": "below", + "enableScrollLockByDefault": true } diff --git a/src/config.md b/src/config.md index 2acf2c8..e9ad26e 100644 --- a/src/config.md +++ b/src/config.md @@ -7,3 +7,6 @@ \- `location` [string (above | below | left | right)]:
   Defines where to render the preview (default: below)
+\- `showPreviewAutomatically` [boolean (true | false)]:
+   Whether to keep the scrollbar at the same location when text changed or not (default: true)
+