From edcdafe53683fdfa8fab6a7a43f8a15e8bea1b44 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 26 Feb 2020 09:08:45 +0530 Subject: [PATCH] Viewer: Keyboard shortcuts to change number of columns (Ctrl+[ and Ctrl+]) --- src/pyj/read_book/iframe.pyj | 33 +++++++++++++++++++++++--------- src/pyj/read_book/paged_mode.pyj | 5 +++++ src/pyj/read_book/shortcuts.pyj | 18 +++++++++++++++++ src/pyj/read_book/view.pyj | 13 +++++++++++++ 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index 08b809f2e6..695dc2dab4 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -24,13 +24,14 @@ 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, - 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, + current_cfi, get_columns_per_screen_data, 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 + scroll_to_fraction as paged_scroll_to_fraction, snap_to_selection, + will_columns_per_screen_change ) from read_book.referencing import ( elem_for_ref, end_reference_mode, start_reference_mode @@ -100,7 +101,8 @@ 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_number_of_columns': self.change_number_of_columns, + 'number_of_columns_changed': self.number_of_columns_changed, 'change_scroll_speed': self.change_scroll_speed, 'display': self.display, 'find': self.find, @@ -276,9 +278,18 @@ class IframeBoss: # 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 + def change_number_of_columns(self, data): + if current_layout_mode() is 'flow': + return + cdata = get_columns_per_screen_data() + delta = int(data.delta) + if delta is 0: + new_val = 0 + else: + new_val = max(1, cdata.cps + delta) + opts.columns_per_screen[cdata.which] = new_val self.relayout_on_font_size_change() + self.send_message('columns_per_screen_changed', which=cdata.which, cps=new_val) def relayout_on_font_size_change(self): if current_layout_mode() is not 'flow' and will_columns_per_screen_change(): @@ -290,6 +301,10 @@ class IframeBoss: self.update_cfi() self.update_toc_position() + def number_of_columns_changed(self, data): + opts.columns_per_screen = data.columns_per_screen + self.relayout_on_font_size_change() + def change_scroll_speed(self, data): if data.lines_per_sec_auto?: opts.lines_per_sec_auto = data.lines_per_sec_auto diff --git a/src/pyj/read_book/paged_mode.pyj b/src/pyj/read_book/paged_mode.pyj index 5c6f2bbab4..e2bb712378 100644 --- a/src/pyj/read_book/paged_mode.pyj +++ b/src/pyj/read_book/paged_mode.pyj @@ -152,6 +152,11 @@ def calc_columns_per_screen(): return cps +def get_columns_per_screen_data(): + which = 'landscape' if scroll_viewport.width() > scroll_viewport.height() else 'portrait' + return {'which': which, 'cps': calc_columns_per_screen()} + + def will_columns_per_screen_change(): return calc_columns_per_screen() != cols_per_screen diff --git a/src/pyj/read_book/shortcuts.pyj b/src/pyj/read_book/shortcuts.pyj index 8c69a0aece..437ca8d6af 100644 --- a/src/pyj/read_book/shortcuts.pyj +++ b/src/pyj/read_book/shortcuts.pyj @@ -216,6 +216,24 @@ def shortcuts_definition(): _('Decrease font size'), ), + 'increase_number_of_columns': desc( + v"['Ctrl+]']", + 'ui', + _('Increase number of columns'), + ), + + 'decrease_number_of_columns': desc( + v"['Ctrl+[']", + 'ui', + _('Decrease number of columns'), + ), + + 'reset_number_of_columns': desc( + v"['Ctrl+Alt+c']", + 'ui', + _('Make number of columns automatic'), + ), + 'toggle_full_screen': desc( v"['F11', 'Ctrl+Shift+F']", 'ui', diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 01918d668e..62d06c9b5c 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -237,6 +237,7 @@ class View: 'request_size': self.on_request_size, 'scroll_to_anchor': self.on_scroll_to_anchor, 'selectionchange': self.on_selection_change, + 'columns_per_screen_changed': self.on_columns_per_screen_changed, 'show_chrome': self.show_chrome, 'show_footnote': self.on_show_footnote, 'update_cfi': self.on_update_cfi, @@ -453,6 +454,12 @@ class View: self.toggle_autoscroll() elif data.name.startsWith('switch_color_scheme:'): self.switch_color_scheme(data.name.partition(':')[-1]) + elif data.name is 'increase_number_of_columns': + self.iframe_wrapper.send_message('change_number_of_columns', delta=1) + elif data.name is 'decrease_number_of_columns': + self.iframe_wrapper.send_message('change_number_of_columns', delta=-1) + elif data.name is 'reset_number_of_columns': + self.iframe_wrapper.send_message('change_number_of_columns', delta=0) else: self.iframe_wrapper.send_message('handle_navigation_shortcut', name=data.name) @@ -461,6 +468,12 @@ class View: if ui_operations.selection_changed: ui_operations.selection_changed(data.text) + def on_columns_per_screen_changed(self, data): + sd = get_session_data() + cps = sd.get('columns_per_screen') or {} + cps[data.which] = int(data.cps) + sd.set('columns_per_screen', cps) + def switch_color_scheme(self, name): get_session_data().set('current_color_scheme', name) ui_operations.redisplay_book()