mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
parent
785c4ae4df
commit
3236f5da9e
@ -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)))
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user