From 939edcc762a2261387c862e564a5f13ca7ac4228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Silva?= Date: Sat, 27 Apr 2019 04:56:26 +0100 Subject: [PATCH] Allow disabling scroll sync --- data/de.wolfvollprecht.UberWriter.gschema.xml | 7 ++++ data/ui/Preferences.ui | 41 +++++++++++++++---- uberwriter/application.py | 2 + uberwriter/main_window.py | 4 +- uberwriter/preferences_dialog.py | 8 ++++ uberwriter/preview_handler.py | 36 ++++++++++------ uberwriter/preview_renderer.py | 9 ++-- 7 files changed, 82 insertions(+), 25 deletions(-) diff --git a/data/de.wolfvollprecht.UberWriter.gschema.xml b/data/de.wolfvollprecht.UberWriter.gschema.xml index c9e45ec..664870c 100644 --- a/data/de.wolfvollprecht.UberWriter.gschema.xml +++ b/data/de.wolfvollprecht.UberWriter.gschema.xml @@ -48,6 +48,13 @@ It can cause performance problems to some users. + + true + Synchronize editor/preview scrolling + + Keep the editor and preview scroll positions in sync. + + "markdown" Input format diff --git a/data/ui/Preferences.ui b/data/ui/Preferences.ui index b057517..d02cdd7 100644 --- a/data/ui/Preferences.ui +++ b/data/ui/Preferences.ui @@ -138,11 +138,11 @@ - + True False start - Input format + Synchronize editor/preview scrolling right @@ -151,17 +151,29 @@ - + True True - False - help + end - 1 + 2 4 + + + True + False + start + Input format + right + + + 0 + 5 + + True @@ -172,9 +184,24 @@ 2 - 4 + 5 + + + True + True + False + help + + + 1 + 5 + + + + + diff --git a/uberwriter/application.py b/uberwriter/application.py index fdabda9..449deda 100644 --- a/uberwriter/application.py +++ b/uberwriter/application.py @@ -188,6 +188,8 @@ class Application(Gtk.Application): self.window.toggle_gradient_overlay(settings.get_value(key)) elif key == "input-format": self.window.reload_preview() + elif key == "sync-scroll": + self.window.reload_preview(reshow=True) elif key == "stat-default": self.window.update_default_stat() elif key == "preview-mode": diff --git a/uberwriter/main_window.py b/uberwriter/main_window.py index 460374c..b8db702 100644 --- a/uberwriter/main_window.py +++ b/uberwriter/main_window.py @@ -433,8 +433,8 @@ class MainWindow(StyledWindow): elif self.overlay_id: self.scrolled_window.disconnect(self.overlay_id) - def reload_preview(self): - self.preview_handler.reload() + def reload_preview(self, reshow=False): + self.preview_handler.reload(reshow=reshow) def load_file(self, filename=None): """Open File from command line or open / open recent etc.""" diff --git a/uberwriter/preferences_dialog.py b/uberwriter/preferences_dialog.py index 190d5a1..b875b1e 100644 --- a/uberwriter/preferences_dialog.py +++ b/uberwriter/preferences_dialog.py @@ -82,6 +82,10 @@ class PreferencesDialog: self.gradient_overlay_switch.set_active(self.settings.get_value("gradient-overlay")) self.gradient_overlay_switch.connect("state-set", self.on_gradient_overlay) + self.sync_scroll_switch = self.builder.get_object("sync_scroll_switch") + self.sync_scroll_switch.set_active(self.settings.get_value("sync-scroll")) + self.sync_scroll_switch.connect("state-set", self.on_sync_scroll) + input_format_store = Gtk.ListStore(int, str) input_format = self.settings.get_string("input-format") input_format_active = 0 @@ -126,6 +130,10 @@ class PreferencesDialog: self.settings.set_value("gradient-overlay", GLib.Variant.new_boolean(state)) return False + def on_sync_scroll(self, _, state): + self.settings.set_value("sync-scroll", GLib.Variant.new_boolean(state)) + return False + def on_input_format(self, combobox): fmt = self.formats[combobox.get_active()] self.settings.set_value("input-format", GLib.Variant.new_string(fmt["format"])) diff --git a/uberwriter/preview_handler.py b/uberwriter/preview_handler.py index cb00cd4..7110e44 100644 --- a/uberwriter/preview_handler.py +++ b/uberwriter/preview_handler.py @@ -6,6 +6,7 @@ import gi from uberwriter.helpers import get_builder from uberwriter.preview_renderer import PreviewRenderer +from uberwriter.settings import Settings gi.require_version('WebKit2', '4.0') from gi.repository import WebKit2, GLib @@ -43,9 +44,11 @@ class PreviewHandler: window.connect("style-updated", self.reload) + self.text_changed_handler_id = None + + self.settings = Settings.new() self.web_scroll_handler_id = None self.text_scroll_handler_id = None - self.text_changed_handler_id = None self.loading = False self.shown = False @@ -78,7 +81,7 @@ class PreviewHandler: if self.web_view.is_loading(): self.web_view_pending_html = html else: - self.web_view.load_html(html, 'file://localhost/') + self.web_view.load_html(html, "file://localhost/") elif step == Step.RENDER: # Last step: show the preview. This is a one-time step. @@ -86,32 +89,41 @@ class PreviewHandler: return self.shown = True + self.text_changed_handler_id = \ + self.text_view.get_buffer().connect("changed", self.__show) + GLib.idle_add(self.web_view.set_scroll_scale, self.text_view.get_scroll_scale()) self.preview_renderer.show(self.web_view) - self.text_changed_handler_id = \ - self.text_view.get_buffer().connect("changed", self.__show) - self.web_scroll_handler_id = \ - self.web_view.connect("scroll-scale-changed", self.on_web_view_scrolled) - self.text_scroll_handler_id = \ - self.text_view.connect("scroll-scale-changed", self.on_text_view_scrolled) + if self.settings.get_boolean("sync-scroll"): + self.web_scroll_handler_id = \ + self.web_view.connect("scroll-scale-changed", self.on_web_view_scrolled) + self.text_scroll_handler_id = \ + self.text_view.connect("scroll-scale-changed", self.on_text_view_scrolled) - def reload(self, *_): + def reload(self, *_widget, reshow=False): if self.shown: + if reshow: + self.hide() self.show() def hide(self): if self.shown: self.shown = False + self.text_view.get_buffer().disconnect(self.text_changed_handler_id) + GLib.idle_add(self.text_view.set_scroll_scale, self.web_view.get_scroll_scale()) self.preview_renderer.hide(self.web_view) - self.text_view.get_buffer().disconnect(self.text_changed_handler_id) - self.text_view.disconnect(self.text_scroll_handler_id) - self.web_view.disconnect(self.web_scroll_handler_id) + if self.text_scroll_handler_id: + self.text_view.disconnect(self.text_scroll_handler_id) + self.text_scroll_handler_id = None + if self.web_scroll_handler_id: + self.web_view.disconnect(self.web_scroll_handler_id) + self.web_scroll_handler_id = None if self.loading: self.loading = False diff --git a/uberwriter/preview_renderer.py b/uberwriter/preview_renderer.py index 99aba49..2185486 100644 --- a/uberwriter/preview_renderer.py +++ b/uberwriter/preview_renderer.py @@ -18,6 +18,8 @@ class PreviewRenderer: def __init__( self, main_window, content, editor, text_view, preview, mode_revealer, mode_button): + self.main_window = main_window + self.main_window.connect("delete-event", self.on_window_closed) self.content = content self.editor = editor self.text_view = text_view @@ -25,14 +27,13 @@ class PreviewRenderer: self.mode_revealer = mode_revealer self.mode_button = mode_button self.mode_button.connect("clicked", self.show_mode_popover) - self.popover = None + self.settings = Settings.new() - self.main_window = main_window - self.main_window.connect("delete-event", self.on_window_closed) + self.popover = None self.window = None self.headerbar = None - self.mode = self.settings.get_enum("preview-mode") + self.mode = self.settings.get_enum("preview-mode") self.update_mode() def show(self, web_view):