diff --git a/src/pyj/read_book/overlay.pyj b/src/pyj/read_book/overlay.pyj index da5efbbb5c..9a3d513373 100644 --- a/src/pyj/read_book/overlay.pyj +++ b/src/pyj/read_book/overlay.pyj @@ -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) ) diff --git a/src/pyj/read_book/prefs/colors.pyj b/src/pyj/read_book/prefs/colors.pyj index 8761bcef0e..3fd42ed368 100644 --- a/src/pyj/read_book/prefs/colors.pyj +++ b/src/pyj/read_book/prefs/colors.pyj @@ -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 diff --git a/src/pyj/read_book/prefs/font_size.pyj b/src/pyj/read_book/prefs/font_size.pyj index 3f23ceb1fe..6232308e7a 100644 --- a/src/pyj/read_book/prefs/font_size.pyj +++ b/src/pyj/read_book/prefs/font_size.pyj @@ -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): diff --git a/src/pyj/read_book/prefs/head_foot.pyj b/src/pyj/read_book/prefs/head_foot.pyj index 58e242725a..f775c27a4f 100644 --- a/src/pyj/read_book/prefs/head_foot.pyj +++ b/src/pyj/read_book/prefs/head_foot.pyj @@ -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): diff --git a/src/pyj/read_book/prefs/layout.pyj b/src/pyj/read_book/prefs/layout.pyj index 372a639a33..8fdf395f69 100644 --- a/src/pyj/read_book/prefs/layout.pyj +++ b/src/pyj/read_book/prefs/layout.pyj @@ -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:'), ' ', diff --git a/src/pyj/read_book/prefs/misc.pyj b/src/pyj/read_book/prefs/misc.pyj index a3fa0dd0d2..840320f999 100644 --- a/src/pyj/read_book/prefs/misc.pyj +++ b/src/pyj/read_book/prefs/misc.pyj @@ -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() diff --git a/src/pyj/read_book/prefs/scrolling.pyj b/src/pyj/read_book/prefs/scrolling.pyj index 122e82b6c7..31a511a171 100644 --- a/src/pyj/read_book/prefs/scrolling.pyj +++ b/src/pyj/read_book/prefs/scrolling.pyj @@ -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'))) diff --git a/src/pyj/read_book/prefs/selection.pyj b/src/pyj/read_book/prefs/selection.pyj index 11cbddae29..f7414739dd 100644 --- a/src/pyj/read_book/prefs/selection.pyj +++ b/src/pyj/read_book/prefs/selection.pyj @@ -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': diff --git a/src/pyj/read_book/prefs/user_stylesheet.pyj b/src/pyj/read_book/prefs/user_stylesheet.pyj index 78a0d43bf6..450f7072fa 100644 --- a/src/pyj/read_book/prefs/user_stylesheet.pyj +++ b/src/pyj/read_book/prefs/user_stylesheet.pyj @@ -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): diff --git a/src/pyj/read_book/settings.pyj b/src/pyj/read_book/settings.pyj index 228d2fa5a4..9129276711 100644 --- a/src/pyj/read_book/settings.pyj +++ b/src/pyj/read_book/settings.pyj @@ -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 diff --git a/src/pyj/session.pyj b/src/pyj/session.pyj index 7b1cabd521..1f0dc36078 100644 --- a/src/pyj/session.pyj +++ b/src/pyj/session.pyj @@ -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: