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

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.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,10 +46,14 @@ 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:
opts = config().parse()
self.apply_settings(opts)
def apply_settings(self, opts):
with self.page_position: with self.page_position:
self.set_font_settings() self.set_font_settings(opts)
self.set_user_stylesheet() self.set_user_stylesheet(opts)
self.misc_config() self.misc_config(opts)
self.after_load() self.after_load()
def __init__(self, shortcuts, parent=None, debug_javascript=False): def __init__(self, shortcuts, parent=None, debug_javascript=False):
@ -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()

View File

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

View File

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