diff --git a/src/calibre/gui2/viewer/toolbars.py b/src/calibre/gui2/viewer/toolbars.py index aae4f10409..f2718a730f 100644 --- a/src/calibre/gui2/viewer/toolbars.py +++ b/src/calibre/gui2/viewer/toolbars.py @@ -40,6 +40,7 @@ class Actions(object): def all_actions(): if not hasattr(all_actions, 'ans'): all_actions.ans = Actions({ + 'color_scheme': Action('format-fill-color.png', _('Switch color scheme')), 'back': Action('back.png', _('Back')), 'forward': Action('forward.png', _('Forward')), 'open': Action('document_open.png', _('Open e-book')), @@ -67,7 +68,7 @@ def all_actions(): DEFAULT_ACTIONS = ( - 'back', 'forward', None, 'open', 'copy', 'increase_font_size', 'decrease_font_size', 'fullscreen', + 'back', 'forward', None, 'open', 'copy', 'increase_font_size', 'decrease_font_size', 'fullscreen', 'color_scheme', None, 'previous', 'next', None, 'toc', 'bookmarks', 'lookup', 'reference', 'chrome', None, 'mode', 'print', 'preferences', 'metadata', 'inspector' ) @@ -131,6 +132,7 @@ class ActionsToolBar(ToolBar): web_view.standalone_misc_settings_changed.connect(self.update_visibility) web_view.autoscroll_state_changed.connect(self.update_autoscroll_action) web_view.customize_toolbar.connect(self.customize, type=Qt.QueuedConnection) + web_view.view_created.connect(self.on_view_created) self.back_action = page.action(QWebEnginePage.Back) self.back_action.setIcon(aa.back.icon) @@ -176,6 +178,11 @@ class ActionsToolBar(ToolBar): self.preferences_action = shortcut_action('preferences') self.metadata_action = shortcut_action('metadata') self.update_mode_action() + self.color_scheme_action = a = QAction(aa.color_scheme.icon, aa.color_scheme.text, self) + self.color_scheme_menu = m = QMenu(self) + a.setMenu(m) + m.aboutToShow.connect(self.populate_color_scheme_menu) + self.add_actions() def add_actions(self): @@ -189,6 +196,9 @@ class ActionsToolBar(ToolBar): self.addAction(getattr(self, '{}_action'.format(x))) except AttributeError: pass + w = self.widgetForAction(self.color_scheme_action) + if w: + w.setPopupMode(w.InstantPopup) def update_mode_action(self): mode = get_session_pref('read_mode', default='paged', group=None) @@ -244,6 +254,33 @@ class ActionsToolBar(ToolBar): elided_text(os.path.basename(path), width=250))).triggered.connect(partial( self.open_book_at_path.emit, path)) + def on_view_created(self, data): + self.default_color_schemes = data['default_color_schemes'] + + def populate_color_scheme_menu(self): + m = self.color_scheme_menu + m.clear() + ccs = get_session_pref('current_color_scheme', group=None) or '' + ucs = get_session_pref('user_color_schemes', group=None) or {} + + def add_action(key, defns): + a = m.addAction(defns[key]['name']) + a.setCheckable(True) + a.setObjectName('color-switch-action:{}'.format(key)) + a.triggered.connect(self.color_switch_triggerred) + if key == ccs: + a.setChecked(True) + + for key in sorted(ucs, key=lambda x: primary_sort_key(ucs[x]['name'])): + add_action(key, ucs) + m.addSeparator() + for key in sorted(self.default_color_schemes, key=lambda x: primary_sort_key(self.default_color_schemes[x]['name'])): + add_action(key, self.default_color_schemes) + + def color_switch_triggerred(self): + key = self.sender().objectName().partition(':')[-1] + self.action_triggered.emit('switch_color_scheme:' + key) + def update_visibility(self): self.setVisible(bool(get_session_pref('show_actions_toolbar', default=False))) diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index eb1868cccf..a8f3d828b5 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -234,6 +234,7 @@ def create_profile(): class ViewerBridge(Bridge): + view_created = from_js(object) set_session_data = from_js(object, object) set_local_storage = from_js(object, object) reload_book = from_js() @@ -430,6 +431,7 @@ class WebView(RestartingWebEngineView): shortcuts_changed = pyqtSignal(object) paged_mode_changed = pyqtSignal() standalone_misc_settings_changed = pyqtSignal(object) + view_created = pyqtSignal(object) def __init__(self, parent=None): self._host_widget = None @@ -445,6 +447,7 @@ class WebView(RestartingWebEngineView): self._size_hint = QSize(int(w/3), int(w/2)) self._page = WebPage(self) self.bridge.bridge_ready.connect(self.on_bridge_ready) + self.bridge.view_created.connect(self.on_view_created) self.bridge.set_session_data.connect(self.set_session_data) self.bridge.set_local_storage.connect(self.set_local_storage) self.bridge.reload_book.connect(self.reload_book) @@ -550,6 +553,9 @@ class WebView(RestartingWebEngineView): for func, args in iteritems(self.pending_bridge_ready_actions): getattr(self.bridge, func)(*args) + def on_view_created(self, data): + self.view_created.emit(data) + def start_book_load(self, initial_position=None): key = (set_book_path.path,) self.execute_when_ready('start_book_load', key, initial_position, set_book_path.pathtoebook) diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index b75c2262db..c7dec0a697 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -437,12 +437,18 @@ class View: self.update_scroll_speed(-SCROLL_SPEED_STEP) elif data.name is 'toggle_autoscroll': self.toggle_autoscroll() + elif data.name.startsWith('switch_color_scheme:'): + self.switch_color_scheme(data.name.partition(':')[-1]) def on_selection_change(self, data): self.currently_showing.selected_text = data.text if ui_operations.selection_changed: ui_operations.selection_changed(data.text) + def switch_color_scheme(self, name): + get_session_data().set('current_color_scheme', name) + ui_operations.redisplay_book() + def toggle_paged_mode(self): sd = get_session_data() mode = sd.get('read_mode') diff --git a/src/pyj/viewer-main.pyj b/src/pyj/viewer-main.pyj index fb87a39bf9..5e6f06e013 100644 --- a/src/pyj/viewer-main.pyj +++ b/src/pyj/viewer-main.pyj @@ -16,7 +16,7 @@ from modals import create_modal_container from qt import from_python, to_python from read_book.db import new_book from read_book.footnotes import main as footnotes_main -from read_book.globals import runtime, set_system_colors, ui_operations +from read_book.globals import runtime, set_system_colors, ui_operations, default_color_schemes from read_book.iframe import main as iframe_main from read_book.shortcuts import add_standalone_viewer_shortcuts from read_book.view import View @@ -225,6 +225,7 @@ def create_view(prefs, local_storage, field_metadata, ui_data): create_session_data(prefs, local_storage) view = View(document.getElementById('view')) window.addEventListener('resize', debounce(view.on_resize.bind(self), 250)) + to_python.view_created({'default_color_schemes': default_color_schemes}) if ui_data.show_home_page_on_ready: view.overlay.open_book(False)