mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Start work on preview panel
This commit is contained in:
parent
682161fb66
commit
82a0183360
@ -388,6 +388,7 @@ class Boss(QObject):
|
|||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.save_state()
|
self.save_state()
|
||||||
self.save_manager.shutdown()
|
self.save_manager.shutdown()
|
||||||
|
self.gui.preview.parse_worker.shutdown()
|
||||||
self.save_manager.wait(0.1)
|
self.save_manager.wait(0.1)
|
||||||
|
|
||||||
def save_state(self):
|
def save_state(self):
|
||||||
|
98
src/calibre/gui2/tweak_book/preview.py
Normal file
98
src/calibre/gui2/tweak_book/preview.py
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim:fileencoding=utf-8
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import,
|
||||||
|
print_function)
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
|
from threading import Thread
|
||||||
|
from Queue import Queue, Empty
|
||||||
|
|
||||||
|
from PyQt4.Qt import (QWidget, QVBoxLayout, QApplication, QSize, QNetworkAccessManager)
|
||||||
|
from PyQt4.QtWebKit import QWebView
|
||||||
|
|
||||||
|
from calibre.gui2.viewer.documentview import apply_settings
|
||||||
|
from calibre.gui2.viewer.config import config
|
||||||
|
from calibre.utils.ipc.simple_worker import offload_worker
|
||||||
|
|
||||||
|
shutdown = object()
|
||||||
|
|
||||||
|
class ParseWorker(Thread):
|
||||||
|
|
||||||
|
daemon = True
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
Thread.__init__(self)
|
||||||
|
self.worker = offload_worker(priority='low')
|
||||||
|
self.requests = Queue()
|
||||||
|
self.request_count = 0
|
||||||
|
self.start()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
# Connect to the worker and send a dummy job to initialize it
|
||||||
|
self.worker(None, None, (), {})
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
return
|
||||||
|
|
||||||
|
while True:
|
||||||
|
x = self.requests.get()
|
||||||
|
requests = [x]
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
requests.append(self.requests.get_nowait())
|
||||||
|
except Empty:
|
||||||
|
break
|
||||||
|
if shutdown in requests:
|
||||||
|
self.worker.shutdown()
|
||||||
|
break
|
||||||
|
request = sorted(requests, reverse=True)[0]
|
||||||
|
del requests
|
||||||
|
request
|
||||||
|
|
||||||
|
def shutdown(self):
|
||||||
|
self.requests.put(shutdown)
|
||||||
|
|
||||||
|
class NetworkAccessManager(QNetworkAccessManager):
|
||||||
|
|
||||||
|
OPERATION_NAMES = {getattr(QNetworkAccessManager, '%sOperation'%x) :
|
||||||
|
x.upper() for x in ('Head', 'Get', 'Put', 'Post', 'Delete',
|
||||||
|
'Custom')
|
||||||
|
}
|
||||||
|
|
||||||
|
def createRequest(self, operation, request, data):
|
||||||
|
url = unicode(request.url().toString())
|
||||||
|
print (url)
|
||||||
|
return QNetworkAccessManager.createRequest(self, operation, request,
|
||||||
|
data)
|
||||||
|
|
||||||
|
class WebView(QWebView):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QWebView.__init__(self, parent)
|
||||||
|
w = QApplication.instance().desktop().availableGeometry(self).width()
|
||||||
|
self._size_hint = QSize(int(w/3), int(w/2))
|
||||||
|
settings = self.page().settings()
|
||||||
|
apply_settings(settings, config().parse())
|
||||||
|
settings.setMaximumPagesInCache(0)
|
||||||
|
self.setHtml('<p>')
|
||||||
|
self.nam = NetworkAccessManager(self)
|
||||||
|
self.page().setNetworkAccessManager(self.nam)
|
||||||
|
|
||||||
|
def sizeHint(self):
|
||||||
|
return self._size_hint
|
||||||
|
|
||||||
|
class Preview(QWidget):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QWidget.__init__(self, parent)
|
||||||
|
self.l = l = QVBoxLayout()
|
||||||
|
self.setLayout(l)
|
||||||
|
l.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.parse_worker = ParseWorker()
|
||||||
|
self.view = WebView(self)
|
||||||
|
l.addWidget(self.view)
|
||||||
|
|
@ -17,6 +17,7 @@ from calibre.gui2.tweak_book.file_list import FileListWidget
|
|||||||
from calibre.gui2.tweak_book.job import BlockingJob
|
from calibre.gui2.tweak_book.job import BlockingJob
|
||||||
from calibre.gui2.tweak_book.boss import Boss
|
from calibre.gui2.tweak_book.boss import Boss
|
||||||
from calibre.gui2.tweak_book.keyboard import KeyboardManager
|
from calibre.gui2.tweak_book.keyboard import KeyboardManager
|
||||||
|
from calibre.gui2.tweak_book.preview import Preview
|
||||||
|
|
||||||
class Central(QStackedWidget):
|
class Central(QStackedWidget):
|
||||||
' The central widget, hosts the editors '
|
' The central widget, hosts the editors '
|
||||||
@ -190,6 +191,13 @@ class Main(MainWindow):
|
|||||||
d.setWidget(self.file_list)
|
d.setWidget(self.file_list)
|
||||||
self.addDockWidget(Qt.LeftDockWidgetArea, d)
|
self.addDockWidget(Qt.LeftDockWidgetArea, d)
|
||||||
|
|
||||||
|
self.preview_dock = d = QDockWidget(_('&Book preview'), self)
|
||||||
|
d.setObjectName('file_list_dock') # Needed for saveState
|
||||||
|
d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
|
||||||
|
self.preview = Preview(d)
|
||||||
|
d.setWidget(self.preview)
|
||||||
|
self.addDockWidget(Qt.RightDockWidgetArea, d)
|
||||||
|
|
||||||
def resizeEvent(self, ev):
|
def resizeEvent(self, ev):
|
||||||
self.blocking_job.resize(ev.size())
|
self.blocking_job.resize(ev.size())
|
||||||
return super(Main, self).resizeEvent(ev)
|
return super(Main, self).resizeEvent(ev)
|
||||||
|
@ -30,6 +30,18 @@ from calibre.ebooks.oeb.display.webview import load_html
|
|||||||
from calibre.constants import isxp, iswindows
|
from calibre.constants import isxp, iswindows
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
def apply_settings(settings, opts):
|
||||||
|
settings.setFontSize(QWebSettings.DefaultFontSize, opts.default_font_size)
|
||||||
|
settings.setFontSize(QWebSettings.DefaultFixedFontSize, opts.mono_font_size)
|
||||||
|
settings.setFontSize(QWebSettings.MinimumLogicalFontSize, opts.minimum_font_size)
|
||||||
|
settings.setFontSize(QWebSettings.MinimumFontSize, opts.minimum_font_size)
|
||||||
|
settings.setFontFamily(QWebSettings.StandardFont, {'serif':opts.serif_family, 'sans':opts.sans_family, 'mono':opts.mono_family}[opts.standard_font])
|
||||||
|
settings.setFontFamily(QWebSettings.SerifFont, opts.serif_family)
|
||||||
|
settings.setFontFamily(QWebSettings.SansSerifFont, opts.sans_family)
|
||||||
|
settings.setFontFamily(QWebSettings.FixedFont, opts.mono_family)
|
||||||
|
settings.setAttribute(QWebSettings.ZoomTextOnly, True)
|
||||||
|
|
||||||
|
|
||||||
class Document(QWebPage): # {{{
|
class Document(QWebPage): # {{{
|
||||||
|
|
||||||
page_turn = pyqtSignal(object)
|
page_turn = pyqtSignal(object)
|
||||||
@ -38,15 +50,7 @@ class Document(QWebPage): # {{{
|
|||||||
|
|
||||||
def set_font_settings(self, opts):
|
def set_font_settings(self, opts):
|
||||||
settings = self.settings()
|
settings = self.settings()
|
||||||
settings.setFontSize(QWebSettings.DefaultFontSize, opts.default_font_size)
|
apply_settings(settings, opts)
|
||||||
settings.setFontSize(QWebSettings.DefaultFixedFontSize, opts.mono_font_size)
|
|
||||||
settings.setFontSize(QWebSettings.MinimumLogicalFontSize, opts.minimum_font_size)
|
|
||||||
settings.setFontSize(QWebSettings.MinimumFontSize, opts.minimum_font_size)
|
|
||||||
settings.setFontFamily(QWebSettings.StandardFont, {'serif':opts.serif_family, 'sans':opts.sans_family, 'mono':opts.mono_family}[opts.standard_font])
|
|
||||||
settings.setFontFamily(QWebSettings.SerifFont, opts.serif_family)
|
|
||||||
settings.setFontFamily(QWebSettings.SansSerifFont, opts.sans_family)
|
|
||||||
settings.setFontFamily(QWebSettings.FixedFont, opts.mono_family)
|
|
||||||
settings.setAttribute(QWebSettings.ZoomTextOnly, True)
|
|
||||||
|
|
||||||
def do_config(self, parent=None):
|
def do_config(self, parent=None):
|
||||||
d = ConfigDialog(self.shortcuts, parent)
|
d = ConfigDialog(self.shortcuts, parent)
|
||||||
|
@ -206,7 +206,7 @@ def fork_job(mod_name, func_name, args=(), kwargs={}, timeout=300, # seconds
|
|||||||
|
|
||||||
def offload_worker(env={}, priority='normal', cwd=None):
|
def offload_worker(env={}, priority='normal', cwd=None):
|
||||||
listener, w = create_worker(env=env, priority=priority, cwd=cwd, func='offload')
|
listener, w = create_worker(env=env, priority=priority, cwd=cwd, func='offload')
|
||||||
return OffloadWorker(listener)
|
return OffloadWorker(listener, w)
|
||||||
|
|
||||||
def compile_code(src):
|
def compile_code(src):
|
||||||
import re, io
|
import re, io
|
||||||
|
Loading…
x
Reference in New Issue
Block a user