diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index 3203e92b86..ce65122192 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -45,6 +45,7 @@ class IframeBoss: 'scroll_to_anchor': self.on_scroll_to_anchor, 'next_screen': self.on_next_screen, 'change_font_size': self.change_font_size, + 'change_color_scheme': self.change_color_scheme, } self.last_window_ypos = 0 @@ -148,6 +149,11 @@ class IframeBoss: opts.base_font_size = data.base_font_size self.apply_font_size() + def change_color_scheme(self, data): + if data.color_scheme and data.color_scheme.foreground and data.color_scheme.background: + opts.color_scheme = data.color_scheme + self.apply_colors() + def content_loaded(self): document.documentElement.style.overflow = 'hidden' # document.body.appendChild( diff --git a/src/pyj/read_book/prefs/colors.pyj b/src/pyj/read_book/prefs/colors.pyj index 4f0a07014f..3e168953f6 100644 --- a/src/pyj/read_book/prefs/colors.pyj +++ b/src/pyj/read_book/prefs/colors.pyj @@ -5,7 +5,7 @@ from __python__ import hash_literals, bound_methods from gettext import gettext as _ from dom import svgicon, set_css, add_extra_css, build_rule, clear, unique_id from elementmaker import E -from book_list.globals import get_session_data +from book_list.globals import get_session_data, get_boss from read_book.globals import default_color_schemes from modals import error_dialog from widgets import create_button @@ -34,6 +34,20 @@ add_extra_css(def(): def get_container(): return document.getElementById(CONTAINER) +def resolve_color_scheme(current_color_scheme): + sd = get_session_data() + cs = current_color_scheme or sd.get('current_color_scheme') or 'white' + ucs = sd.get('user_color_schemes') + if default_color_schemes[cs]: + ans = default_color_schemes[cs] + elif ucs[cs] and ucs[cs].foreground and ucs[cs].background: + ans = ucs[cs] + else: + for sn in default_color_schemes: + ans = default_color_schemes[sn] + break + return ans + def change_current_color(ev): ul = ev.currentTarget.parentNode for li in ul.childNodes: @@ -152,6 +166,9 @@ def set_action_button_visibility(): def create_colors_panel(container): container.appendChild(E.div(id=CONTAINER)) container = container.lastChild + cs = resolve_color_scheme() + container.dataset.bg = cs.background + container.dataset.fg = cs.foreground 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) @@ -179,8 +196,9 @@ develop = create_colors_panel def commit_colors(onchange): ccs = current_color_scheme() - sd = get_session_data() - if sd.get('current_color_scheme') is not ccs: + rcs = resolve_color_scheme(ccs) + c = get_container() + if rcs.foreground is not c.dataset.fg or rcs.background is not c.dataset.bg: + sd = get_session_data() sd.set('current_color_scheme', ccs) - onchange() - + get_boss().read_ui.update_color_scheme() diff --git a/src/pyj/read_book/ui.pyj b/src/pyj/read_book/ui.pyj index 60a2f1b6e8..05b9b18dd2 100644 --- a/src/pyj/read_book/ui.pyj +++ b/src/pyj/read_book/ui.pyj @@ -113,6 +113,9 @@ class ReadUI: def update_font_size(self): self.view.update_font_size() + def update_color_scheme(self): + self.view.update_color_scheme() + @property def url_data(self): ans = {'book_id':self.base_url_data.book_id, 'fmt': self.base_url_data.fmt} diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 22687c36a9..b15f1b49a2 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -6,9 +6,10 @@ from book_list.globals import get_session_data, get_boss from dom import set_css, add_extra_css, build_rule, svgicon from elementmaker import E from gettext import gettext as _ -from read_book.globals import messenger, iframe_id, default_color_schemes +from read_book.globals import messenger, iframe_id from read_book.resources import load_resources from read_book.overlay import Overlay +from read_book.prefs.colors import resolve_color_scheme from book_list.theme import get_color from utils import parse_url_params, username_key @@ -178,23 +179,13 @@ class View: self.ui.show_error((data.title or _('There was an error processing the book')), data.msg, data.details) def get_color_scheme(self, apply_to_margins): - sd = get_session_data() - cs = sd.get('current_color_scheme') or 'white' - ucs = sd.get('user_color_schemes') - if default_color_schemes[cs]: - ans = default_color_schemes[cs] - elif ucs[cs] and ucs[cs].foreground and ucs[cs].background: - ans = ucs[cs] - else: - for sn in default_color_schemes: - ans = default_color_schemes[sn] - break + ans = resolve_color_scheme() if apply_to_margins: for which in 'left top right bottom'.split(' '): s = document.getElementById('book-{}-margin'.format(which)).style if which is 'top' or which is 'bottom': s.color = ans.foreground # Setting a color for the side margins causes the hover arrow to become visible - s.backgroundColor = ans.background + s.backgroundColor = ans.background return ans def on_resize(self): @@ -324,3 +315,7 @@ class View: def update_font_size(self): self.send_message('change_font_size', base_font_size=get_session_data().get('base_font_size')) + + def update_color_scheme(self): + cs = self.get_color_scheme(True) + self.send_message('change_color_scheme', color_scheme=cs)