36
36
37
37
try :
38
38
# Attempt to import QtWebEngine
39
- from PyQt5 .QtWebEngineWidgets import QWebEngineView
40
39
from PyQt5 .QtWebChannel import QWebChannel
40
+ from PyQt5 .QtWebEngineWidgets import QWebEngineView
41
41
IS_WEBENGINE_VALID = True
42
42
except ImportError :
43
43
QWebEngineView = object # Prevent inheritance errors
44
44
IS_WEBENGINE_VALID = False
45
45
46
46
try :
47
47
# Attempt to import QtWebKit
48
- from PyQt5 .QtWebKitWidgets import QWebView
48
+ from PyQt5 .QtWebKitWidgets import QWebView , QWebPage
49
49
IS_WEBKIT_VALID = True
50
50
except ImportError :
51
51
QWebView = object # Prevent inheritance errors
@@ -63,6 +63,10 @@ def run_js(self, code, callback=None, retries=0):
63
63
"""Run javascript code snippet"""
64
64
raise Exception ("run_js not implemented" )
65
65
66
+ def get_html (self ):
67
+ """Get HTML for Timeline, adjusted for mixin"""
68
+ raise Exception ("get_html not implemented" )
69
+
66
70
67
71
class TimelineQtWebEngineMixin (TimelineBaseMixin , QWebEngineView ):
68
72
"""QtWebEngine Timeline Widget"""
@@ -83,7 +87,7 @@ def __init__(self):
83
87
84
88
# Set url from configuration (QUrl takes absolute paths for file system paths, create from QFileInfo)
85
89
self .webchannel = QWebChannel (self .page ())
86
- self .setUrl ( QUrl .fromLocalFile (QFileInfo (self .html_path ).absoluteFilePath ()))
90
+ self .setHtml ( self . get_html (), QUrl .fromLocalFile (QFileInfo (self .html_path ).absoluteFilePath ()))
87
91
self .page ().setWebChannel (self .webchannel )
88
92
89
93
# Connect signal of javascript initialization to our javascript reference init function
@@ -114,6 +118,34 @@ def setup_js_data(self):
114
118
# Export self as a javascript object in webview
115
119
self .webchannel .registerObject ('timeline' , self )
116
120
121
+ def get_html (self ):
122
+ """Get HTML for Timeline, adjusted for mixin"""
123
+ html = open (self .html_path , 'r' , encoding = 'utf-8' ).read ()
124
+ html = html .replace ('{{MIXIN_JS_INCLUDE}}' ,
125
+ '''
126
+ <script type="text/javascript" src="js/qwebchannel.js"></script>
127
+ <script type="text/javascript" src="js/mixin_webengine.js"></script>
128
+
129
+ ''' )
130
+ return html
131
+
132
+ def keyPressEvent (self , event ):
133
+ """ Keypress callback for timeline """
134
+ key_value = event .key ()
135
+ if (key_value == Qt .Key_Shift or key_value == Qt .Key_Control ):
136
+
137
+ # Only pass a few keystrokes to the webview (CTRL and SHIFT)
138
+ return QWebEngineView .keyPressEvent (self , event )
139
+
140
+ else :
141
+ # Ignore most keypresses
142
+ event .ignore ()
143
+
144
+
145
+ class LoggingWebPage (QWebPage ):
146
+ """Override console.log message to display messages"""
147
+ def javaScriptConsoleMessage (self , msg , line , source ):
148
+ log .warning ('JS: %s line %d: %s' % (source , line , msg ))
117
149
118
150
class TimelineQtWebKitMixin (TimelineBaseMixin , QWebView ):
119
151
"""QtWebKit Timeline Widget"""
@@ -126,11 +158,15 @@ def __init__(self):
126
158
# Delete the webview when closed
127
159
self .setAttribute (Qt .WA_DeleteOnClose )
128
160
161
+ # Connect logging web page (for console.log)
162
+ page = LoggingWebPage ()
163
+ self .setPage (page )
164
+
129
165
# Disable image caching on timeline
130
166
self .settings ().setObjectCacheCapacities (0 , 0 , 0 )
131
167
132
168
# Set url from configuration (QUrl takes absolute paths for file system paths, create from QFileInfo)
133
- self .setUrl ( QUrl .fromLocalFile (QFileInfo (self .html_path ).absoluteFilePath ()))
169
+ self .setHtml ( self . get_html (), QUrl .fromLocalFile (QFileInfo (self .html_path ).absoluteFilePath ()))
134
170
135
171
# Connect signal of javascript initialization to our javascript reference init function
136
172
self .page ().mainFrame ().javaScriptWindowObjectCleared .connect (self .setup_js_data )
@@ -152,7 +188,8 @@ def run_js(self, code, callback=None, retries=0):
152
188
else :
153
189
# Execute JS code
154
190
if callback :
155
- return self .page ().mainFrame ().evaluateJavaScript (code , callback )
191
+ # Pass output to callback
192
+ callback (self .page ().mainFrame ().evaluateJavaScript (code ))
156
193
else :
157
194
return self .page ().mainFrame ().evaluateJavaScript (code )
158
195
@@ -161,6 +198,27 @@ def setup_js_data(self):
161
198
self .page ().mainFrame ().addToJavaScriptWindowObject ('timeline' , self )
162
199
self .page ().mainFrame ().addToJavaScriptWindowObject ('mainWindow' , self .window )
163
200
201
+ def get_html (self ):
202
+ """Get HTML for Timeline, adjusted for mixin"""
203
+ html = open (self .html_path , 'r' , encoding = 'utf-8' ).read ()
204
+ html = html .replace ('{{MIXIN_JS_INCLUDE}}' ,
205
+ '''
206
+ <script type="text/javascript" src="js/mixin_webkit.js"></script>
207
+
208
+ ''' )
209
+ return html
210
+
211
+ def keyPressEvent (self , event ):
212
+ """ Keypress callback for timeline """
213
+ key_value = event .key ()
214
+ if (key_value == Qt .Key_Shift or key_value == Qt .Key_Control ):
215
+
216
+ # Only pass a few keystrokes to the webview (CTRL and SHIFT)
217
+ return QWebView .keyPressEvent (self , event )
218
+
219
+ else :
220
+ # Ignore most keypresses
221
+ event .ignore ()
164
222
165
223
# Set correct Mixin (with QtWebEngine preference)
166
224
if IS_WEBENGINE_VALID :
0 commit comments