Allow disabling scroll sync

github/fork/yochananmarqos/patch-1
Gonçalo Silva 2019-04-27 04:56:26 +01:00
parent db652ef84f
commit 939edcc762
7 changed files with 82 additions and 25 deletions

View File

@ -48,6 +48,13 @@
It can cause performance problems to some users.
</description>
</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'>
<default>"markdown"</default>
<summary>Input format</summary>

View File

@ -138,11 +138,11 @@
</packing>
</child>
<child>
<object class="GtkLabel" id="format_label">
<object class="GtkLabel" id="sync_scroll_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="label" translatable="yes">Synchronize editor/preview scrolling</property>
<property name="justify">right</property>
</object>
<packing>
@ -151,17 +151,29 @@
</packing>
</child>
<child>
<object class="GtkButton" id="input_format_help_button">
<object class="GtkSwitch" id="sync_scroll_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="image">help</property>
<property name="halign">end</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="left_attach">2</property>
<property name="top_attach">4</property>
</packing>
</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>
<object class="GtkComboBox" id="input_format_combobox">
<property name="visible">True</property>
@ -172,9 +184,24 @@
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">4</property>
<property name="top_attach">5</property>
</packing>
</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>
<placeholder/>
</child>

View File

@ -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":

View File

@ -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."""

View File

@ -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"]))

View File

@ -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

View File

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