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
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):