Viewer: Fix number of columns not auto-adjusting when font size is changed until a subsequent chapter change occurs

This commit is contained in:
Kovid Goyal 2020-02-22 10:05:57 +05:30
parent 08e6d01928
commit 42d5db549d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 51 additions and 9 deletions

View File

@ -288,6 +288,7 @@ class ViewerBridge(Bridge):
set_system_palette = to_js()
show_search_result = to_js()
prepare_for_close = to_js()
viewer_font_size_changed = to_js()
def apply_font_settings(page_or_view):
@ -309,6 +310,8 @@ def apply_font_settings(page_or_view):
sf = fs.get('standard_font') or 'serif'
sf = getattr(s, {'serif': 'SerifFont', 'sans': 'SansSerifFont', 'mono': 'FixedFont'}[sf])
s.setFontFamily(s.StandardFont, s.fontFamily(sf))
old_minimum = s.fontSize(s.MinimumFontSize)
old_base = s.fontSize(s.DefaultFontSize)
mfs = fs.get('minimum_font_size')
if mfs is None:
s.resetFontSize(s.MinimumFontSize)
@ -318,6 +321,10 @@ def apply_font_settings(page_or_view):
if bfs is not None:
s.setFontSize(s.DefaultFontSize, bfs)
font_size_changed = old_minimum != s.fontSize(s.MinimumFontSize) or old_base != s.fontSize(s.DefaultFontSize)
if font_size_changed and hasattr(page_or_view, 'execute_when_ready'):
page_or_view.execute_when_ready('viewer_font_size_changed')
return s
@ -610,7 +617,7 @@ class WebView(RestartingWebEngineView):
def set_session_data(self, key, val):
if key == '*' and val is None:
vprefs['session_data'] = {}
apply_font_settings(self._page)
apply_font_settings(self)
self.paged_mode_changed.emit()
self.standalone_misc_settings_changed.emit()
elif key != '*':
@ -618,7 +625,7 @@ class WebView(RestartingWebEngineView):
sd[key] = val
vprefs['session_data'] = sd
if key in ('standalone_font_settings', 'base_font_size'):
apply_font_settings(self._page)
apply_font_settings(self)
elif key == 'read_mode':
self.paged_mode_changed.emit()
elif key == 'standalone_misc_settings':

View File

@ -24,11 +24,11 @@ from read_book.mathjax import apply_mathjax
from read_book.paged_mode import (
anchor_funcs as paged_anchor_funcs,
auto_scroll_action as paged_auto_scroll_action, calc_columns_per_screen,
current_cfi, handle_gesture as paged_handle_gesture,
handle_shortcut as paged_handle_shortcut, jump_to_cfi as paged_jump_to_cfi,
layout as paged_layout, onwheel as paged_onwheel,
prepare_for_resize as paged_prepare_for_resize, progress_frac,
reset_paged_mode_globals, resize_done as paged_resize_done,
will_columns_per_screen_change, current_cfi,
handle_gesture as paged_handle_gesture, handle_shortcut as paged_handle_shortcut,
jump_to_cfi as paged_jump_to_cfi, layout as paged_layout,
onwheel as paged_onwheel, prepare_for_resize as paged_prepare_for_resize,
progress_frac, reset_paged_mode_globals, resize_done as paged_resize_done,
scroll_by_page as paged_scroll_by_page, scroll_to_elem,
scroll_to_fraction as paged_scroll_to_fraction, snap_to_selection
)
@ -44,8 +44,9 @@ from read_book.shortcuts import (
create_shortcut_map, keyevent_as_shortcut, shortcut_for_key_event
)
from read_book.toc import update_visible_toc_anchors
from read_book.touch import (create_handlers as create_touch_handlers,
reset_handlers as reset_touch_handlers)
from read_book.touch import (
create_handlers as create_touch_handlers, reset_handlers as reset_touch_handlers
)
from read_book.viewport import scroll_viewport
from utils import (
apply_cloned_selection, clone_selection, debounce, html_escape, is_ios
@ -99,6 +100,7 @@ class IframeBoss:
handlers = {
'change_color_scheme': self.change_color_scheme,
'change_font_size': self.change_font_size,
'viewer_font_size_changed': self.viewer_font_size_changed,
'change_scroll_speed': self.change_scroll_speed,
'display': self.display,
'find': self.find,
@ -264,10 +266,29 @@ class IframeBoss:
else:
paged_scroll_by_page(backwards, data.all_pages_on_screen)
def change_font_size(self, data):
if data.base_font_size? and data.base_font_size != opts.base_font_size:
opts.base_font_size = data.base_font_size
apply_font_size()
if not runtime.is_standalone_viewer:
# in the standalone viewer this is a separate event as
# apply_font_size() is a no-op
self.relayout_on_font_size_change()
def viewer_font_size_changed(self, data):
opts.base_font_size = data.base_font_size
self.relayout_on_font_size_change()
def relayout_on_font_size_change(self):
if current_layout_mode() is not 'flow' and will_columns_per_screen_change():
self.do_layout(self.is_titlepage)
if self.last_cfi:
cfi = self.last_cfi[len('epubcfi(/'):-1].partition('/')[2]
if cfi:
paged_jump_to_cfi('/' + cfi)
self.update_cfi()
self.update_toc_position()
def change_scroll_speed(self, data):
if data.lines_per_sec_auto?:

View File

@ -152,6 +152,10 @@ def calc_columns_per_screen():
return cps
def will_columns_per_screen_change():
return calc_columns_per_screen() != cols_per_screen
def layout(is_single_page, on_resize):
nonlocal _in_paged_mode, col_width, col_and_gap, screen_height, gap, screen_width, is_full_screen_layout, cols_per_screen, number_of_cols
body_style = window.getComputedStyle(document.body)

View File

@ -1066,6 +1066,9 @@ class View:
def update_font_size(self):
self.iframe_wrapper.send_message('change_font_size', base_font_size=get_session_data().get('base_font_size'))
def viewer_font_size_changed(self):
self.iframe_wrapper.send_message('viewer_font_size_changed', base_font_size=get_session_data().get('base_font_size'))
def update_scroll_speed(self, amt):
self.iframe_wrapper.send_message('change_scroll_speed', lines_per_sec_auto=change_scroll_speed(amt))

View File

@ -300,6 +300,13 @@ def prepare_for_close():
else:
ui_operations.close_prep_finished(None)
@from_python
def viewer_font_size_changed():
if view:
view.viewer_font_size_changed()
def onerror(msg, script_url, line_number, column_number, error_object):
if not error_object:
# cross domain error