Work on preferences UI for keyboard shortcuts

This commit is contained in:
Kovid Goyal 2019-08-24 07:30:14 +05:30
parent 2523d6605e
commit e91e414687
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
7 changed files with 113 additions and 9 deletions

View File

@ -48,9 +48,12 @@ def build_list(container, items, subtitle):
div.appendChild(E.div(item.subtitle, class_='item-subtitle', style='padding-top:1ex'))
if item.action:
ul.lastChild.addEventListener('click', item.action)
if item.data:
ul.lastChild.dataset.userData = item.data
def create_item(title, action=None, subtitle=None, icon=None):
return {'title':title, 'action':action, 'subtitle':subtitle, 'icon':icon}
def create_item(title, action=None, subtitle=None, icon=None, data=None):
return {'title':title, 'action':action, 'subtitle':subtitle, 'icon':icon, 'data': data}
def create_item_list(container, items, subtitle=None):

View File

@ -153,7 +153,7 @@ class IframeBoss:
self._handle_gesture = paged_handle_gesture
self.anchor_funcs = paged_anchor_funcs
update_settings(data.settings)
self.keyboard_shortcut_map = create_shortcut_map()
self.keyboard_shortcut_map = create_shortcut_map(data.keyboard_shortcuts)
set_current_spine_item({'name':data.name, 'is_first':index is 0, 'is_last':index is spine.length - 1, 'initial_position':data.initial_position})
self.last_cfi = None
for name in self.blob_url_map:

View File

@ -0,0 +1,89 @@
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
from __python__ import bound_methods, hash_literals
from elementmaker import E
from gettext import gettext as _
from book_list.globals import get_session_data
from book_list.item_list import create_item, create_item_list
from dom import unique_id
from read_book.shortcuts import GROUP_DESC, SHORTCUTS
from widgets import create_button
def get_container():
return document.getElementById(get_container.id)
def restore_defaults():
pass
def as_groups(shortcuts):
ans = {}
for sc_name in Object.keys(shortcuts):
sc = shortcuts[sc_name]
if not ans[sc.group]:
ans[sc.group] = {}
ans[sc.group][sc_name] = sc
return ans
def sort_group_key(group, sc_name):
return group[sc_name].short.toLowerCase()
def sc_as_item(sc_name, sc):
return create_item(sc.short, action=customize_shortcut.bind(None, sc_name), subtitle=sc.long, data=JSON.stringify({'name': sc_name, 'shortcuts': sc.shortcuts}))
def customize_shortcut(sc_name):
container = get_container()
container.firstChild.style.display = 'none'
container.lastChild.style.display = 'block'
sc = SHORTCUTS[sc_name]
container.appendChild(E.h4(sc.short))
if sc.long:
container.appendChild(E.div(sc.long, style='font-style: italic; font-size: smaller; margin-top: 1ex'))
container.appendChild(E.div(_('Existing shortcuts:')))
for key in sc.shortcuts:
container.appendChild(E.div(style='margin-top: 1ex', key_widget(key)))
container.appendChild(E.div(style='margin-top:1ex; display:flex; justify-content: flex-end',
create_button(_('OK'), action=close_customize_shortcut.bind(None, True)),
E.span('\xa0'),
create_button(_('Cancel'), action=close_customize_shortcut.bind(None, False)),
))
def create_keyboard_panel(container):
container.appendChild(E.div(id=unique_id('keyboard-settings'), style='margin: 1rem'))
container = container.lastChild
get_container.id = container.id
container.appendChild(E.div())
container.appendChild(E.div(style='display: none'))
container = container.firstChild
groups = as_groups(SHORTCUTS)
items = []
for group_name in Object.keys(groups):
container.appendChild(E.h3(GROUP_DESC[group_name]))
group = groups[group_name]
for sc_name in sorted(Object.keys(group), key=sort_group_key.bind(None, group)):
sc = group[sc_name]
items.push(sc_as_item(sc_name, sc))
container.appendChild(E.div())
create_item_list(container.lastChild, items)
container.appendChild(E.div(
style='margin-top: 1rem', create_button(_('Restore defaults'), action=restore_defaults)
))
develop = create_keyboard_panel
def commit_keyboard(onchange):
sd = get_session_data()
vals = {}
sd.set('standalone_misc_settings', vals)

View File

@ -11,6 +11,7 @@ from read_book.globals import runtime
from read_book.prefs.colors import commit_colors, create_colors_panel
from read_book.prefs.fonts import commit_fonts, create_fonts_panel
from read_book.prefs.head_foot import commit_head_foot, create_head_foot_panel
from read_book.prefs.keyboard import commit_keyboard, create_keyboard_panel
from read_book.prefs.layout import commit_layout, create_layout_panel
from read_book.prefs.misc import commit_misc, create_misc_panel
from read_book.prefs.user_stylesheet import (
@ -70,6 +71,7 @@ class Prefs:
create_item(_('Page layout'), def():self.show_panel('layout');, _('Page margins and number of pages per screen')),
create_item(_('User style sheet'), def():self.show_panel('user_stylesheet');, _('Style rules for text')),
create_item(_('Headers and footers'), def():self.show_panel('head_foot');, _('Customize the headers and footers')),
create_item(_('Keyboard shortcuts'), def():self.show_panel('keyboard');, _('Customize the keyboard shortcuts')),
]
if runtime.is_standalone_viewer:
items.push(create_item(
@ -120,6 +122,13 @@ class Prefs:
def close_head_foot(self):
commit_head_foot(self.onchange, self.container)
def display_keyboard(self, container):
document.getElementById(self.title_id).textContent = _('Keyboard shortcuts')
create_keyboard_panel(container)
def close_keyboard(self):
commit_keyboard(self.onchange, self.container)
def create_prefs_panel(container, close_func, on_change):
Prefs(container, close_func, on_change)

View File

@ -31,20 +31,16 @@ def desc(sc, group, short, long):
pkey = v'[]'
for x in sc:
pkey.push(parse_key_repr(x))
return {'short': short, 'long': long, 'shortcuts': pkey}
return {'group': group, 'short': short, 'long': long, 'shortcuts': pkey}
def serialize_keyevent(evt):
def keyevent_as_shortcut(evt):
return {
'key': evt.key, 'altKey': evt.altKey, 'ctrlKey': evt.ctrlKey,
'metaKey': evt.metaKey, 'shiftKey': evt.shiftKey
}
def unserialize_keyevent(sc):
return sc
def keyevent_to_index(evt):
parts = v'[]'
for mod in v"['altKey', 'ctrlKey', 'metaKey', 'shiftKey']":
@ -52,6 +48,11 @@ def keyevent_to_index(evt):
return parts.join('') + evt.key
GROUP_DESC = {
'scroll': _('Navigation')
}
SHORTCUTS = {
'start_of_file': desc(
v"['Ctrl+ArrowUp', 'Ctrl+ArrowLeft', 'Home']",

View File

@ -426,6 +426,7 @@ class View:
'color_scheme': self.get_color_scheme(True),
'base_font_size': sd.get('base_font_size'),
'user_stylesheet': sd.get('user_stylesheet'),
'keyboard_shortcuts': sd.get('keyboard_shortcuts'),
}
def show_name(self, name, initial_position=None):

View File

@ -40,6 +40,7 @@ defaults = {
'header': {},
'footer': {'right': 'progress'},
'word_actions': v'[]',
'keyboard_shortcuts': {},
'standalone_font_settings': {},
'standalone_misc_settings': {},
'standalone_recently_opened': v'[]',