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():
|
def all_actions():
|
||||||
if not hasattr(all_actions, 'ans'):
|
if not hasattr(all_actions, 'ans'):
|
||||||
all_actions.ans = Actions({
|
all_actions.ans = Actions({
|
||||||
|
'color_scheme': Action('format-fill-color.png', _('Switch color scheme')),
|
||||||
'back': Action('back.png', _('Back')),
|
'back': Action('back.png', _('Back')),
|
||||||
'forward': Action('forward.png', _('Forward')),
|
'forward': Action('forward.png', _('Forward')),
|
||||||
'open': Action('document_open.png', _('Open e-book')),
|
'open': Action('document_open.png', _('Open e-book')),
|
||||||
@ -67,7 +68,7 @@ def all_actions():
|
|||||||
|
|
||||||
|
|
||||||
DEFAULT_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',
|
None, 'previous', 'next', None, 'toc', 'bookmarks', 'lookup', 'reference', 'chrome', None, 'mode', 'print', 'preferences',
|
||||||
'metadata', 'inspector'
|
'metadata', 'inspector'
|
||||||
)
|
)
|
||||||
@ -131,6 +132,7 @@ class ActionsToolBar(ToolBar):
|
|||||||
web_view.standalone_misc_settings_changed.connect(self.update_visibility)
|
web_view.standalone_misc_settings_changed.connect(self.update_visibility)
|
||||||
web_view.autoscroll_state_changed.connect(self.update_autoscroll_action)
|
web_view.autoscroll_state_changed.connect(self.update_autoscroll_action)
|
||||||
web_view.customize_toolbar.connect(self.customize, type=Qt.QueuedConnection)
|
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 = page.action(QWebEnginePage.Back)
|
||||||
self.back_action.setIcon(aa.back.icon)
|
self.back_action.setIcon(aa.back.icon)
|
||||||
@ -176,6 +178,11 @@ class ActionsToolBar(ToolBar):
|
|||||||
self.preferences_action = shortcut_action('preferences')
|
self.preferences_action = shortcut_action('preferences')
|
||||||
self.metadata_action = shortcut_action('metadata')
|
self.metadata_action = shortcut_action('metadata')
|
||||||
self.update_mode_action()
|
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()
|
self.add_actions()
|
||||||
|
|
||||||
def add_actions(self):
|
def add_actions(self):
|
||||||
@ -189,6 +196,9 @@ class ActionsToolBar(ToolBar):
|
|||||||
self.addAction(getattr(self, '{}_action'.format(x)))
|
self.addAction(getattr(self, '{}_action'.format(x)))
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
w = self.widgetForAction(self.color_scheme_action)
|
||||||
|
if w:
|
||||||
|
w.setPopupMode(w.InstantPopup)
|
||||||
|
|
||||||
def update_mode_action(self):
|
def update_mode_action(self):
|
||||||
mode = get_session_pref('read_mode', default='paged', group=None)
|
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(
|
elided_text(os.path.basename(path), width=250))).triggered.connect(partial(
|
||||||
self.open_book_at_path.emit, path))
|
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):
|
def update_visibility(self):
|
||||||
self.setVisible(bool(get_session_pref('show_actions_toolbar', default=False)))
|
self.setVisible(bool(get_session_pref('show_actions_toolbar', default=False)))
|
||||||
|
|
||||||
|
@ -234,6 +234,7 @@ def create_profile():
|
|||||||
|
|
||||||
class ViewerBridge(Bridge):
|
class ViewerBridge(Bridge):
|
||||||
|
|
||||||
|
view_created = from_js(object)
|
||||||
set_session_data = from_js(object, object)
|
set_session_data = from_js(object, object)
|
||||||
set_local_storage = from_js(object, object)
|
set_local_storage = from_js(object, object)
|
||||||
reload_book = from_js()
|
reload_book = from_js()
|
||||||
@ -430,6 +431,7 @@ class WebView(RestartingWebEngineView):
|
|||||||
shortcuts_changed = pyqtSignal(object)
|
shortcuts_changed = pyqtSignal(object)
|
||||||
paged_mode_changed = pyqtSignal()
|
paged_mode_changed = pyqtSignal()
|
||||||
standalone_misc_settings_changed = pyqtSignal(object)
|
standalone_misc_settings_changed = pyqtSignal(object)
|
||||||
|
view_created = pyqtSignal(object)
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
self._host_widget = None
|
self._host_widget = None
|
||||||
@ -445,6 +447,7 @@ class WebView(RestartingWebEngineView):
|
|||||||
self._size_hint = QSize(int(w/3), int(w/2))
|
self._size_hint = QSize(int(w/3), int(w/2))
|
||||||
self._page = WebPage(self)
|
self._page = WebPage(self)
|
||||||
self.bridge.bridge_ready.connect(self.on_bridge_ready)
|
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_session_data.connect(self.set_session_data)
|
||||||
self.bridge.set_local_storage.connect(self.set_local_storage)
|
self.bridge.set_local_storage.connect(self.set_local_storage)
|
||||||
self.bridge.reload_book.connect(self.reload_book)
|
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):
|
for func, args in iteritems(self.pending_bridge_ready_actions):
|
||||||
getattr(self.bridge, func)(*args)
|
getattr(self.bridge, func)(*args)
|
||||||
|
|
||||||
|
def on_view_created(self, data):
|
||||||
|
self.view_created.emit(data)
|
||||||
|
|
||||||
def start_book_load(self, initial_position=None):
|
def start_book_load(self, initial_position=None):
|
||||||
key = (set_book_path.path,)
|
key = (set_book_path.path,)
|
||||||
self.execute_when_ready('start_book_load', key, initial_position, set_book_path.pathtoebook)
|
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)
|
self.update_scroll_speed(-SCROLL_SPEED_STEP)
|
||||||
elif data.name is 'toggle_autoscroll':
|
elif data.name is 'toggle_autoscroll':
|
||||||
self.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):
|
def on_selection_change(self, data):
|
||||||
self.currently_showing.selected_text = data.text
|
self.currently_showing.selected_text = data.text
|
||||||
if ui_operations.selection_changed:
|
if ui_operations.selection_changed:
|
||||||
ui_operations.selection_changed(data.text)
|
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):
|
def toggle_paged_mode(self):
|
||||||
sd = get_session_data()
|
sd = get_session_data()
|
||||||
mode = sd.get('read_mode')
|
mode = sd.get('read_mode')
|
||||||
|
@ -16,7 +16,7 @@ from modals import create_modal_container
|
|||||||
from qt import from_python, to_python
|
from qt import from_python, to_python
|
||||||
from read_book.db import new_book
|
from read_book.db import new_book
|
||||||
from read_book.footnotes import main as footnotes_main
|
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.iframe import main as iframe_main
|
||||||
from read_book.shortcuts import add_standalone_viewer_shortcuts
|
from read_book.shortcuts import add_standalone_viewer_shortcuts
|
||||||
from read_book.view import View
|
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)
|
create_session_data(prefs, local_storage)
|
||||||
view = View(document.getElementById('view'))
|
view = View(document.getElementById('view'))
|
||||||
window.addEventListener('resize', debounce(view.on_resize.bind(self), 250))
|
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:
|
if ui_data.show_home_page_on_ready:
|
||||||
view.overlay.open_book(False)
|
view.overlay.open_book(False)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user