51 |
51 |
52 try: |
52 try: |
53 from PyQt5.QtWebEngineWidgets import QWebEngineView |
53 from PyQt5.QtWebEngineWidgets import QWebEngineView |
54 self.previewView = QWebEngineView(self) |
54 self.previewView = QWebEngineView(self) |
55 self.previewView.page().linkHovered.connect(self.__showLink) |
55 self.previewView.page().linkHovered.connect(self.__showLink) |
56 self.__usesWebKit = False |
|
57 except ImportError: |
56 except ImportError: |
58 try: |
57 self.__previewAvailable = False |
59 from PyQt5.QtWebKitWidgets import QWebPage, QWebView |
58 self.titleLabel.setText(self.tr( |
60 self.previewView = QWebView(self) |
59 "<b>HTML Preview is not available!<br/>" |
61 self.previewView.page().setLinkDelegationPolicy( |
60 "Install QtWebEngine.</b>")) |
62 QWebPage.DelegateAllLinks) |
61 self.titleLabel.setAlignment(Qt.AlignHCenter) |
63 self.__usesWebKit = True |
62 self.__layout.addStretch() |
64 except ImportError: |
63 return |
65 self.__previewAvailable = False |
|
66 self.titleLabel.setText(self.tr( |
|
67 "<b>HTML Preview is not available!<br/>" |
|
68 "Install QtWebEngine or QtWebKit.</b>")) |
|
69 self.titleLabel.setAlignment(Qt.AlignHCenter) |
|
70 self.__layout.addStretch() |
|
71 return |
|
72 |
64 |
73 sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) |
65 sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) |
74 sizePolicy.setHorizontalStretch(0) |
66 sizePolicy.setHorizontalStretch(0) |
75 sizePolicy.setVerticalStretch(0) |
67 sizePolicy.setVerticalStretch(0) |
76 sizePolicy.setHeightForWidth( |
68 sizePolicy.setHeightForWidth( |
92 self.__layout.addWidget(self.ssiCheckBox) |
84 self.__layout.addWidget(self.ssiCheckBox) |
93 |
85 |
94 self.jsCheckBox.clicked[bool].connect(self.on_jsCheckBox_clicked) |
86 self.jsCheckBox.clicked[bool].connect(self.on_jsCheckBox_clicked) |
95 self.ssiCheckBox.clicked[bool].connect(self.on_ssiCheckBox_clicked) |
87 self.ssiCheckBox.clicked[bool].connect(self.on_ssiCheckBox_clicked) |
96 self.previewView.titleChanged.connect(self.on_previewView_titleChanged) |
88 self.previewView.titleChanged.connect(self.on_previewView_titleChanged) |
97 if self.__usesWebKit: |
|
98 self.previewView.linkClicked.connect( |
|
99 self.on_previewView_linkClicked) |
|
100 |
89 |
101 self.jsCheckBox.setChecked( |
90 self.jsCheckBox.setChecked( |
102 Preferences.getUI("ShowFilePreviewJS")) |
91 Preferences.getUI("ShowFilePreviewJS")) |
103 self.ssiCheckBox.setChecked( |
92 self.ssiCheckBox.setChecked( |
104 Preferences.getUI("ShowFilePreviewSSI")) |
93 Preferences.getUI("ShowFilePreviewSSI")) |
232 @type str |
221 @type str |
233 """ |
222 """ |
234 self.__previewedPath = Utilities.normcasepath( |
223 self.__previewedPath = Utilities.normcasepath( |
235 Utilities.fromNativeSeparators(filePath)) |
224 Utilities.fromNativeSeparators(filePath)) |
236 self.__saveScrollBarPositions() |
225 self.__saveScrollBarPositions() |
237 if self.__usesWebKit: |
226 self.previewView.page().loadFinished.connect( |
238 self.previewView.page().mainFrame().contentsSizeChanged.connect( |
227 self.__restoreScrollBarPositions) |
239 self.__restoreScrollBarPositions) |
228 if not filePath: |
240 else: |
229 filePath = "/" |
241 self.previewView.page().loadFinished.connect( |
|
242 self.__restoreScrollBarPositions) |
|
243 if not filePath: |
|
244 filePath = "/" |
|
245 if rootPath: |
230 if rootPath: |
246 baseUrl = QUrl.fromLocalFile(rootPath + "/index.html") |
231 baseUrl = QUrl.fromLocalFile(rootPath + "/index.html") |
247 else: |
232 else: |
248 baseUrl = QUrl.fromLocalFile(filePath) |
233 baseUrl = QUrl.fromLocalFile(filePath) |
249 self.previewView.setHtml(html, baseUrl=baseUrl) |
234 self.previewView.setHtml(html, baseUrl=baseUrl) |
264 |
249 |
265 def __saveScrollBarPositions(self): |
250 def __saveScrollBarPositions(self): |
266 """ |
251 """ |
267 Private method to save scroll bar positions for a previewed editor. |
252 Private method to save scroll bar positions for a previewed editor. |
268 """ |
253 """ |
269 if self.__usesWebKit: |
254 from PyQt5.QtCore import QPoint |
270 frame = self.previewView.page().mainFrame() |
255 try: |
271 if frame.contentsSize() == QSize(0, 0): |
256 pos = self.previewView.scrollPosition() |
272 return # no valid data, nothing to save |
257 except AttributeError: |
273 |
258 pos = self.__execJavaScript( |
274 pos = frame.scrollPosition() |
259 "(function() {" |
275 self.__scrollBarPositions[self.__previewedPath] = pos |
260 "var res = {" |
276 self.__hScrollBarAtEnd[self.__previewedPath] = \ |
261 " x: 0," |
277 frame.scrollBarMaximum(Qt.Horizontal) == pos.x() |
262 " y: 0," |
278 self.__vScrollBarAtEnd[self.__previewedPath] = \ |
263 "};" |
279 frame.scrollBarMaximum(Qt.Vertical) == pos.y() |
264 "res.x = window.scrollX;" |
280 else: |
265 "res.y = window.scrollY;" |
281 from PyQt5.QtCore import QPoint |
266 "return res;" |
282 try: |
267 "})()" |
283 pos = self.previewView.scrollPosition() |
268 ) |
284 except AttributeError: |
269 if pos is not None: |
285 pos = self.__execJavaScript( |
270 pos = QPoint(pos["x"], pos["y"]) |
286 "(function() {" |
271 else: |
287 "var res = {" |
272 pos = QPoint(0, 0) |
288 " x: 0," |
273 self.__scrollBarPositions[self.__previewedPath] = pos |
289 " y: 0," |
274 self.__hScrollBarAtEnd[self.__previewedPath] = False |
290 "};" |
275 self.__vScrollBarAtEnd[self.__previewedPath] = False |
291 "res.x = window.scrollX;" |
|
292 "res.y = window.scrollY;" |
|
293 "return res;" |
|
294 "})()" |
|
295 ) |
|
296 if pos is not None: |
|
297 pos = QPoint(pos["x"], pos["y"]) |
|
298 else: |
|
299 pos = QPoint(0, 0) |
|
300 self.__scrollBarPositions[self.__previewedPath] = pos |
|
301 self.__hScrollBarAtEnd[self.__previewedPath] = False |
|
302 self.__vScrollBarAtEnd[self.__previewedPath] = False |
|
303 |
276 |
304 def __restoreScrollBarPositions(self): |
277 def __restoreScrollBarPositions(self): |
305 """ |
278 """ |
306 Private method to restore scroll bar positions for a previewed editor. |
279 Private method to restore scroll bar positions for a previewed editor. |
307 """ |
280 """ |
308 if self.__usesWebKit: |
281 if self.__previewedPath not in self.__scrollBarPositions: |
309 try: |
282 return |
310 self.previewView.page().mainFrame().contentsSizeChanged.\ |
283 |
311 disconnect(self.__restoreScrollBarPositions) |
284 pos = self.__scrollBarPositions[self.__previewedPath] |
312 except TypeError: |
285 self.previewView.page().runJavaScript( |
313 # not connected, simply ignore it |
286 "window.scrollTo({0}, {1});".format(pos.x(), pos.y())) |
314 pass |
|
315 |
|
316 if self.__previewedPath not in self.__scrollBarPositions: |
|
317 return |
|
318 |
|
319 frame = self.previewView.page().mainFrame() |
|
320 frame.setScrollPosition( |
|
321 self.__scrollBarPositions[self.__previewedPath]) |
|
322 |
|
323 if self.__hScrollBarAtEnd[self.__previewedPath]: |
|
324 frame.setScrollBarValue( |
|
325 Qt.Horizontal, frame.scrollBarMaximum(Qt.Horizontal)) |
|
326 |
|
327 if self.__vScrollBarAtEnd[self.__previewedPath]: |
|
328 frame.setScrollBarValue( |
|
329 Qt.Vertical, frame.scrollBarMaximum(Qt.Vertical)) |
|
330 else: |
|
331 if self.__previewedPath not in self.__scrollBarPositions: |
|
332 return |
|
333 |
|
334 pos = self.__scrollBarPositions[self.__previewedPath] |
|
335 self.previewView.page().runJavaScript( |
|
336 "window.scrollTo({0}, {1});".format(pos.x(), pos.y())) |
|
337 |
|
338 @pyqtSlot(QUrl) |
|
339 def on_previewView_linkClicked(self, url): |
|
340 """ |
|
341 Private slot handling the clicking of a link. |
|
342 |
|
343 @param url URL of the clicked link |
|
344 @type QUrl |
|
345 """ |
|
346 e5App().getObject("UserInterface").launchHelpViewer(url) |
|
347 |
287 |
348 def __execJavaScript(self, script): |
288 def __execJavaScript(self, script): |
349 """ |
289 """ |
350 Private function to execute a JavaScript function Synchroneously. |
290 Private function to execute a JavaScript function Synchroneously. |
351 |
291 |