diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index 30171d21db..e5830a4159 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -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': diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index 00facccc43..08b809f2e6 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -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?: diff --git a/src/pyj/read_book/paged_mode.pyj b/src/pyj/read_book/paged_mode.pyj index 7acfa0c223..5c6f2bbab4 100644 --- a/src/pyj/read_book/paged_mode.pyj +++ b/src/pyj/read_book/paged_mode.pyj @@ -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) diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 4dc7d98133..087defc5ac 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -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)) diff --git a/src/pyj/viewer-main.pyj b/src/pyj/viewer-main.pyj index adab0bef94..bab68c0464 100644 --- a/src/pyj/viewer-main.pyj +++ b/src/pyj/viewer-main.pyj @@ -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