forked from Mirrors/apostrophe
Allow disabling scroll sync
parent
db652ef84f
commit
939edcc762
|
@ -48,6 +48,13 @@
|
||||||
It can cause performance problems to some users.
|
It can cause performance problems to some users.
|
||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
|
<key name='sync-scroll' type='b'>
|
||||||
|
<default>true</default>
|
||||||
|
<summary>Synchronize editor/preview scrolling</summary>
|
||||||
|
<description>
|
||||||
|
Keep the editor and preview scroll positions in sync.
|
||||||
|
</description>
|
||||||
|
</key>
|
||||||
<key name='input-format' type='s'>
|
<key name='input-format' type='s'>
|
||||||
<default>"markdown"</default>
|
<default>"markdown"</default>
|
||||||
<summary>Input format</summary>
|
<summary>Input format</summary>
|
||||||
|
|
|
@ -138,11 +138,11 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="format_label">
|
<object class="GtkLabel" id="sync_scroll_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="label" translatable="yes">Input format</property>
|
<property name="label" translatable="yes">Synchronize editor/preview scrolling</property>
|
||||||
<property name="justify">right</property>
|
<property name="justify">right</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
@ -151,17 +151,29 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="input_format_help_button">
|
<object class="GtkSwitch" id="sync_scroll_switch">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="receives_default">False</property>
|
<property name="halign">end</property>
|
||||||
<property name="image">help</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">2</property>
|
||||||
<property name="top_attach">4</property>
|
<property name="top_attach">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="input_format_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">Input format</property>
|
||||||
|
<property name="justify">right</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkComboBox" id="input_format_combobox">
|
<object class="GtkComboBox" id="input_format_combobox">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -172,9 +184,24 @@
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">2</property>
|
<property name="left_attach">2</property>
|
||||||
<property name="top_attach">4</property>
|
<property name="top_attach">5</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="input_format_help_button">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="image">help</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<placeholder/>
|
<placeholder/>
|
||||||
</child>
|
</child>
|
||||||
|
|
|
@ -188,6 +188,8 @@ class Application(Gtk.Application):
|
||||||
self.window.toggle_gradient_overlay(settings.get_value(key))
|
self.window.toggle_gradient_overlay(settings.get_value(key))
|
||||||
elif key == "input-format":
|
elif key == "input-format":
|
||||||
self.window.reload_preview()
|
self.window.reload_preview()
|
||||||
|
elif key == "sync-scroll":
|
||||||
|
self.window.reload_preview(reshow=True)
|
||||||
elif key == "stat-default":
|
elif key == "stat-default":
|
||||||
self.window.update_default_stat()
|
self.window.update_default_stat()
|
||||||
elif key == "preview-mode":
|
elif key == "preview-mode":
|
||||||
|
|
|
@ -433,8 +433,8 @@ class MainWindow(StyledWindow):
|
||||||
elif self.overlay_id:
|
elif self.overlay_id:
|
||||||
self.scrolled_window.disconnect(self.overlay_id)
|
self.scrolled_window.disconnect(self.overlay_id)
|
||||||
|
|
||||||
def reload_preview(self):
|
def reload_preview(self, reshow=False):
|
||||||
self.preview_handler.reload()
|
self.preview_handler.reload(reshow=reshow)
|
||||||
|
|
||||||
def load_file(self, filename=None):
|
def load_file(self, filename=None):
|
||||||
"""Open File from command line or open / open recent etc."""
|
"""Open File from command line or open / open recent etc."""
|
||||||
|
|
|
@ -82,6 +82,10 @@ class PreferencesDialog:
|
||||||
self.gradient_overlay_switch.set_active(self.settings.get_value("gradient-overlay"))
|
self.gradient_overlay_switch.set_active(self.settings.get_value("gradient-overlay"))
|
||||||
self.gradient_overlay_switch.connect("state-set", self.on_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_store = Gtk.ListStore(int, str)
|
||||||
input_format = self.settings.get_string("input-format")
|
input_format = self.settings.get_string("input-format")
|
||||||
input_format_active = 0
|
input_format_active = 0
|
||||||
|
@ -126,6 +130,10 @@ class PreferencesDialog:
|
||||||
self.settings.set_value("gradient-overlay", GLib.Variant.new_boolean(state))
|
self.settings.set_value("gradient-overlay", GLib.Variant.new_boolean(state))
|
||||||
return False
|
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):
|
def on_input_format(self, combobox):
|
||||||
fmt = self.formats[combobox.get_active()]
|
fmt = self.formats[combobox.get_active()]
|
||||||
self.settings.set_value("input-format", GLib.Variant.new_string(fmt["format"]))
|
self.settings.set_value("input-format", GLib.Variant.new_string(fmt["format"]))
|
||||||
|
|
|
@ -6,6 +6,7 @@ import gi
|
||||||
|
|
||||||
from uberwriter.helpers import get_builder
|
from uberwriter.helpers import get_builder
|
||||||
from uberwriter.preview_renderer import PreviewRenderer
|
from uberwriter.preview_renderer import PreviewRenderer
|
||||||
|
from uberwriter.settings import Settings
|
||||||
|
|
||||||
gi.require_version('WebKit2', '4.0')
|
gi.require_version('WebKit2', '4.0')
|
||||||
from gi.repository import WebKit2, GLib
|
from gi.repository import WebKit2, GLib
|
||||||
|
@ -43,9 +44,11 @@ class PreviewHandler:
|
||||||
|
|
||||||
window.connect("style-updated", self.reload)
|
window.connect("style-updated", self.reload)
|
||||||
|
|
||||||
|
self.text_changed_handler_id = None
|
||||||
|
|
||||||
|
self.settings = Settings.new()
|
||||||
self.web_scroll_handler_id = None
|
self.web_scroll_handler_id = None
|
||||||
self.text_scroll_handler_id = None
|
self.text_scroll_handler_id = None
|
||||||
self.text_changed_handler_id = None
|
|
||||||
|
|
||||||
self.loading = False
|
self.loading = False
|
||||||
self.shown = False
|
self.shown = False
|
||||||
|
@ -78,7 +81,7 @@ class PreviewHandler:
|
||||||
if self.web_view.is_loading():
|
if self.web_view.is_loading():
|
||||||
self.web_view_pending_html = html
|
self.web_view_pending_html = html
|
||||||
else:
|
else:
|
||||||
self.web_view.load_html(html, 'file://localhost/')
|
self.web_view.load_html(html, "file://localhost/")
|
||||||
|
|
||||||
elif step == Step.RENDER:
|
elif step == Step.RENDER:
|
||||||
# Last step: show the preview. This is a one-time step.
|
# Last step: show the preview. This is a one-time step.
|
||||||
|
@ -86,32 +89,41 @@ class PreviewHandler:
|
||||||
return
|
return
|
||||||
self.shown = True
|
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())
|
GLib.idle_add(self.web_view.set_scroll_scale, self.text_view.get_scroll_scale())
|
||||||
|
|
||||||
self.preview_renderer.show(self.web_view)
|
self.preview_renderer.show(self.web_view)
|
||||||
|
|
||||||
self.text_changed_handler_id = \
|
if self.settings.get_boolean("sync-scroll"):
|
||||||
self.text_view.get_buffer().connect("changed", self.__show)
|
self.web_scroll_handler_id = \
|
||||||
self.web_scroll_handler_id = \
|
self.web_view.connect("scroll-scale-changed", self.on_web_view_scrolled)
|
||||||
self.web_view.connect("scroll-scale-changed", self.on_web_view_scrolled)
|
self.text_scroll_handler_id = \
|
||||||
self.text_scroll_handler_id = \
|
self.text_view.connect("scroll-scale-changed", self.on_text_view_scrolled)
|
||||||
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 self.shown:
|
||||||
|
if reshow:
|
||||||
|
self.hide()
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def hide(self):
|
def hide(self):
|
||||||
if self.shown:
|
if self.shown:
|
||||||
self.shown = False
|
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())
|
GLib.idle_add(self.text_view.set_scroll_scale, self.web_view.get_scroll_scale())
|
||||||
|
|
||||||
self.preview_renderer.hide(self.web_view)
|
self.preview_renderer.hide(self.web_view)
|
||||||
|
|
||||||
self.text_view.get_buffer().disconnect(self.text_changed_handler_id)
|
if self.text_scroll_handler_id:
|
||||||
self.text_view.disconnect(self.text_scroll_handler_id)
|
self.text_view.disconnect(self.text_scroll_handler_id)
|
||||||
self.web_view.disconnect(self.web_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:
|
if self.loading:
|
||||||
self.loading = False
|
self.loading = False
|
||||||
|
|
|
@ -18,6 +18,8 @@ class PreviewRenderer:
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, main_window, content, editor, text_view, preview, mode_revealer, mode_button):
|
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.content = content
|
||||||
self.editor = editor
|
self.editor = editor
|
||||||
self.text_view = text_view
|
self.text_view = text_view
|
||||||
|
@ -25,14 +27,13 @@ class PreviewRenderer:
|
||||||
self.mode_revealer = mode_revealer
|
self.mode_revealer = mode_revealer
|
||||||
self.mode_button = mode_button
|
self.mode_button = mode_button
|
||||||
self.mode_button.connect("clicked", self.show_mode_popover)
|
self.mode_button.connect("clicked", self.show_mode_popover)
|
||||||
self.popover = None
|
|
||||||
self.settings = Settings.new()
|
self.settings = Settings.new()
|
||||||
self.main_window = main_window
|
self.popover = None
|
||||||
self.main_window.connect("delete-event", self.on_window_closed)
|
|
||||||
self.window = None
|
self.window = None
|
||||||
self.headerbar = None
|
self.headerbar = None
|
||||||
self.mode = self.settings.get_enum("preview-mode")
|
|
||||||
|
|
||||||
|
self.mode = self.settings.get_enum("preview-mode")
|
||||||
self.update_mode()
|
self.update_mode()
|
||||||
|
|
||||||
def show(self, web_view):
|
def show(self, web_view):
|
||||||
|
|
Loading…
Reference in New Issue