Viewer: Keyboard shortcuts to change number of columns (Ctrl+[ and Ctrl+])

This commit is contained in:
Kovid Goyal 2020-02-26 09:08:45 +05:30
parent afcb54df1e
commit edcdafe536
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 60 additions and 9 deletions

View File

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

View File

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

View File

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

View File

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