Initial implementation of footnote view dock

This commit is contained in:
Kovid Goyal 2014-11-05 10:01:34 +05:30
parent 2483afa95e
commit 78f1e4a4ab
4 changed files with 82 additions and 12 deletions

View File

@ -43,6 +43,20 @@ def apply_settings(settings, opts):
settings.setFontFamily(QWebSettings.FixedFont, opts.mono_family) settings.setFontFamily(QWebSettings.FixedFont, opts.mono_family)
settings.setAttribute(QWebSettings.ZoomTextOnly, True) settings.setAttribute(QWebSettings.ZoomTextOnly, True)
def apply_basic_settings(settings):
# Security
settings.setAttribute(QWebSettings.JavaEnabled, False)
settings.setAttribute(QWebSettings.PluginsEnabled, False)
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True)
settings.setAttribute(QWebSettings.NotificationsEnabled, False)
settings.setThirdPartyCookiePolicy(QWebSettings.AlwaysBlockThirdPartyCookies)
# Miscellaneous
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
class Document(QWebPage): # {{{ class Document(QWebPage): # {{{
@ -105,15 +119,7 @@ class Document(QWebPage): # {{{
opts = config().parse() opts = config().parse()
self.set_font_settings(opts) self.set_font_settings(opts)
# Security apply_basic_settings(settings)
settings.setAttribute(QWebSettings.JavaEnabled, False)
settings.setAttribute(QWebSettings.PluginsEnabled, False)
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
# Miscellaneous
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
self.set_user_stylesheet(opts) self.set_user_stylesheet(opts)
self.misc_config(opts) self.misc_config(opts)
@ -509,6 +515,7 @@ class DocumentView(QWebView): # {{{
self.document = Document(self.shortcuts, parent=self, self.document = Document(self.shortcuts, parent=self,
debug_javascript=debug_javascript) debug_javascript=debug_javascript)
self.footnotes = Footnotes(self) self.footnotes = Footnotes(self)
self.document.settings_changed.connect(self.footnotes.clone_settings)
self.setPage(self.document) self.setPage(self.document)
self.inspector = WebInspector(self, self.document) self.inspector = WebInspector(self, self.document)
self.manager = None self.manager = None
@ -1309,9 +1316,12 @@ class DocumentView(QWebView): # {{{
def mouseReleaseEvent(self, ev): def mouseReleaseEvent(self, ev):
url = self.document.mainFrame().hitTestContent(ev.pos()).linkUrl() url = self.document.mainFrame().hitTestContent(ev.pos()).linkUrl()
if url.isValid(): if url.isValid() and self.manager is not None:
fd = self.footnotes.get_footnote_data(url) fd = self.footnotes.get_footnote_data(url)
return if fd:
self.manager.show_footnote_view()
ev.accept()
return
opos = self.document.ypos opos = self.document.ypos
if self.manager is not None: if self.manager is not None:
prev_pos = self.manager.update_page_number() prev_pos = self.manager.update_page_number()

View File

@ -9,16 +9,55 @@ __copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
import json import json
from collections import defaultdict from collections import defaultdict
from PyQt5.Qt import QUrl from PyQt5.Qt import QUrl, QWidget, QHBoxLayout, QSize
from PyQt5.QtWebKitWidgets import QWebView, QWebPage
from PyQt5.QtWebKit import QWebSettings
from calibre import prints from calibre import prints
class FootnotesPage(QWebPage):
def __init__(self, parent):
QWebPage.__init__(self, parent)
from calibre.gui2.viewer.documentview import apply_basic_settings
settings = self.settings()
apply_basic_settings(settings)
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, False)
class FootnotesView(QWidget):
def __init__(self, parent):
QWidget.__init__(self, parent)
self.l = l = QHBoxLayout(self)
self.view = v = QWebView(self)
l.addWidget(v)
def page(self):
return self.view.page()
def sizeHint(self):
return QSize(400, 200)
class Footnotes(object): class Footnotes(object):
def __init__(self, view): def __init__(self, view):
self.view = view self.view = view
self.clear() self.clear()
def set_footnotes_view(self, fv):
self.footnotes_view = fv
self.clone_settings()
def clone_settings(self):
source = self.view.document.settings()
settings = self.footnotes_view.page().settings()
for x in 'DefaultFontSize DefaultFixedFontSize MinimumLogicalFontSize MinimumFontSize StandardFont SerifFont SansSerifFont FixedFont'.split():
func = 'setFontSize' if x.endswith('FontSize') else 'setFontFamily'
getattr(settings, func)(getattr(QWebSettings, x), getattr(source, 'f' + func[4:])(getattr(QWebSettings, x)))
settings.setUserStyleSheetUrl(source.userStyleSheetUrl())
def clear(self): def clear(self):
self.footnote_data_cache = {} self.footnote_data_cache = {}
self.known_footnote_targets = defaultdict(set) self.known_footnote_targets = defaultdict(set)

