UI/Previewers/PreviewerHTML.py

changeset 4625
ac72a3d8f89e
parent 4615
7c090c9d389d
child 4631
5c1a96925da4
--- a/UI/Previewers/PreviewerHTML.py	Fri Dec 25 17:44:36 2015 +0100
+++ b/UI/Previewers/PreviewerHTML.py	Sun Dec 27 13:14:00 2015 +0100
@@ -51,15 +51,15 @@
         self.__layout.addWidget(self.titleLabel)
         
         try:
+            from PyQt5.QtWebEngineWidgets import QWebEngineView
+            self.previewView = QWebEngineView(self)
+            self.__usesWebKit = False
+        except ImportError:
             from PyQt5.QtWebKitWidgets import QWebPage, QWebView
             self.previewView = QWebView(self)
             self.previewView.page().setLinkDelegationPolicy(
                 QWebPage.DelegateAllLinks)
             self.__usesWebKit = True
-        except ImportError:
-            from PyQt5.QtWebEngineWidgets import QWebEngineView
-            self.previewView = QWebEngineView(self)
-            self.__usesWebKit = False
         
         sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
         sizePolicy.setHorizontalStretch(0)
@@ -200,10 +200,13 @@
         """
         self.__previewedPath = Utilities.normcasepath(
             Utilities.fromNativeSeparators(filePath))
+        self.__saveScrollBarPositions()
         if self.__usesWebKit:
-            self.__saveScrollBarPositions()
             self.previewView.page().mainFrame().contentsSizeChanged.connect(
                 self.__restoreScrollBarPositions)
+        else:
+            self.previewView.page().loadFinished.connect(
+                self.__restoreScrollBarPositions)
         self.previewView.setHtml(html, baseUrl=QUrl.fromLocalFile(filePath))
     
     @pyqtSlot(str)
@@ -233,6 +236,23 @@
                 frame.scrollBarMaximum(Qt.Horizontal) == pos.x()
             self.__vScrollBarAtEnd[self.__previewedPath] = \
                 frame.scrollBarMaximum(Qt.Vertical) == pos.y()
+        else:
+            from PyQt5.QtCore import QPoint
+            pos = self.__execJavaScript(
+                "(function() {"
+                "var res = {"
+                "    x: 0,"
+                "    y: 0,"
+                "};"
+                "res.x = window.scrollX;"
+                "res.y = window.scrollY;"
+                "return res;"
+                "})()"
+            )
+            pos = QPoint(pos["x"], pos["y"])
+            self.__scrollBarPositions[self.__previewedPath] = pos
+            self.__hScrollBarAtEnd[self.__previewedPath] = False
+            self.__vScrollBarAtEnd[self.__previewedPath] = False
 
     def __restoreScrollBarPositions(self):
         """
@@ -260,6 +280,13 @@
             if self.__vScrollBarAtEnd[self.__previewedPath]:
                 frame.setScrollBarValue(
                     Qt.Vertical, frame.scrollBarMaximum(Qt.Vertical))
+        else:
+            if self.__previewedPath not in self.__scrollBarPositions:
+                return
+            
+            pos = self.__scrollBarPositions[self.__previewedPath]
+            self.previewView.page().runJavaScript(
+                "window.scrollTo({0}, {1});".format(pos.x(), pos.y()))
     
     @pyqtSlot(QUrl)
     def on_previewView_linkClicked(self, url):
@@ -269,6 +296,30 @@
         @param url url of the clicked link (QUrl)
         """
         e5App().getObject("UserInterface").launchHelpViewer(url.toString())
+    
+    def __execJavaScript(self, script):
+        """
+        Private function to execute a JavaScript function Synchroneously.
+        
+        @param script JavaScript script source to be executed
+        @type str
+        @return result of the script
+        @rtype depending upon script result
+        """
+        from PyQt5.QtCore import QEventLoop
+        loop = QEventLoop()
+        resultDict = {"res": None}
+        
+        def resultCallback(res, resDict=resultDict):
+            if loop and loop.isRunning():
+                resDict["res"] = res
+                loop.quit()
+        
+        self.previewView.page().runJavaScript(
+            script, resultCallback)
+        
+        loop.exec_()
+        return resultDict["res"]
 
 
 class PreviewProcessingThread(QThread):

eric ide

mercurial