Allow specifying richer metadata per setting

This commit is contained in:
Kovid Goyal 2024-02-08 09:37:43 +05:30
parent 219a1572f6
commit 4cea6a59b5
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
11 changed files with 104 additions and 135 deletions

View File

@ -28,7 +28,7 @@ from read_book.prefs.head_foot import time_formatter
from read_book.prefs.main import create_prefs_panel
from read_book.toc import create_toc_panel
from read_book.word_actions import create_word_actions_panel
from session import defaults as session_defaults, get_device_uuid
from session import session_defaults, get_device_uuid
from utils import (
default_context_menu_should_be_allowed, full_screen_element,
full_screen_supported, is_ios, safe_set_inner_html
@ -390,7 +390,7 @@ class MainOverlay: # {{{
self.overlay.hide()
ui_operations.reset_interface()
sd = get_session_data()
sd.set('skipped_dialogs', session_defaults.skipped_dialogs)
sd.set('skipped_dialogs', session_defaults().skipped_dialogs)
)

View File

@ -14,7 +14,7 @@ from dom import (
from modals import error_dialog
from read_book.globals import default_color_schemes, ui_operations
from read_book.prefs.utils import create_button_box
from session import defaults
from session import session_defaults
from widgets import create_button
CONTAINER = unique_id('reader-color-scheme')
@ -45,7 +45,7 @@ def get_container():
def resolve_color_scheme(current_color_scheme):
sd = get_session_data()
cs = current_color_scheme or sd.get('current_color_scheme') or defaults.current_color_scheme
cs = current_color_scheme or sd.get('current_color_scheme') or session_defaults().current_color_scheme
ucs = sd.get('user_color_schemes')
if default_color_schemes[cs]:
ans = default_color_schemes[cs]
@ -116,7 +116,7 @@ def current_color_scheme():
try:
return get_container().querySelector('li.current-color').getAttribute('data-name')
except Exception:
return defaults.current_color_scheme
return session_defaults().current_color_scheme
def set_current_color_scheme(value):
@ -194,7 +194,7 @@ def create_color_buttons():
all_schemes = all_color_schemes()
ccs = sd.get('current_color_scheme')
if not all_schemes[ccs]:
ccs = defaults.current_color_scheme
ccs = session_defaults().current_color_scheme
for name in sorted(all_schemes, key=def(k):return all_schemes[k].name.toLowerCase();):
scheme = all_schemes[name]
is_current = name is ccs

View File

@ -10,7 +10,7 @@ from book_list.theme import get_color
from dom import add_extra_css, rule, unique_id
from read_book.globals import ui_operations
from widgets import create_button
from session import defaults
from session import session_defaults
CONTAINER = unique_id('font-size-prefs')
MIN_FONT_SIZE = 8
@ -58,7 +58,7 @@ def change_font_size_by(frac):
def restore_default_font_size():
change_font_size(defaults.base_font_size)
change_font_size(session_defaults().base_font_size)
def display_changed_font_size(sz):

View File

@ -8,7 +8,7 @@ from gettext import gettext as _, ngettext
from book_list.globals import get_session_data
from dom import unique_id
from read_book.prefs.utils import create_button_box
from session import defaults, get_interface_data
from session import session_defaults, get_interface_data
from utils import fmt_sidx
CONTAINER = unique_id('reader-hf-prefs')
@ -106,7 +106,7 @@ def restore_defaults():
container = document.getElementById(CONTAINER)
for which in Object.keys(groups()):
table = container.querySelector(f'table[data-which={which}]')
apply_setting(table, defaults[which] or {})
apply_setting(table, session_defaults()[which] or {})
def create_head_foot_panel(container, apply_func, cancel_func):

View File

@ -9,7 +9,7 @@ from book_list.globals import get_session_data
from dom import add_extra_css, build_rule, element, unique_id
from read_book.prefs.utils import create_button_box
from read_book.globals import runtime
from session import defaults
from session import session_defaults
CONTAINER = unique_id('reader-page-layout')
MARGINS = unique_id('reader-page-margins')
@ -26,6 +26,7 @@ add_extra_css(def():
)
def restore_defaults():
defaults = session_defaults()
container = document.getElementById(CONTAINER)
for which in 'top bottom left right'.split(' '):
container.querySelector('input[name={}]'.format(which)).value = str(defaults['margin_' + which])
@ -100,7 +101,7 @@ def create_layout_panel(container, apply_func, cancel_func):
name = 'fullscreen_when_opening'
val = sd.get(name)
if 'auto always never'.split(' ').indexOf(val or '') < 0:
val = defaults.fullscreen_when_opening
val = session_defaults().fullscreen_when_opening
container.appendChild(E.div(
E.div(style='margin: 1ex 2rem', id=FS_MODE,
_('When opening a book enter fullscreen:'), ' ',

View File

@ -9,7 +9,7 @@ from book_list.globals import get_session_data
from dom import unique_id
from read_book.globals import ui_operations
from read_book.prefs.utils import create_button_box
from session import defaults
from session import session_defaults
from widgets import create_button
CONTAINER = unique_id('standalone-misc-settings')
@ -34,7 +34,7 @@ def restore_defaults():
control.checked = DEFAULTS[q]
else:
control.value = DEFAULTS[q]
container.querySelector(f'[name=hide_tooltips]').checked = defaults.hide_tooltips
container.querySelector(f'[name=hide_tooltips]').checked = session_defaults().hide_tooltips
def get_container():
@ -97,5 +97,5 @@ def commit_misc(onchange):
vals[q] = val
sd.set('standalone_misc_settings', vals)
hide_tooltips = container.querySelector(f'[name=hide_tooltips]').checked
sd.set('hide_tooltips', None if hide_tooltips is defaults.hide_tooltips else hide_tooltips)
sd.set('hide_tooltips', None if hide_tooltips is session_defaults().hide_tooltips else hide_tooltips)
onchange()

View File

@ -8,7 +8,7 @@ from gettext import gettext as _
from book_list.globals import get_session_data
from dom import unique_id
from read_book.prefs.utils import create_button_box
from session import defaults
from session import session_defaults
CONTAINER = unique_id('standalone-scrolling-settings')
@ -25,7 +25,7 @@ MAX_SCROLL_SPEED_SMOOTH = 80
def restore_defaults():
container = get_container()
for control in container.querySelectorAll('input[name]'):
val = defaults[control.getAttribute('name')]
val = session_defaults()[control.getAttribute('name')]
if control.type is 'checkbox':
control.checked = val
else:
@ -60,7 +60,7 @@ def create_scrolling_panel(container, apply_func, cancel_func):
ans = E.input(type='number', name=name, id=name)
for key, val in Object.entries(kwargs):
ans[key] = val
ans.valueAsNumber = sd.get(name, defaults[name])
ans.valueAsNumber = sd.get(name, session_defaults()[name])
return E.label("for"=name, text), ans
container.appendChild(E.div(style='margin-top:1ex', _('Control how scrolling works in paged mode')))

View File

@ -12,7 +12,7 @@ from read_book.globals import is_dark_theme
from read_book.highlights import all_styles
from read_book.prefs.utils import create_button_box
from read_book.selection_bar import all_actions
from session import defaults
from session import session_defaults
CONTAINER = unique_id('selection-settings')
@ -21,13 +21,13 @@ def set_actions(use_defaults):
c = get_container()
adef = all_actions()
sd = get_session_data()
actions = defaults.selection_bar_actions if use_defaults else sd.get('selection_bar_actions')
actions = session_defaults().selection_bar_actions if use_defaults else sd.get('selection_bar_actions')
current = [x for x in actions if adef[x]]
c.querySelector('.current-actions').dataset.actions = JSON.stringify(current)
available_actions = [x for x in adef if current.indexOf(x) is -1]
c.querySelector('.available-actions').dataset.actions = JSON.stringify(available_actions)
update_action_tables()
quick_actions = defaults.selection_bar_quick_highlights if use_defaults else sd.get('selection_bar_quick_highlights')
quick_actions = session_defaults().selection_bar_quick_highlights if use_defaults else sd.get('selection_bar_quick_highlights')
c.querySelector('.quick-actions').dataset.actions = JSON.stringify(quick_actions)
update_quick_action_table()
@ -35,7 +35,7 @@ def set_actions(use_defaults):
def restore_defaults():
container = get_container()
for control in container.querySelectorAll('input[name]'):
val = defaults[control.getAttribute('name')]
val = session_defaults()[control.getAttribute('name')]
if control.type is 'checkbox':
control.checked = val
elif control.type is 'number':

View File

@ -9,7 +9,7 @@ from book_list.globals import get_session_data
from dom import ensure_id, unique_id
from read_book.globals import runtime, ui_operations
from read_book.prefs.utils import create_button_box
from session import defaults
from session import session_defaults
from viewer.constants import READER_BACKGROUND_URL
from widgets import create_button
@ -80,8 +80,8 @@ def restore_defaults():
clear_image(container.querySelector('img').id)
else:
container.querySelector('[name=background_image]').value = ''
container.querySelector('select[name=background_image_style]').value = defaults.background_image_style
container.querySelector('input[name=background_image_fade]').value = str(defaults.background_image_fade)
container.querySelector('select[name=background_image_style]').value = session_defaults().background_image_style
container.querySelector('input[name=background_image_fade]').value = str(session_defaults().background_image_fade)
def create_user_stylesheet_panel(container, apply_func, cancel_func):

View File

@ -5,12 +5,12 @@ from __python__ import hash_literals
from elementmaker import E
from read_book.globals import dark_link_color, runtime
from session import defaults
from session import session_defaults
opts = {}
def update_settings(settings):
settings = Object.assign({}, defaults, settings)
settings = Object.assign({}, session_defaults(), settings)
opts.base_font_size = max(8, min(settings.base_font_size, 64))
opts.bg_image_fade = settings.bg_image_fade or 'transparent'
opts.color_scheme = settings.color_scheme

View File

@ -6,115 +6,83 @@ from uuid import short_uuid
from ajax import ajax_send
defaults = {
# Book list settings
'copy_to_library_dupes': 'add;overwrite',
'last_sort_order': {},
'show_all_metadata': False, # show all metadata fields in the book details panel
'sort': 'timestamp.desc', # comma separated list of items of the form: field.order
'view_mode': 'cover_grid',
'fts_related_words': True,
all_settings = {
'copy_to_library_dupes': {'default': 'add;overwrite', 'category': 'book_list'},
'last_sort_order': {'default': {}, 'category': 'book_list'},
'show_all_metadata': {'default': False, 'category': 'book_list'}, # show all metadata fields in the book details panel
'sort': {'default': 'timestamp.desc', 'category': 'book_list'}, # comma separated list of items of the form: field.order
'view_mode': {'default': 'cover_grid', 'category': 'book_list'},
'fts_related_words': {'default': True, 'category': 'book_list'},
# Tag Browser settings
'and_search_terms': False, # how to add search terms to the search expression from the Tag Browser
'collapse_at': 25, # number of items at which sub-groups are created, 0 to disable
'dont_collapse': '', # comma separated list of category names
'hide_empty_categories': 'no',
'partition_method': 'first letter', # other choices: 'disable', 'partition'
'sort_tags_by': 'name', # other choices: popularity, rating
'and_search_terms': {'default': False, 'category': 'tag_browser'}, # how to add search terms to the search expression from the Tag Browser
'collapse_at': {'default': 25, 'category': 'tag_browser'}, # number of items at which sub-groups are created, 0 to disable
'dont_collapse': {'default': '', 'category': 'tag_browser'}, # comma separated list of category names
'hide_empty_categories': {'default': 'no', 'category': 'tag_browser'},
'partition_method': {'default': 'first letter', 'category': 'tag_browser'}, # other choices: 'disable', 'partition'
'sort_tags_by': {'default': 'name', 'category': 'tag_browser'}, # other choices: popularity, rating
# Book reader settings
'background_image_fade': 0,
'background_image_style': 'scaled',
'background_image': None,
'base_font_size': 16,
'book_scrollbar': False,
'columns_per_screen': {'portrait':0, 'landscape':0},
'controls_help_shown_count': 0,
'controls_help_shown_count_rtl_page_progression': 0,
'cover_preserve_aspect_ratio': True,
'current_color_scheme': 'system',
'footer': {'right': 'progress'},
'header': {},
'controls_footer': {'right': 'progress'},
'left-margin': {},
'right-margin': {},
'hide_tooltips': False,
'keyboard_shortcuts': {},
'lines_per_sec_auto': 1,
'lines_per_sec_smooth': 20,
'margin_bottom': 20,
'margin_left': 20,
'margin_right': 20,
'margin_top': 20,
'max_text_height': 0,
'max_text_width': 0,
'override_book_colors': 'never',
'paged_margin_clicks_scroll_by_screen': True,
'paged_wheel_scrolls_by_screen': False,
'paged_wheel_section_jumps': True,
'paged_pixel_scroll_threshold': 60,
'read_mode': 'paged',
'scroll_auto_boundary_delay': 5,
'scroll_stop_boundaries': False,
'standalone_font_settings': {},
'standalone_misc_settings': {},
'standalone_recently_opened': v'[]',
'user_color_schemes': {},
'user_stylesheet': '',
'word_actions': v'[]',
'highlight_style': None,
'highlights_export_format': 'text',
'custom_highlight_styles': v'[]',
'show_selection_bar': True,
'net_search_url': 'https://google.com/search?q={q}',
'selection_bar_actions': v"['copy', 'lookup', 'highlight', 'remove_highlight', 'search_net', 'clear']",
'selection_bar_quick_highlights': v"[]",
'skipped_dialogs': v'{}',
'tts': v'{}',
'tts_backend': v'{}',
'fullscreen_when_opening': 'auto',
'book_search_mode': 'contains',
'book_search_case_sensitive': False,
'reverse_page_turn_zones': False,
'gesture_overrides': {},
'background_image_fade': {'default': 0, 'category': 'read_book', 'is_local': True},
'background_image_style': {'default': 'scaled', 'category': 'read_book', 'is_local': True},
'background_image': {'default': None, 'category': 'read_book', 'is_local': True},
'base_font_size': {'default': 16, 'category': 'read_book', 'is_local': True},
'book_scrollbar': {'default': False, 'category': 'read_book'},
'columns_per_screen': {'default': {'portrait':0, 'landscape':0}, 'category': 'read_book', 'is_local': True},
'controls_help_shown_count': {'default': 0, 'category': 'read_book', 'is_local': True},
'controls_help_shown_count_rtl_page_progression': {'default': 0, 'category': 'read_book', 'is_local': True},
'cover_preserve_aspect_ratio': {'default': True, 'category': 'read_book'},
'current_color_scheme': {'default': 'system', 'category': 'read_book'},
'footer': {'default': {'right': 'progress'}, 'category': 'read_book'},
'header': {'default': {}, 'category': 'read_book'},
'controls_footer': {'default': {'right': 'progress'}, 'category': 'read_book'},
'left-margin': {'default': {}, 'category': 'read_book'},
'right-margin': {'default': {}, 'category': 'read_book'},
'hide_tooltips': {'default': False, 'category': 'read_book'},
'keyboard_shortcuts': {'default': {}, 'category': 'read_book'},
'lines_per_sec_auto': {'default': 1, 'category': 'read_book', 'is_local': True},
'lines_per_sec_smooth': {'default': 20, 'category': 'read_book', 'is_local': True},
'margin_bottom': {'default': 20, 'category': 'read_book', 'is_local': True},
'margin_left': {'default': 20, 'category': 'read_book', 'is_local': True},
'margin_right': {'default': 20, 'category': 'read_book', 'is_local': True},
'margin_top': {'default': 20, 'category': 'read_book', 'is_local': True},
'max_text_height': {'default': 0, 'category': 'read_book', 'is_local': True},
'max_text_width': {'default': 0, 'category': 'read_book', 'is_local': True},
'override_book_colors': {'default': 'never', 'category': 'read_book'},
'paged_margin_clicks_scroll_by_screen': {'default': True, 'category': 'read_book'},
'paged_wheel_scrolls_by_screen': {'default': False, 'category': 'read_book'},
'paged_wheel_section_jumps': {'default': True, 'category': 'read_book'},
'paged_pixel_scroll_threshold': {'default': 60, 'category': 'read_book'},
'read_mode': {'default': 'paged', 'category': 'read_book', 'is_local': True},
'scroll_auto_boundary_delay': {'default': 5, 'category': 'read_book', 'is_local': True},
'scroll_stop_boundaries': {'default': False, 'category': 'read_book', 'is_local': True},
'standalone_font_settings': {'default': {}, 'category': 'read_book', 'is_local': True},
'standalone_misc_settings': {'default': {}, 'category': 'read_book', 'is_local': True},
'standalone_recently_opened': {'default': v'[]', 'category': 'read_book', 'is_local': True},
'user_color_schemes': {'default': {}, 'category': 'read_book'},
'user_stylesheet': {'default': '', 'category': 'read_book', 'is_local': True},
'word_actions': {'default': v'[]', 'category': 'read_book'},
'highlight_style': {'default': None, 'category': 'read_book', 'is_local': True},
'highlights_export_format': {'default': 'text', 'category': 'read_book', 'is_local': True},
'custom_highlight_styles': {'default': v'[]', 'category': 'read_book'},
'show_selection_bar': {'default': True, 'category': 'read_book'},
'net_search_url': {'default': 'https://google.com/search?q={q}', 'category': 'read_book'},
'selection_bar_actions': {'default': v"['copy', 'lookup', 'highlight', 'remove_highlight', 'search_net', 'clear']", 'category': 'read_book'},
'selection_bar_quick_highlights': {'default': v"[]", 'category': 'read_book'},
'skipped_dialogs': {'default': v'{}', 'category': 'read_book', 'is_local': True},
'tts': {'default': v'{}', 'category': 'read_book', 'is_local': True},
'tts_backend': {'default': v'{}', 'category': 'read_book', 'is_local': True},
'fullscreen_when_opening': {'default': 'auto', 'category': 'read_book', 'is_local': True},
'book_search_mode': {'default': 'contains', 'category': 'read_book', 'is_local': True},
'book_search_case_sensitive': {'default': False, 'category': 'read_book', 'is_local': True},
'reverse_page_turn_zones': {'default': False, 'category': 'read_book', 'is_local': True},
'gesture_overrides': {'default': {}, 'category': 'read_book'},
}
is_local_setting = {
'skipped_dialogs': True,
'background_image_fade': True,
'background_image_style': True,
'background_image': True,
'base_font_size': True,
'columns_per_screen': True,
'controls_help_shown_count': True,
'controls_help_shown_count_rtl_page_progression': True,
'lines_per_sec_auto': True,
'lines_per_sec_smooth': True,
'margin_bottom': True,
'margin_left': True,
'margin_right': True,
'margin_top': True,
'max_text_height': True,
'max_text_width': True,
'read_mode': 'paged',
'scroll_auto_boundary_delay': True,
'scroll_stop_boundaries': True,
'standalone_font_settings': True,
'standalone_misc_settings': True,
'standalone_recently_opened': True,
'user_stylesheet': True,
'highlight_style': True,
'tts': True,
'tts_backend': True,
'fullscreen_when_opening': True,
'highlights_export_format': True,
'book_search_mode': True,
'book_search_case_sensitive': True,
'reverse_page_turn_zones': True,
}
defaults = {}
for x in Object.entries(all_settings):
defaults[x[0]] = x[1].default
def session_defaults():
return defaults
@ -235,7 +203,7 @@ default_interface_data = {
'gui_last_modified_display_format': 'dd MMM yyyy',
'use_roman_numerals_for_series_number': True,
'default_library_id': None,
'default_book_list_mode': defaults.view_mode,
'default_book_list_mode': session_defaults().view_mode,
'library_map': None,
'search_the_net_urls': [],
'donate_link': 'https://calibre-ebook.com/donate',
@ -292,16 +260,16 @@ class UserSessionData(SessionData):
self.push_timer_id = None
if saved_data:
for key in saved_data:
if not is_local_setting[key]:
if not all_settings[key].is_local:
self.set(key, saved_data[key])
self.echo_changes = True
def defval(self, key):
return defaults[key]
return session_defaults()[key]
def get(self, key, defval):
if defval is undefined:
defval = defaults[key]
defval = session_defaults()[key]
return SessionData.get(self, (self.prefix + key), defval)
def get_library_option(self, library_id, key, defval):
@ -309,11 +277,11 @@ class UserSessionData(SessionData):
return self.get(key, defval)
lkey = key + '-||-' + library_id
if defval is undefined:
defval = defaults[key]
defval = session_defaults()[key]
return self.get(lkey, defval)
def set(self, key, value):
if self.echo_changes and self.has_user and not is_local_setting[key]:
if self.echo_changes and self.has_user and not all_settings[key].is_local:
self.changes[key] = value
self.has_changes = True
if self.push_timer_id is not None: