mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Work on preferences UI for keyboard shortcuts
This commit is contained in:
parent
2523d6605e
commit
e91e414687
@ -48,9 +48,12 @@ def build_list(container, items, subtitle):
|
|||||||
div.appendChild(E.div(item.subtitle, class_='item-subtitle', style='padding-top:1ex'))
|
div.appendChild(E.div(item.subtitle, class_='item-subtitle', style='padding-top:1ex'))
|
||||||
if item.action:
|
if item.action:
|
||||||
ul.lastChild.addEventListener('click', 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):
|
def create_item_list(container, items, subtitle=None):
|
||||||
|
@ -153,7 +153,7 @@ class IframeBoss:
|
|||||||
self._handle_gesture = paged_handle_gesture
|
self._handle_gesture = paged_handle_gesture
|
||||||
self.anchor_funcs = paged_anchor_funcs
|
self.anchor_funcs = paged_anchor_funcs
|
||||||
update_settings(data.settings)
|
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})
|
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
|
self.last_cfi = None
|
||||||
for name in self.blob_url_map:
|
for name in self.blob_url_map:
|
||||||
|
89
src/pyj/read_book/prefs/keyboard.pyj
Normal file
89
src/pyj/read_book/prefs/keyboard.pyj
Normal 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)
|
@ -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.colors import commit_colors, create_colors_panel
|
||||||
from read_book.prefs.fonts import commit_fonts, create_fonts_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.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.layout import commit_layout, create_layout_panel
|
||||||
from read_book.prefs.misc import commit_misc, create_misc_panel
|
from read_book.prefs.misc import commit_misc, create_misc_panel
|
||||||
from read_book.prefs.user_stylesheet import (
|
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(_('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(_('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(_('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:
|
if runtime.is_standalone_viewer:
|
||||||
items.push(create_item(
|
items.push(create_item(
|
||||||
@ -120,6 +122,13 @@ class Prefs:
|
|||||||
def close_head_foot(self):
|
def close_head_foot(self):
|
||||||
commit_head_foot(self.onchange, self.container)
|
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):
|
def create_prefs_panel(container, close_func, on_change):
|
||||||
Prefs(container, close_func, on_change)
|
Prefs(container, close_func, on_change)
|
||||||
|
@ -31,20 +31,16 @@ def desc(sc, group, short, long):
|
|||||||
pkey = v'[]'
|
pkey = v'[]'
|
||||||
for x in sc:
|
for x in sc:
|
||||||
pkey.push(parse_key_repr(x))
|
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 {
|
return {
|
||||||
'key': evt.key, 'altKey': evt.altKey, 'ctrlKey': evt.ctrlKey,
|
'key': evt.key, 'altKey': evt.altKey, 'ctrlKey': evt.ctrlKey,
|
||||||
'metaKey': evt.metaKey, 'shiftKey': evt.shiftKey
|
'metaKey': evt.metaKey, 'shiftKey': evt.shiftKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def unserialize_keyevent(sc):
|
|
||||||
return sc
|
|
||||||
|
|
||||||
|
|
||||||
def keyevent_to_index(evt):
|
def keyevent_to_index(evt):
|
||||||
parts = v'[]'
|
parts = v'[]'
|
||||||
for mod in v"['altKey', 'ctrlKey', 'metaKey', 'shiftKey']":
|
for mod in v"['altKey', 'ctrlKey', 'metaKey', 'shiftKey']":
|
||||||
@ -52,6 +48,11 @@ def keyevent_to_index(evt):
|
|||||||
return parts.join('') + evt.key
|
return parts.join('') + evt.key
|
||||||
|
|
||||||
|
|
||||||
|
GROUP_DESC = {
|
||||||
|
'scroll': _('Navigation')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SHORTCUTS = {
|
SHORTCUTS = {
|
||||||
'start_of_file': desc(
|
'start_of_file': desc(
|
||||||
v"['Ctrl+ArrowUp', 'Ctrl+ArrowLeft', 'Home']",
|
v"['Ctrl+ArrowUp', 'Ctrl+ArrowLeft', 'Home']",
|
||||||
|
@ -426,6 +426,7 @@ class View:
|
|||||||
'color_scheme': self.get_color_scheme(True),
|
'color_scheme': self.get_color_scheme(True),
|
||||||
'base_font_size': sd.get('base_font_size'),
|
'base_font_size': sd.get('base_font_size'),
|
||||||
'user_stylesheet': sd.get('user_stylesheet'),
|
'user_stylesheet': sd.get('user_stylesheet'),
|
||||||
|
'keyboard_shortcuts': sd.get('keyboard_shortcuts'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def show_name(self, name, initial_position=None):
|
def show_name(self, name, initial_position=None):
|
||||||
|
@ -40,6 +40,7 @@ defaults = {
|
|||||||
'header': {},
|
'header': {},
|
||||||
'footer': {'right': 'progress'},
|
'footer': {'right': 'progress'},
|
||||||
'word_actions': v'[]',
|
'word_actions': v'[]',
|
||||||
|
'keyboard_shortcuts': {},
|
||||||
'standalone_font_settings': {},
|
'standalone_font_settings': {},
|
||||||
'standalone_misc_settings': {},
|
'standalone_misc_settings': {},
|
||||||
'standalone_recently_opened': v'[]',
|
'standalone_recently_opened': v'[]',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user