26
26
"""
27
27
28
28
import os
29
+ import logging
29
30
from classes import info
30
- from PyQt5 .QtCore import QFileInfo , pyqtSlot , QUrl , Qt , QCoreApplication , QTimer
31
- from PyQt5 .QtGui import QCursor , QKeySequence , QColor
32
- from PyQt5 .QtWidgets import QMenu
31
+ from PyQt5 .QtCore import Qt , QObject , QFileInfo , QUrl , QTimer
32
+ from PyQt5 .QtGui import QColor
33
33
from classes .logger import log
34
34
from functools import partial
35
35
36
36
37
37
try :
38
38
# Attempt to import QtWebEngine
39
39
from PyQt5 .QtWebChannel import QWebChannel
40
- from PyQt5 .QtWebEngineWidgets import QWebEngineView
40
+ from PyQt5 .QtWebEngineWidgets import QWebEngineView , QWebEnginePage
41
41
IS_WEBENGINE_VALID = True
42
42
except ImportError :
43
- QWebEngineView = object # Prevent inheritance errors
43
+ QWebEngineView = QObject # Prevent inheritance errors
44
44
IS_WEBENGINE_VALID = False
45
45
46
46
try :
47
47
# Attempt to import QtWebKit
48
48
from PyQt5 .QtWebKitWidgets import QWebView , QWebPage
49
49
IS_WEBKIT_VALID = True
50
50
except ImportError :
51
- QWebView = object # Prevent inheritance errors
52
- QWebPage = object
51
+ QWebView = QObject # Prevent inheritance errors
53
52
IS_WEBKIT_VALID = False
54
53
54
+ if IS_WEBKIT_VALID :
55
+ class LoggingWebKitPage (QWebPage ):
56
+ """Override console.log message to display messages"""
57
+ def javaScriptConsoleMessage (self , msg , line , source , * args ):
58
+ log .warning ('%s@L%d: %s' % (os .path .basename (source ), line , msg ))
59
+
60
+ def __init__ (self , parent = None ):
61
+ super ().__init__ (parent = parent )
62
+ self .setObjectName ("LoggingWebKitPage" )
63
+ else :
64
+ LoggingWebKitPage = object
65
+
66
+
67
+ if IS_WEBENGINE_VALID :
68
+ class LoggingWebEnginePage (QWebEnginePage ):
69
+ """Override console.log message to display messages"""
70
+ def javaScriptConsoleMessage (self , level , msg , line , source ):
71
+ log .log (
72
+ self .levels [level ],
73
+ '%s@%d: %s' % (os .path .basename (source ), line , msg ))
74
+
75
+ def __init__ (self , parent = None ):
76
+ super ().__init__ (parent = parent )
77
+ self .setObjectName ("LoggingWebEnginePage" )
78
+ self .levels = [logging .INFO , logging .WARNING , logging .ERROR ]
79
+
80
+ else :
81
+ LoggingWebEnginePage = object
82
+
55
83
56
84
class TimelineBaseMixin (object ):
57
85
"""OpenShot Timeline Base Mixin Class"""
58
- def __init__ (self ):
86
+ def __init__ (self , * args ):
59
87
"""Initialization code required for parent widget"""
60
88
self .document_is_ready = False
61
- self .html_path = html_path = os .path .join (info .PATH , 'timeline' , 'index.html' )
89
+ self .html_path = os .path .join (info .PATH , 'timeline' , 'index.html' )
62
90
63
91
def run_js (self , code , callback = None , retries = 0 ):
64
92
"""Run javascript code snippet"""
@@ -74,8 +102,14 @@ class TimelineQtWebEngineMixin(TimelineBaseMixin, QWebEngineView):
74
102
75
103
def __init__ (self ):
76
104
"""Initialization code required for widget"""
105
+ super (QWebEngineView , self ).__init__ ()
77
106
TimelineBaseMixin .__init__ (self )
78
- QWebEngineView .__init__ (self )
107
+ self .setObjectName ("TimelineQtWebEngineMixin" )
108
+
109
+ # Connect logging web page (for console.log)
110
+ if IS_WEBENGINE_VALID :
111
+ self .new_page = LoggingWebEnginePage (self )
112
+ self .setPage (self .new_page )
79
113
80
114
# Set background color of timeline
81
115
self .page ().setBackgroundColor (QColor ("#363636" ))
@@ -92,6 +126,7 @@ def __init__(self):
92
126
self .page ().setWebChannel (self .webchannel )
93
127
94
128
# Connect signal of javascript initialization to our javascript reference init function
129
+ log .info ("WebEngine backend initializing" )
95
130
self .page ().loadStarted .connect (self .setup_js_data )
96
131
97
132
def run_js (self , code , callback = None , retries = 0 ):
@@ -117,6 +152,7 @@ def run_js(self, code, callback=None, retries=0):
117
152
118
153
def setup_js_data (self ):
119
154
# Export self as a javascript object in webview
155
+ log .info ("Registering WebChannel connection with WebEngine" )
120
156
self .webchannel .registerObject ('timeline' , self )
121
157
122
158
def get_html (self ):
@@ -143,25 +179,22 @@ def keyPressEvent(self, event):
143
179
event .ignore ()
144
180
145
181
146
- class LoggingWebPage (QWebPage ):
147
- """Override console.log message to display messages"""
148
- def javaScriptConsoleMessage (self , msg , line , source ):
149
- log .warning ('JS: %s line %d: %s' % (source , line , msg ))
150
-
151
182
class TimelineQtWebKitMixin (TimelineBaseMixin , QWebView ):
152
183
"""QtWebKit Timeline Widget"""
153
184
154
185
def __init__ (self ):
155
186
"""Initialization code required for widget"""
187
+ super (QWebView , self ).__init__ ()
156
188
TimelineBaseMixin .__init__ (self )
157
- QWebView . __init__ ( self )
189
+ self . setObjectName ( "TimelineQtWebKitMixin" )
158
190
159
191
# Delete the webview when closed
160
192
self .setAttribute (Qt .WA_DeleteOnClose )
161
193
162
194
# Connect logging web page (for console.log)
163
- page = LoggingWebPage ()
164
- self .setPage (page )
195
+ if IS_WEBKIT_VALID :
196
+ self .new_page = LoggingWebKitPage (self )
197
+ self .setPage (self .new_page )
165
198
166
199
# Disable image caching on timeline
167
200
self .settings ().setObjectCacheCapacities (0 , 0 , 0 )
@@ -170,6 +203,7 @@ def __init__(self):
170
203
self .setHtml (self .get_html (), QUrl .fromLocalFile (QFileInfo (self .html_path ).absoluteFilePath ()))
171
204
172
205
# Connect signal of javascript initialization to our javascript reference init function
206
+ log .info ("WebKit backend initializing" )
173
207
self .page ().mainFrame ().javaScriptWindowObjectCleared .connect (self .setup_js_data )
174
208
175
209
def run_js (self , code , callback = None , retries = 0 ):
@@ -196,6 +230,7 @@ def run_js(self, code, callback=None, retries=0):
196
230
197
231
def setup_js_data (self ):
198
232
# Export self as a javascript object in webview
233
+ log .info ("Registering objects with WebKit" )
199
234
self .page ().mainFrame ().addToJavaScriptWindowObject ('timeline' , self )
200
235
self .page ().mainFrame ().addToJavaScriptWindowObject ('mainWindow' , self .window )
201
236
@@ -213,14 +248,13 @@ def keyPressEvent(self, event):
213
248
""" Keypress callback for timeline """
214
249
key_value = event .key ()
215
250
if (key_value == Qt .Key_Shift or key_value == Qt .Key_Control ):
216
-
217
251
# Only pass a few keystrokes to the webview (CTRL and SHIFT)
218
252
return QWebView .keyPressEvent (self , event )
219
-
220
253
else :
221
254
# Ignore most keypresses
222
255
event .ignore ()
223
256
257
+
224
258
# Set correct Mixin (with QtWebEngine preference)
225
259
if IS_WEBENGINE_VALID :
226
260
TimelineMixin = TimelineQtWebEngineMixin
0 commit comments