Connect up the Qt bridge in the viewer

This commit is contained in:
Kovid Goyal 2018-09-16 15:45:44 +05:30
parent 25ef13c6ee
commit 8b0cdbad13
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 29 additions and 7 deletions

View File

@ -70,3 +70,4 @@ class EbookViewer(MainWindow):
det_msg=data['tb'], show=True) det_msg=data['tb'], show=True)
return return
set_book_path(data['base']) set_book_path(data['base'])
self.web_view.start_book_load()

View File

@ -122,14 +122,9 @@ def create_profile():
class ViewerBridge(Bridge): class ViewerBridge(Bridge):
request_sync = from_js(object, object, object)
request_split = from_js(object, object)
live_css_data = from_js(object) live_css_data = from_js(object)
go_to_sourceline_address = to_js() start_book_load = to_js()
go_to_anchor = to_js()
set_split_mode = to_js()
live_css = to_js()
class WebPage(QWebEnginePage): class WebPage(QWebEnginePage):
@ -169,6 +164,8 @@ class WebView(RestartingWebEngineView):
w = QApplication.instance().desktop().availableGeometry(self).width() w = QApplication.instance().desktop().availableGeometry(self).width()
self._size_hint = QSize(int(w/3), int(w/2)) self._size_hint = QSize(int(w/3), int(w/2))
self._page = WebPage(self) self._page = WebPage(self)
self.bridge.bridge_ready.connect(self.on_bridge_ready)
self.pending_bridge_ready_actions = set()
self.setPage(self._page) self.setPage(self._page)
self.setAcceptDrops(False) self.setAcceptDrops(False)
self.clear() self.clear()
@ -189,3 +186,17 @@ class WebView(RestartingWebEngineView):
def clear(self): def clear(self):
self.setHtml('<p>&nbsp;', QUrl('{}://{}/'.format(FAKE_PROTOCOL, FAKE_HOST))) self.setHtml('<p>&nbsp;', QUrl('{}://{}/'.format(FAKE_PROTOCOL, FAKE_HOST)))
@property
def bridge(self):
return self._page.bridge
def on_bridge_ready(self):
for func, args in self.pending_bridge_ready_actions:
getattr(self.bridge, func)(*args)
def start_book_load(self):
if self.bridge.ready:
self.bridge.start_book_load()
else:
self.pending_bridge_ready_actions.add(('start_book_load', ()))

View File

@ -73,6 +73,8 @@ class to_js_bound(QObject):
class Bridge(QObject): class Bridge(QObject):
bridge_ready = pyqtSignal()
def __init__(self, page): def __init__(self, page):
QObject.__init__(self, page) QObject.__init__(self, page)
self._signals = json.dumps(tuple({k for k, v in self.__class__.__dict__.iteritems() if isinstance(v, pyqtSignal)})) self._signals = json.dumps(tuple({k for k, v in self.__class__.__dict__.iteritems() if isinstance(v, pyqtSignal)}))
@ -100,6 +102,7 @@ class Bridge(QObject):
if isinstance(v, to_js): if isinstance(v, to_js):
setattr(self, k, to_js_bound(self, k)) setattr(self, k, to_js_bound(self, k))
self.page.runJavaScript('python_comm._register_signals(' + self._signals + ')', QWebEngineScript.ApplicationWorld) self.page.runJavaScript('python_comm._register_signals(' + self._signals + ')', QWebEngineScript.ApplicationWorld)
self.bridge_ready.emit()
def _poll_for_messages(self): def _poll_for_messages(self):
self.page.runJavaScript('python_comm._poll()', QWebEngineScript.ApplicationWorld, self._dispatch_messages) self.page.runJavaScript('python_comm._poll()', QWebEngineScript.ApplicationWorld, self._dispatch_messages)

View File

@ -5,6 +5,7 @@ from __python__ import bound_methods, hash_literals
from elementmaker import E from elementmaker import E
from read_book.globals import runtime, ui_operations from read_book.globals import runtime, ui_operations
from qt import from_python
def container_div(id): def container_div(id):
return E.div(id=id, style='margin: 0; padding: 0; display: none') return E.div(id=id, style='margin: 0; padding: 0; display: none')
@ -28,13 +29,19 @@ def show_error(title, msg, details):
pass # TODO: Implement this pass # TODO: Implement this
@from_python
def start_book_load():
print(111111111111111)
if window is window.top: if window is window.top:
# main # main
document.body.appendChild(E.iframe(srcdoc="<p> "))
ui_operations.get_file = get_file ui_operations.get_file = get_file
ui_operations.get_mathjax_files = get_mathjax_files ui_operations.get_mathjax_files = get_mathjax_files
ui_operations.update_url_state = update_url_state ui_operations.update_url_state = update_url_state
ui_operations.show_error = show_error ui_operations.show_error = show_error
document.body.appendChild(E.div(id='loading'))
document.body.appendChild(E.div(id='view'))
else: else:
# iframe # iframe
pass pass