diff --git a/src/pyj/read_book/prefs/colors.pyj b/src/pyj/read_book/prefs/colors.pyj index 197fa42785..24c218b5e1 100644 --- a/src/pyj/read_book/prefs/colors.pyj +++ b/src/pyj/read_book/prefs/colors.pyj @@ -185,6 +185,7 @@ def set_action_button_visibility(): def create_colors_panel(container, apply_func, cancel_func): container.appendChild(E.div(id=CONTAINER)) container = container.lastChild + sd = get_session_data() cs = resolve_color_scheme() container.dataset.bg = cs.background container.dataset.fg = cs.foreground @@ -192,6 +193,19 @@ def create_colors_panel(container, apply_func, cancel_func): container.appendChild(E.p(_('Choose a color scheme below'), style='margin:1ex 1em; padding: 1ex 0')) ul = E.ul(id=COLOR_LIST) container.appendChild(ul) + container.appendChild(E.div( + E.span(_('Override all book colors:') + '\xa0'), + E.label(E.input(type='radio', name='override_book_colors', value='never'), _('Never')), + ' ', + E.label(E.input(type='radio', name='override_book_colors', value='dark'), _('In dark mode')), + ' ', + E.label(E.input(type='radio', name='override_book_colors', value='always'), _('Always')), + style='margin:1ex 1em; padding: 1ex 0; white-space: pre-wrap' + )) + try: + container.lastChild.querySelector(f'[name=override_book_colors][value={sd.get("override_book_colors")}]').checked = True + except: + container.lastChild.querySelector('[name=override_book_colors][value=never]').checked = True create_color_buttons() container.appendChild(E.div( @@ -229,7 +243,11 @@ def commit_colors(onchange): rcs = resolve_color_scheme(ccs) c = get_container() sd = get_session_data() + prev_obc = sd.get('override_book_colors') + cur_obc = c.querySelector('[name=override_book_colors]:checked').value sd.set('current_color_scheme', ccs) - if rcs.foreground is not c.dataset.fg or rcs.background is not c.dataset.bg or c.dataset.link is not rcs.link: + if cur_obc is not prev_obc: + sd.set('override_book_colors', cur_obc) + if rcs.foreground is not c.dataset.fg or rcs.background is not c.dataset.bg or c.dataset.link is not rcs.link or cur_obc is not prev_obc: ui_operations.update_color_scheme() onchange() diff --git a/src/pyj/read_book/settings.pyj b/src/pyj/read_book/settings.pyj index bf4cd44af7..cf922e4fe3 100644 --- a/src/pyj/read_book/settings.pyj +++ b/src/pyj/read_book/settings.pyj @@ -20,6 +20,7 @@ def update_settings(settings): opts.bg_image_fade = settings.bg_image_fade or 'transparent' opts.paged_wheel_scrolls_by_screen = v'!!settings.paged_wheel_scrolls_by_screen' opts.is_dark_theme = v'!!settings.is_dark_theme' + opts.override_book_colors = settings.override_book_colors or 'never' update_settings() @@ -40,11 +41,17 @@ def apply_colors(): if not ss: ss = E.style(id='calibre-color-scheme-style-overrides', type='text/css') document.documentElement.appendChild(ss) + text = '' + if opts.override_book_colors is not 'never': + text = 'body' + if opts.override_book_colors is 'dark': + text += '.calibre-viewer-dark-colors' + text += f' * {{ color: {opts.color_scheme.foreground} !important; background-color: {opts.color_scheme.background} !important }}' if opts.color_scheme.link: c = opts.color_scheme.link - text = f':link, :link * {{ color: {c} !important }} :visited, :visited * {{ color: {c} !important }}' - else: - text = '' + # we use the html > body form so that these selectors have higher + # priority than the override all selectors above + text += f'\nhtml > body :link, html > body :link * {{ color: {c} !important }} html > body :visited, html > body :visited * {{ color: {c} !important }}' ss.textContent = text diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index a4312f6e32..1557b58e40 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -691,6 +691,7 @@ class View: 'read_mode': sd.get('read_mode'), 'columns_per_screen': sd.get('columns_per_screen'), 'color_scheme': cs, + 'override_book_colors': sd.get('override_book_colors'), 'is_dark_theme': is_dark_theme, 'bg_image_fade': bg_image_fade, 'base_font_size': sd.get('base_font_size'), diff --git a/src/pyj/session.pyj b/src/pyj/session.pyj index 6d0bc72dd8..17d88003ac 100644 --- a/src/pyj/session.pyj +++ b/src/pyj/session.pyj @@ -39,6 +39,7 @@ defaults = { 'background_image_fade': 0, 'current_color_scheme': 'system', 'user_color_schemes': {}, + 'override_book_colors': 'never', 'base_font_size': 16, 'controls_help_shown_count': 0, 'header': {}, @@ -68,6 +69,7 @@ is_local_setting = { 'background_image_style': True, 'background_image_fade': True, 'current_color_scheme': True, + 'override_book_colors': True, 'base_font_size': True, 'controls_help_shown_count': True, 'standalone_font_settings': True,