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.prefs.main import create_prefs_panel
from read_book.toc import create_toc_panel from read_book.toc import create_toc_panel
from read_book.word_actions import create_word_actions_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 ( from utils import (
default_context_menu_should_be_allowed, full_screen_element, default_context_menu_should_be_allowed, full_screen_element,
full_screen_supported, is_ios, safe_set_inner_html full_screen_supported, is_ios, safe_set_inner_html
@ -390,7 +390,7 @@ class MainOverlay: # {{{
self.overlay.hide() self.overlay.hide()
ui_operations.reset_interface() ui_operations.reset_interface()
sd = get_session_data() 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 modals import error_dialog
from read_book.globals import default_color_schemes, ui_operations from read_book.globals import default_color_schemes, ui_operations
from read_book.prefs.utils import create_button_box from read_book.prefs.utils import create_button_box
from session import defaults from session import session_defaults
from widgets import create_button from widgets import create_button
CONTAINER = unique_id('reader-color-scheme') CONTAINER = unique_id('reader-color-scheme')
@ -45,7 +45,7 @@ def get_container():
def resolve_color_scheme(current_color_scheme): def resolve_color_scheme(current_color_scheme):
sd = get_session_data() 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') ucs = sd.get('user_color_schemes')
if default_color_schemes[cs]: if default_color_schemes[cs]:
ans = default_color_schemes[cs] ans = default_color_schemes[cs]
@ -116,7 +116,7 @@ def current_color_scheme():
try: try:
return get_container().querySelector('li.current-color').getAttribute('data-name') return get_container().querySelector('li.current-color').getAttribute('data-name')
except Exception: except Exception:
return defaults.current_color_scheme return session_defaults().current_color_scheme
def set_current_color_scheme(value): def set_current_color_scheme(value):
@ -194,7 +194,7 @@ def create_color_buttons():
all_schemes = all_color_schemes() all_schemes = all_color_schemes()
ccs = sd.get('current_color_scheme') ccs = sd.get('current_color_scheme')
if not all_schemes[ccs]: 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();): for name in sorted(all_schemes, key=def(k):return all_schemes[k].name.toLowerCase();):
scheme = all_schemes[name] scheme = all_schemes[name]
is_current = name is ccs 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 dom import add_extra_css, rule, unique_id
from read_book.globals import ui_operations from read_book.globals import ui_operations
from widgets import create_button from widgets import create_button
from session import defaults from session import session_defaults
CONTAINER = unique_id('font-size-prefs') CONTAINER = unique_id('font-size-prefs')
MIN_FONT_SIZE = 8 MIN_FONT_SIZE = 8
@ -58,7 +58,7 @@ def change_font_size_by(frac):
def restore_default_font_size(): 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): 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 book_list.globals import get_session_data
from dom import unique_id from dom import unique_id
from read_book.prefs.utils import create_button_box 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 from utils import fmt_sidx
CONTAINER = unique_id('reader-hf-prefs') CONTAINER = unique_id('reader-hf-prefs')
@ -106,7 +106,7 @@ def restore_defaults():
container = document.getElementById(CONTAINER) container = document.getElementById(CONTAINER)
for which in Object.keys(groups()): for which in Object.keys(groups()):
table = container.querySelector(f'table[data-which={which}]') 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): 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 dom import add_extra_css, build_rule, element, unique_id
from read_book.prefs.utils import create_button_box from read_book.prefs.utils import create_button_box
from read_book.globals import runtime from read_book.globals import runtime
from session import defaults from session import session_defaults
CONTAINER = unique_id('reader-page-layout') CONTAINER = unique_id('reader-page-layout')
MARGINS = unique_id('reader-page-margins') MARGINS = unique_id('reader-page-margins')
@ -26,6 +26,7 @@ add_extra_css(def():
) )
def restore_defaults(): def restore_defaults():
defaults = session_defaults()
container = document.getElementById(CONTAINER) container = document.getElementById(CONTAINER)
for which in 'top bottom left right'.split(' '): for which in 'top bottom left right'.split(' '):
container.querySelector('input[name={}]'.format(which)).value = str(defaults['margin_' + which]) 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' name = 'fullscreen_when_opening'
val = sd.get(name) val = sd.get(name)
if 'auto always never'.split(' ').indexOf(val or '') < 0: if 'auto always never'.split(' ').indexOf(val or '') < 0:
val = defaults.fullscreen_when_opening val = session_defaults().fullscreen_when_opening
container.appendChild(E.div( container.appendChild(E.div(
E.div(style='margin: 1ex 2rem', id=FS_MODE, E.div(style='margin: 1ex 2rem', id=FS_MODE,
_('When opening a book enter fullscreen:'), ' ', _('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 dom import unique_id
from read_book.globals import ui_operations from read_book.globals import ui_operations
from read_book.prefs.utils import create_button_box from read_book.prefs.utils import create_button_box
from session import defaults from session import session_defaults
from widgets import create_button from widgets import create_button
CONTAINER = unique_id('standalone-misc-settings') CONTAINER = unique_id('standalone-misc-settings')
@ -34,7 +34,7 @@ def restore_defaults():
control.checked = DEFAULTS[q] control.checked = DEFAULTS[q]
else: else:
control.value = DEFAULTS[q] 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(): def get_container():
@ -97,5 +97,5 @@ def commit_misc(onchange):
vals[q] = val vals[q] = val
sd.set('standalone_misc_settings', vals) sd.set('standalone_misc_settings', vals)
hide_tooltips = container.querySelector(f'[name=hide_tooltips]').checked 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() onchange()

View File

@ -8,7 +8,7 @@ from gettext import gettext as _
from book_list.globals import get_session_data from book_list.globals import get_session_data
from dom import unique_id from dom import unique_id
from read_book.prefs.utils import create_button_box from read_book.prefs.utils import create_button_box
from session import defaults from session import session_defaults
CONTAINER = unique_id('standalone-scrolling-settings') CONTAINER = unique_id('standalone-scrolling-settings')
@ -25,7 +25,7 @@ MAX_SCROLL_SPEED_SMOOTH = 80
def restore_defaults(): def restore_defaults():
container = get_container() container = get_container()
for control in container.querySelectorAll('input[name]'): for control in container.querySelectorAll('input[name]'):
val = defaults[control.getAttribute('name')] val = session_defaults()[control.getAttribute('name')]
if control.type is 'checkbox': if control.type is 'checkbox':
control.checked = val control.checked = val
else: else:
@ -60,7 +60,7 @@ def create_scrolling_panel(container, apply_func, cancel_func):
ans = E.input(type='number', name=name, id=name) ans = E.input(type='number', name=name, id=name)
for key, val in Object.entries(kwargs): for key, val in Object.entries(kwargs):
ans[key] = val 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 return E.label("for"=name, text), ans
container.appendChild(E.div(style='margin-top:1ex', _('Control how scrolling works in paged mode'))) 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.highlights import all_styles
from read_book.prefs.utils import create_button_box from read_book.prefs.utils import create_button_box
from read_book.selection_bar import all_actions from read_book.selection_bar import all_actions
from session import defaults from session import session_defaults
CONTAINER = unique_id('selection-settings') CONTAINER = unique_id('selection-settings')
@ -21,13 +21,13 @@ def set_actions(use_defaults):
c = get_container() c = get_container()
adef = all_actions() adef = all_actions()
sd = get_session_data() 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]] current = [x for x in actions if adef[x]]
c.querySelector('.current-actions').dataset.actions = JSON.stringify(current) c.querySelector('.current-actions').dataset.actions = JSON.stringify(current)
available_actions = [x for x in adef if current.indexOf(x) is -1] available_actions = [x for x in adef if current.indexOf(x) is -1]
c.querySelector('.available-actions').dataset.actions = JSON.stringify(available_actions) c.querySelector('.available-actions').dataset.actions = JSON.stringify(available_actions)
update_action_tables() 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) c.querySelector('.quick-actions').dataset.actions = JSON.stringify(quick_actions)
update_quick_action_table() update_quick_action_table()
@ -35,7 +35,7 @@ def set_actions(use_defaults):
def restore_defaults(): def restore_defaults():
container = get_container() container = get_container()
for control in container.querySelectorAll('input[name]'): for control in container.querySelectorAll('input[name]'):
val = defaults[control.getAttribute('name')] val = session_defaults()[control.getAttribute('name')]
if control.type is 'checkbox': if control.type is 'checkbox':
control.checked = val control.checked = val
elif control.type is 'number': 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 dom import ensure_id, unique_id
from read_book.globals import runtime, ui_operations from read_book.globals import runtime, ui_operations
from read_book.prefs.utils import create_button_box 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 viewer.constants import READER_BACKGROUND_URL
from widgets import create_button from widgets import create_button
@ -80,8 +80,8 @@ def restore_defaults():
clear_image(container.querySelector('img').id) clear_image(container.querySelector('img').id)
else: else:
container.querySelector('[name=background_image]').value = '' container.querySelector('[name=background_image]').value = ''
container.querySelector('select[name=background_image_style]').value = defaults.background_image_style container.querySelector('select[name=background_image_style]').value = session_defaults().background_image_style
container.querySelector('input[name=background_image_fade]').value = str(defaults.background_image_fade) container.querySelector('input[name=background_image_fade]').value = str(session_defaults().background_image_fade)
def create_user_stylesheet_panel(container, apply_func, cancel_func): 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 elementmaker import E
from read_book.globals import dark_link_color, runtime from read_book.globals import dark_link_color, runtime
from session import defaults from session import session_defaults
opts = {} opts = {}
def update_settings(settings): 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.base_font_size = max(8, min(settings.base_font_size, 64))
opts.bg_image_fade = settings.bg_image_fade or 'transparent' opts.bg_image_fade = settings.bg_image_fade or 'transparent'
opts.color_scheme = settings.color_scheme opts.color_scheme = settings.color_scheme

View File

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