Viewer toolbar: Add a button to easily change color schemes

Fixes #1859547 [[Enhancement] Toggle between color schemes](https://bugs.launchpad.net/calibre/+bug/1859547)
This commit is contained in:
Kovid Goyal 2020-01-16 15:53:15 +05:30
parent 785c4ae4df
commit 3236f5da9e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 52 additions and 2 deletions

View File

@ -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)))

View File

@ -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)

View File

@ -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')

View File

@ -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)