Fix #1035182 ([Enhancement] 'Switch themes' button for ebook viewer)

This commit is contained in:
Kovid Goyal 2012-09-13 11:13:25 +05:30
parent 5446deb69a
commit 797013153d
4 changed files with 64 additions and 19 deletions

View File

@ -76,6 +76,9 @@ def config(defaults=None):
return c
def load_themes():
return JSONConfig('viewer_themes')
class ConfigDialog(QDialog, Ui_Dialog):
def __init__(self, shortcuts, parent=None):
@ -113,7 +116,7 @@ class ConfigDialog(QDialog, Ui_Dialog):
self.hyphenate_default_lang.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.load_theme_button.m = m = QMenu()
self.load_theme_button.setMenu(m)

View File

@ -21,7 +21,7 @@ from calibre.customize.ui import all_viewer_plugins
from calibre.gui2.viewer.keys import SHORTCUTS
from calibre.gui2.viewer.javascript import JavaScriptLoader
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.ebooks.oeb.display.webview import load_html
from calibre.constants import isxp, iswindows
@ -31,8 +31,7 @@ class Document(QWebPage): # {{{
page_turn = pyqtSignal(object)
def set_font_settings(self):
opts = config().parse()
def set_font_settings(self, opts):
settings = self.settings()
settings.setFontSize(QWebSettings.DefaultFontSize, opts.default_font_size)
settings.setFontSize(QWebSettings.DefaultFixedFontSize, opts.mono_font_size)
@ -47,11 +46,15 @@ class Document(QWebPage): # {{{
def do_config(self, parent=None):
d = ConfigDialog(self.shortcuts, parent)
if d.exec_() == QDialog.Accepted:
with self.page_position:
self.set_font_settings()
self.set_user_stylesheet()
self.misc_config()
self.after_load()
opts = config().parse()
self.apply_settings(opts)
def apply_settings(self, opts):
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):
QWebPage.__init__(self, parent)
@ -87,7 +90,8 @@ class Document(QWebPage): # {{{
self.all_viewer_plugins = tuple(all_viewer_plugins())
for pl in self.all_viewer_plugins:
pl.load_fonts()
self.set_font_settings()
opts = config().parse()
self.set_font_settings(opts)
# Security
settings.setAttribute(QWebSettings.JavaEnabled, False)
@ -98,8 +102,8 @@ class Document(QWebPage): # {{{
# Miscellaneous
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
self.set_user_stylesheet()
self.misc_config()
self.set_user_stylesheet(opts)
self.misc_config(opts)
# Load javascript
self.mainFrame().javaScriptWindowObjectCleared.connect(
@ -112,8 +116,7 @@ class Document(QWebPage): # {{{
mf.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
mf.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
def set_user_stylesheet(self):
opts = config().parse()
def set_user_stylesheet(self, opts):
bg = opts.background_color or 'white'
brules = ['background-color: %s !important'%bg]
prefix = '''
@ -127,8 +130,7 @@ class Document(QWebPage): # {{{
data += b64encode(raw.encode('utf-8'))
self.settings().setUserStyleSheetUrl(QUrl(data))
def misc_config(self):
opts = config().parse()
def misc_config(self, opts):
self.hyphenate = opts.hyphenate
self.hyphenate_default_lang = opts.hyphenate_default_lang
self.do_fit_images = opts.fit_images
@ -560,6 +562,15 @@ class DocumentView(QWebView): # {{{
self.document.switch_to_fullscreen_mode()
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):
return self.document.bookmark()

View File

@ -245,8 +245,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.action_back.triggered[bool].connect(self.back)
self.action_forward.triggered[bool].connect(self.forward)
self.action_bookmark.triggered[bool].connect(self.bookmark)
self.action_preferences.triggered.connect(lambda :
self.view.config(self))
self.action_preferences.triggered.connect(self.do_config)
self.pos.editingFinished.connect(self.goto_page_num)
self.vertical_scrollbar.valueChanged[int].connect(lambda
x:self.goto_page(x/100.))
@ -259,6 +258,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.action_bookmark.setMenu(self.bookmarks_menu)
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:
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)
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):
num = 1
bm = None

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>653</width>
<height>672</height>
<height>746</height>
</rect>
</property>
<property name="windowTitle">
@ -141,6 +141,7 @@
<addaction name="separator"/>
<addaction name="action_preferences"/>
<addaction name="action_metadata"/>
<addaction name="action_load_theme"/>
<addaction name="separator"/>
<addaction name="action_print"/>
</widget>
@ -332,6 +333,18 @@
<string>Toggle Paged mode</string>
</property>
</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>
<customwidgets>
<customwidget>