eric6/UI/Previewers/PreviewerHTML.py

branch
without_py2_and_pyqt4
changeset 7196
ab0a91b82b37
parent 7192
a22eee00b052
child 7198
684261ef2165
equal deleted inserted replaced
7192:a22eee00b052 7196:ab0a91b82b37
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

eric ide

mercurial