View File

@ -278,6 +278,7 @@ class EbookViewer(MainWindow):
self.restoreState(state, self.STATE_VERSION) self.restoreState(state, self.STATE_VERSION)
except: except:
pass pass
self.initialize_dock_state()
mult = vprefs.get('multiplier', None) mult = vprefs.get('multiplier', None)
if mult: if mult:
self.view.multiplier = mult self.view.multiplier = mult
@ -979,6 +980,9 @@ class EbookViewer(MainWindow):
if self.height() > av: if self.height() > av:
self.resize(self.width(), av) self.resize(self.width(), av)
def show_footnote_view(self):
self.footnotes_dock.show()
def config(defaults=None): def config(defaults=None):
desc = _('Options to control the ebook viewer') desc = _('Options to control the ebook viewer')
if defaults is None: if defaults is None:

View File

@ -21,6 +21,7 @@ from calibre.gui2.search_box import SearchBox2
from calibre.gui2.viewer.documentview import DocumentView from calibre.gui2.viewer.documentview import DocumentView
from calibre.gui2.viewer.bookmarkmanager import BookmarkManager from calibre.gui2.viewer.bookmarkmanager import BookmarkManager
from calibre.gui2.viewer.toc import TOCView, TOCSearch from calibre.gui2.viewer.toc import TOCView, TOCSearch
from calibre.gui2.viewer.footnote import FootnotesView
class DoubleSpinBox(QDoubleSpinBox): # {{{ class DoubleSpinBox(QDoubleSpinBox): # {{{
@ -269,6 +270,15 @@ class Main(MainWindow):
self.addDockWidget(Qt.RightDockWidgetArea, d) self.addDockWidget(Qt.RightDockWidgetArea, d)
d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
self.footnotes_dock = d = QDockWidget(_('Footnotes'), self)
self.footnotes_view = FootnotesView(self)
self.view.footnotes.set_footnotes_view(self.footnotes_view)
d.setObjectName('footnotes-dock')
d.setWidget(self.footnotes_view)
d.close() # starts out hidden
self.addDockWidget(Qt.BottomDockWidgetArea, d)
d.setAllowedAreas(Qt.BottomDockWidgetArea | Qt.TopDockWidgetArea)
self.create_actions() self.create_actions()
self.metadata = Metadata(self.centralwidget) self.metadata = Metadata(self.centralwidget)
@ -332,6 +342,13 @@ class Main(MainWindow):
self.metadata.update_layout() self.metadata.update_layout()
return MainWindow.resizeEvent(self, ev) return MainWindow.resizeEvent(self, ev)
def initialize_dock_state(self):
self.setCorner(Qt.TopLeftCorner, Qt.LeftDockWidgetArea)
self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea)
self.setCorner(Qt.TopRightCorner, Qt.RightDockWidgetArea)
self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea)
self.footnotes_dock.close()
def create_actions(self): def create_actions(self):
def a(name, text, icon, tb=None, sc_name=None, menu_name=None, popup_mode=QToolButton.MenuButtonPopup): def a(name, text, icon, tb=None, sc_name=None, menu_name=None, popup_mode=QToolButton.MenuButtonPopup):
name = 'action_' + name name = 'action_' + name