mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix #1035182 ([Enhancement] 'Switch themes' button for ebook viewer)
This commit is contained in:
parent
5446deb69a
commit
797013153d
@ -76,6 +76,9 @@ def config(defaults=None):
|
|||||||
|
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
def load_themes():
|
||||||
|
return JSONConfig('viewer_themes')
|
||||||
|
|
||||||
class ConfigDialog(QDialog, Ui_Dialog):
|
class ConfigDialog(QDialog, Ui_Dialog):
|
||||||
|
|
||||||
def __init__(self, shortcuts, parent=None):
|
def __init__(self, shortcuts, parent=None):
|
||||||
@ -113,7 +116,7 @@ class ConfigDialog(QDialog, Ui_Dialog):
|
|||||||
self.hyphenate_default_lang.setVisible(False)
|
self.hyphenate_default_lang.setVisible(False)
|
||||||
self.hyphenate_label.setVisible(False)
|
self.hyphenate_label.setVisible(False)
|
||||||
|
|
||||||
self.themes = JSONConfig('viewer_themes')
|
self.themes = load_themes()
|
||||||
self.save_theme_button.clicked.connect(self.save_theme)
|
self.save_theme_button.clicked.connect(self.save_theme)
|
||||||
self.load_theme_button.m = m = QMenu()
|
self.load_theme_button.m = m = QMenu()
|
||||||
self.load_theme_button.setMenu(m)
|
self.load_theme_button.setMenu(m)
|
||||||
|
@ -21,7 +21,7 @@ from calibre.customize.ui import all_viewer_plugins
|
|||||||
from calibre.gui2.viewer.keys import SHORTCUTS
|
from calibre.gui2.viewer.keys import SHORTCUTS
|
||||||
from calibre.gui2.viewer.javascript import JavaScriptLoader
|
from calibre.gui2.viewer.javascript import JavaScriptLoader
|
||||||
from calibre.gui2.viewer.position import PagePosition
|
from calibre.gui2.viewer.position import PagePosition
|
||||||
from calibre.gui2.viewer.config import config, ConfigDialog
|
from calibre.gui2.viewer.config import config, ConfigDialog, load_themes
|
||||||
from calibre.gui2.viewer.image_popup import ImagePopup
|
from calibre.gui2.viewer.image_popup import ImagePopup
|
||||||
from calibre.ebooks.oeb.display.webview import load_html
|
from calibre.ebooks.oeb.display.webview import load_html
|
||||||
from calibre.constants import isxp, iswindows
|
from calibre.constants import isxp, iswindows
|
||||||
@ -31,8 +31,7 @@ class Document(QWebPage): # {{{
|
|||||||
|
|
||||||
page_turn = pyqtSignal(object)
|
page_turn = pyqtSignal(object)
|
||||||
|
|
||||||
def set_font_settings(self):
|
def set_font_settings(self, opts):
|
||||||
opts = config().parse()
|
|
||||||
settings = self.settings()
|
settings = self.settings()
|
||||||
settings.setFontSize(QWebSettings.DefaultFontSize, opts.default_font_size)
|
settings.setFontSize(QWebSettings.DefaultFontSize, opts.default_font_size)
|
||||||
settings.setFontSize(QWebSettings.DefaultFixedFontSize, opts.mono_font_size)
|
settings.setFontSize(QWebSettings.DefaultFixedFontSize, opts.mono_font_size)
|
||||||
@ -47,11 +46,15 @@ class Document(QWebPage): # {{{
|
|||||||
def do_config(self, parent=None):
|
def do_config(self, parent=None):
|
||||||
d = ConfigDialog(self.shortcuts, parent)
|
d = ConfigDialog(self.shortcuts, parent)
|
||||||
if d.exec_() == QDialog.Accepted:
|
if d.exec_() == QDialog.Accepted:
|
||||||
with self.page_position:
|
opts = config().parse()
|
||||||
self.set_font_settings()
|
self.apply_settings(opts)
|
||||||
self.set_user_stylesheet()
|
|
||||||
self.misc_config()
|
def apply_settings(self, opts):
|
||||||
self.after_load()
|
with self.page_position:
|
||||||
|
self.set_font_settings(opts)
|
||||||
|
self.set_user_stylesheet(opts)
|
||||||
|
self.misc_config(opts)
|
||||||
|
self.after_load()
|
||||||
|
|
||||||
def __init__(self, shortcuts, parent=None, debug_javascript=False):
|
def __init__(self, shortcuts, parent=None, debug_javascript=False):
|
||||||
QWebPage.__init__(self, parent)
|
QWebPage.__init__(self, parent)
|
||||||
@ -87,7 +90,8 @@ class Document(QWebPage): # {{{
|
|||||||
self.all_viewer_plugins = tuple(all_viewer_plugins())
|
self.all_viewer_plugins = tuple(all_viewer_plugins())
|
||||||
for pl in self.all_viewer_plugins:
|
for pl in self.all_viewer_plugins:
|
||||||
pl.load_fonts()
|
pl.load_fonts()
|
||||||
self.set_font_settings()
|
opts = config().parse()
|
||||||
|
self.set_font_settings(opts)
|
||||||
|
|
||||||
# Security
|
# Security
|
||||||
settings.setAttribute(QWebSettings.JavaEnabled, False)
|
settings.setAttribute(QWebSettings.JavaEnabled, False)
|
||||||
@ -98,8 +102,8 @@ class Document(QWebPage): # {{{
|
|||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
||||||
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
|
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
|
||||||
self.set_user_stylesheet()
|
self.set_user_stylesheet(opts)
|
||||||
self.misc_config()
|
self.misc_config(opts)
|
||||||
|
|
||||||
# Load javascript
|
# Load javascript
|
||||||
self.mainFrame().javaScriptWindowObjectCleared.connect(
|
self.mainFrame().javaScriptWindowObjectCleared.connect(
|
||||||
@ -112,8 +116,7 @@ class Document(QWebPage): # {{{
|
|||||||
mf.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
|
mf.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
|
||||||
mf.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
|
mf.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
|
||||||
|
|
||||||
def set_user_stylesheet(self):
|
def set_user_stylesheet(self, opts):
|
||||||
opts = config().parse()
|
|
||||||
bg = opts.background_color or 'white'
|
bg = opts.background_color or 'white'
|
||||||
brules = ['background-color: %s !important'%bg]
|
brules = ['background-color: %s !important'%bg]
|
||||||
prefix = '''
|
prefix = '''
|
||||||
@ -127,8 +130,7 @@ class Document(QWebPage): # {{{
|
|||||||
data += b64encode(raw.encode('utf-8'))
|
data += b64encode(raw.encode('utf-8'))
|
||||||
self.settings().setUserStyleSheetUrl(QUrl(data))
|
self.settings().setUserStyleSheetUrl(QUrl(data))
|
||||||
|
|
||||||
def misc_config(self):
|
def misc_config(self, opts):
|
||||||
opts = config().parse()
|
|
||||||
self.hyphenate = opts.hyphenate
|
self.hyphenate = opts.hyphenate
|
||||||
self.hyphenate_default_lang = opts.hyphenate_default_lang
|
self.hyphenate_default_lang = opts.hyphenate_default_lang
|
||||||
self.do_fit_images = opts.fit_images
|
self.do_fit_images = opts.fit_images
|
||||||
@ -560,6 +562,15 @@ class DocumentView(QWebView): # {{{
|
|||||||
self.document.switch_to_fullscreen_mode()
|
self.document.switch_to_fullscreen_mode()
|
||||||
self.setFocus(Qt.OtherFocusReason)
|
self.setFocus(Qt.OtherFocusReason)
|
||||||
|
|
||||||
|
def load_theme(self, theme_id):
|
||||||
|
themes = load_themes()
|
||||||
|
theme = themes[theme_id]
|
||||||
|
opts = config(theme).parse()
|
||||||
|
self.document.apply_settings(opts)
|
||||||
|
if self.document.in_fullscreen_mode:
|
||||||
|
self.document.switch_to_fullscreen_mode()
|
||||||
|
self.setFocus(Qt.OtherFocusReason)
|
||||||
|
|
||||||
def bookmark(self):
|
def bookmark(self):
|
||||||
return self.document.bookmark()
|
return self.document.bookmark()
|
||||||
|
|
||||||
|
@ -245,8 +245,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
self.action_back.triggered[bool].connect(self.back)
|
self.action_back.triggered[bool].connect(self.back)
|
||||||
self.action_forward.triggered[bool].connect(self.forward)
|
self.action_forward.triggered[bool].connect(self.forward)
|
||||||
self.action_bookmark.triggered[bool].connect(self.bookmark)
|
self.action_bookmark.triggered[bool].connect(self.bookmark)
|
||||||
self.action_preferences.triggered.connect(lambda :
|
self.action_preferences.triggered.connect(self.do_config)
|
||||||
self.view.config(self))
|
|
||||||
self.pos.editingFinished.connect(self.goto_page_num)
|
self.pos.editingFinished.connect(self.goto_page_num)
|
||||||
self.vertical_scrollbar.valueChanged[int].connect(lambda
|
self.vertical_scrollbar.valueChanged[int].connect(lambda
|
||||||
x:self.goto_page(x/100.))
|
x:self.goto_page(x/100.))
|
||||||
@ -259,6 +258,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
self.action_bookmark.setMenu(self.bookmarks_menu)
|
self.action_bookmark.setMenu(self.bookmarks_menu)
|
||||||
self.set_bookmarks([])
|
self.set_bookmarks([])
|
||||||
|
|
||||||
|
self.themes_menu = QMenu()
|
||||||
|
self.action_load_theme.setMenu(self.themes_menu)
|
||||||
|
self.tool_bar.widgetForAction(self.action_load_theme).setPopupMode(QToolButton.InstantPopup)
|
||||||
|
self.load_theme_menu()
|
||||||
|
|
||||||
if pathtoebook is not None:
|
if pathtoebook is not None:
|
||||||
f = functools.partial(self.load_ebook, pathtoebook, open_at=open_at)
|
f = functools.partial(self.load_ebook, pathtoebook, open_at=open_at)
|
||||||
@ -845,6 +848,21 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
getattr(self, o).setEnabled(False)
|
getattr(self, o).setEnabled(False)
|
||||||
self.setCursor(Qt.BusyCursor)
|
self.setCursor(Qt.BusyCursor)
|
||||||
|
|
||||||
|
def load_theme_menu(self):
|
||||||
|
from calibre.gui2.viewer.config import load_themes
|
||||||
|
self.themes_menu.clear()
|
||||||
|
for key in load_themes():
|
||||||
|
title = key[len('theme_'):]
|
||||||
|
self.themes_menu.addAction(title, partial(self.load_theme,
|
||||||
|
key))
|
||||||
|
|
||||||
|
def load_theme(self, theme_id):
|
||||||
|
self.view.load_theme(theme_id)
|
||||||
|
|
||||||
|
def do_config(self):
|
||||||
|
self.view.config(self)
|
||||||
|
self.load_theme_menu()
|
||||||
|
|
||||||
def bookmark(self, *args):
|
def bookmark(self, *args):
|
||||||
num = 1
|
num = 1
|
||||||
bm = None
|
bm = None
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>653</width>
|
<width>653</width>
|
||||||
<height>672</height>
|
<height>746</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -141,6 +141,7 @@
|
|||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="action_preferences"/>
|
<addaction name="action_preferences"/>
|
||||||
<addaction name="action_metadata"/>
|
<addaction name="action_metadata"/>
|
||||||
|
<addaction name="action_load_theme"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="action_print"/>
|
<addaction name="action_print"/>
|
||||||
</widget>
|
</widget>
|
||||||
@ -332,6 +333,18 @@
|
|||||||
<string>Toggle Paged mode</string>
|
<string>Toggle Paged mode</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="action_load_theme">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/wizard.png</normaloff>:/images/wizard.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Load theme</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Load a theme</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user