Re-enabled the print preview function for all platforms and the print for Windows platforms for the new web browser and Qt >= 5.8.0.

Mon, 20 Feb 2017 19:27:37 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 20 Feb 2017 19:27:37 +0100
changeset 5534
f9368ecf153a
parent 5533
3c908e3b6e5c
child 5541
0498dc01d58c

Re-enabled the print preview function for all platforms and the print for Windows platforms for the new web browser and Qt >= 5.8.0.

APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric6.WebBrowser.WebBrowserPage.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.WebBrowser.WebBrowserTabWidget.html file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserTabWidget.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Sun Feb 19 19:57:28 2017 +0100
+++ b/APIs/Python3/eric6.api	Mon Feb 20 19:27:37 2017 +0100
@@ -10814,12 +10814,13 @@
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.acceptNavigationRequest?4(url, type_, isMainFrame)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.certificateError?4(error)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.execJavaScript?4(script, worldId=QWebEngineScript.MainWorld, timeout=500)
+eric6.WebBrowser.WebBrowserPage.WebBrowserPage.execPrintPage?4(printer, timeout=1000)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.hitTestContent?4(pos)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.icon?4()
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.isJavaScriptEnabled?4()
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.javaScriptConsoleMessage?4(level, message, lineNumber, sourceId)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.mapToViewport?4(pos)
-eric6.WebBrowser.WebBrowserPage.WebBrowserPage.printPage?4(printer)
+eric6.WebBrowser.WebBrowserPage.WebBrowserPage.printCallback?4(resDict=resultDict)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.resultCallback?4(resDict=resultDict)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.runJavaScript?4(script, worldId=-1, callback=None)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.scroll?4(x, y)
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sun Feb 19 19:57:28 2017 +0100
+++ b/Documentation/Help/source.qhp	Mon Feb 20 19:27:37 2017 +0100
@@ -15585,12 +15585,12 @@
       <keyword name="WebBrowserPage (Module)" id="WebBrowserPage (Module)" ref="eric6.WebBrowser.WebBrowserPage.html" />
       <keyword name="WebBrowserPage.__featurePermissionRequested" id="WebBrowserPage.__featurePermissionRequested" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__featurePermissionRequested" />
       <keyword name="WebBrowserPage.__fullScreenRequested" id="WebBrowserPage.__fullScreenRequested" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__fullScreenRequested" />
-      <keyword name="WebBrowserPage.__printFinished" id="WebBrowserPage.__printFinished" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__printFinished" />
       <keyword name="WebBrowserPage.__setupWebChannel" id="WebBrowserPage.__setupWebChannel" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__setupWebChannel" />
       <keyword name="WebBrowserPage.__urlChanged" id="WebBrowserPage.__urlChanged" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__urlChanged" />
       <keyword name="WebBrowserPage.acceptNavigationRequest" id="WebBrowserPage.acceptNavigationRequest" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.acceptNavigationRequest" />
       <keyword name="WebBrowserPage.certificateError" id="WebBrowserPage.certificateError" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.certificateError" />
       <keyword name="WebBrowserPage.execJavaScript" id="WebBrowserPage.execJavaScript" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.execJavaScript" />
+      <keyword name="WebBrowserPage.execPrintPage" id="WebBrowserPage.execPrintPage" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.execPrintPage" />
       <keyword name="WebBrowserPage.hitTestContent" id="WebBrowserPage.hitTestContent" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.hitTestContent" />
       <keyword name="WebBrowserPage.icon" id="WebBrowserPage.icon" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.icon" />
       <keyword name="WebBrowserPage.isJavaScriptEnabled" id="WebBrowserPage.isJavaScriptEnabled" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.isJavaScriptEnabled" />
@@ -15600,7 +15600,7 @@
       <keyword name="WebBrowserPage.on_refererWhitelistButton_clicked" id="WebBrowserPage.on_refererWhitelistButton_clicked" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_refererWhitelistButton_clicked" />
       <keyword name="WebBrowserPage.on_setCurrentPageButton_clicked" id="WebBrowserPage.on_setCurrentPageButton_clicked" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_setCurrentPageButton_clicked" />
       <keyword name="WebBrowserPage.on_startupCombo_currentIndexChanged" id="WebBrowserPage.on_startupCombo_currentIndexChanged" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_startupCombo_currentIndexChanged" />
-      <keyword name="WebBrowserPage.printPage" id="WebBrowserPage.printPage" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.printPage" />
+      <keyword name="WebBrowserPage.printCallback" id="WebBrowserPage.printCallback" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.printCallback" />
       <keyword name="WebBrowserPage.resultCallback" id="WebBrowserPage.resultCallback" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.resultCallback" />
       <keyword name="WebBrowserPage.runJavaScript" id="WebBrowserPage.runJavaScript" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.runJavaScript" />
       <keyword name="WebBrowserPage.save" id="WebBrowserPage.save" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.save" />
@@ -15643,6 +15643,7 @@
       <keyword name="WebBrowserTabWidget.__pathSelected" id="WebBrowserTabWidget.__pathSelected" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pathSelected" />
       <keyword name="WebBrowserTabWidget.__pdfGeneratedForPrinting" id="WebBrowserTabWidget.__pdfGeneratedForPrinting" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pdfGeneratedForPrinting" />
       <keyword name="WebBrowserTabWidget.__pdfGeneratedForSave" id="WebBrowserTabWidget.__pdfGeneratedForSave" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pdfGeneratedForSave" />
+      <keyword name="WebBrowserTabWidget.__printPreviewRequested" id="WebBrowserTabWidget.__printPreviewRequested" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__printPreviewRequested" />
       <keyword name="WebBrowserTabWidget.__recentlyAudibleChanged" id="WebBrowserTabWidget.__recentlyAudibleChanged" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__recentlyAudibleChanged" />
       <keyword name="WebBrowserTabWidget.__showContextMenu" id="WebBrowserTabWidget.__showContextMenu" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__showContextMenu" />
       <keyword name="WebBrowserTabWidget.__showNavigationMenu" id="WebBrowserTabWidget.__showNavigationMenu" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__showNavigationMenu" />
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html	Sun Feb 19 19:57:28 2017 +0100
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html	Mon Feb 20 19:27:37 2017 +0100
@@ -75,9 +75,6 @@
 <td><a href="#WebBrowserPage.__fullScreenRequested">__fullScreenRequested</a></td>
 <td>Private slot handling a full screen request.</td>
 </tr><tr>
-<td><a href="#WebBrowserPage.__printFinished">__printFinished</a></td>
-<td>Private method called when the print job finished.</td>
-</tr><tr>
 <td><a href="#WebBrowserPage.__setupWebChannel">__setupWebChannel</a></td>
 <td>Private method to setup a web channel to our external object.</td>
 </tr><tr>
@@ -93,6 +90,9 @@
 <td><a href="#WebBrowserPage.execJavaScript">execJavaScript</a></td>
 <td>Public method to execute a JavaScript function synchroneously.</td>
 </tr><tr>
+<td><a href="#WebBrowserPage.execPrintPage">execPrintPage</a></td>
+<td>Public method to execute a synchronous print.</td>
+</tr><tr>
 <td><a href="#WebBrowserPage.hitTestContent">hitTestContent</a></td>
 <td>Public method to test the content at a specified position.</td>
 </tr><tr>
@@ -108,8 +108,8 @@
 <td><a href="#WebBrowserPage.mapToViewport">mapToViewport</a></td>
 <td>Public method to map a position to the viewport.</td>
 </tr><tr>
-<td><a href="#WebBrowserPage.printPage">printPage</a></td>
-<td>Public method to print the current page.</td>
+<td><a href="#WebBrowserPage.printCallback">printCallback</a></td>
+<td></td>
 </tr><tr>
 <td><a href="#WebBrowserPage.resultCallback">resultCallback</a></td>
 <td></td>
@@ -202,16 +202,6 @@
 <dd>
 reference to the full screen request
 </dd>
-</dl><a NAME="WebBrowserPage.__printFinished" ID="WebBrowserPage.__printFinished"></a>
-<h4>WebBrowserPage.__printFinished</h4>
-<b>__printFinished</b>(<i>ok</i>)
-<p>
-        Private method called when the print job finished.
-</p><dl>
-<dt><i>ok</i> (bool)</dt>
-<dd>
-flag indicating a successful print
-</dd>
 </dl><a NAME="WebBrowserPage.__setupWebChannel" ID="WebBrowserPage.__setupWebChannel"></a>
 <h4>WebBrowserPage.__setupWebChannel</h4>
 <b>__setupWebChannel</b>(<i></i>)
@@ -300,6 +290,29 @@
 <dd>
 depending upon script result
 </dd>
+</dl><a NAME="WebBrowserPage.execPrintPage" ID="WebBrowserPage.execPrintPage"></a>
+<h4>WebBrowserPage.execPrintPage</h4>
+<b>execPrintPage</b>(<i>printer, timeout=1000</i>)
+<p>
+        Public method to execute a synchronous print.
+</p><dl>
+<dt><i>printer</i> (QPrinter)</dt>
+<dd>
+reference to the printer object
+</dd><dt><i>timeout</i> (int)</dt>
+<dd>
+timeout value in milliseconds
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a successful print job
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
 </dl><a NAME="WebBrowserPage.hitTestContent" ID="WebBrowserPage.hitTestContent"></a>
 <h4>WebBrowserPage.hitTestContent</h4>
 <b>hitTestContent</b>(<i>pos</i>)
@@ -389,20 +402,10 @@
 <dd>
 QPoint
 </dd>
-</dl><a NAME="WebBrowserPage.printPage" ID="WebBrowserPage.printPage"></a>
-<h4>WebBrowserPage.printPage</h4>
-<b>printPage</b>(<i>printer</i>)
-<p>
-        Public method to print the current page.
-</p><p>
-        Note: This is just a wrapper around QWebEnginePage.print() to ensure
-        the printer object is available until the print job finished.
-</p><dl>
-<dt><i>printer</i> (QPrinter)</dt>
-<dd>
-reference to the printer object
-</dd>
-</dl><a NAME="WebBrowserPage.resultCallback" ID="WebBrowserPage.resultCallback"></a>
+</dl><a NAME="WebBrowserPage.printCallback" ID="WebBrowserPage.printCallback"></a>
+<h4>WebBrowserPage.printCallback</h4>
+<b>printCallback</b>(<i>resDict=resultDict</i>)
+<a NAME="WebBrowserPage.resultCallback" ID="WebBrowserPage.resultCallback"></a>
 <h4>WebBrowserPage.resultCallback</h4>
 <b>resultCallback</b>(<i>resDict=resultDict</i>)
 <a NAME="WebBrowserPage.runJavaScript" ID="WebBrowserPage.runJavaScript"></a>
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserTabWidget.html	Sun Feb 19 19:57:28 2017 +0100
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserTabWidget.html	Mon Feb 20 19:27:37 2017 +0100
@@ -134,6 +134,9 @@
 <td><a href="#WebBrowserTabWidget.__pdfGeneratedForSave">__pdfGeneratedForSave</a></td>
 <td>Private slot to save the generated PDF data to a file.</td>
 </tr><tr>
+<td><a href="#WebBrowserTabWidget.__printPreviewRequested">__printPreviewRequested</a></td>
+<td>Private slot to generate the print preview.</td>
+</tr><tr>
 <td><a href="#WebBrowserTabWidget.__recentlyAudibleChanged">__recentlyAudibleChanged</a></td>
 <td>Private slot to react on the audible state of a page.</td>
 </tr><tr>
@@ -399,6 +402,19 @@
 <dd>
 generated PDF document
 </dd>
+</dl><a NAME="WebBrowserTabWidget.__printPreviewRequested" ID="WebBrowserTabWidget.__printPreviewRequested"></a>
+<h4>WebBrowserTabWidget.__printPreviewRequested</h4>
+<b>__printPreviewRequested</b>(<i>printer, browser</i>)
+<p>
+        Private slot to generate the print preview.
+</p><dl>
+<dt><i>printer</i> (QPrinter)</dt>
+<dd>
+reference to the printer object
+</dd><dt><i>browser</i> (WebBrowserView)</dt>
+<dd>
+reference to the browser to be printed
+</dd>
 </dl><a NAME="WebBrowserTabWidget.__recentlyAudibleChanged" ID="WebBrowserTabWidget.__recentlyAudibleChanged"></a>
 <h4>WebBrowserTabWidget.__recentlyAudibleChanged</h4>
 <b>__recentlyAudibleChanged</b>(<i>recentlyAudible</i>)
@@ -693,7 +709,7 @@
 </p><dl>
 <dt><i>browser</i></dt>
 <dd>
-reference to the browser to be printed (HelpBrowserWV)
+reference to the browser to be printed (WebBrowserView)
 </dd>
 </dl><a NAME="WebBrowserTabWidget.reloadAllBrowsers" ID="WebBrowserTabWidget.reloadAllBrowsers"></a>
 <h4>WebBrowserTabWidget.reloadAllBrowsers</h4>
--- a/WebBrowser/WebBrowserPage.py	Sun Feb 19 19:57:28 2017 +0100
+++ b/WebBrowser/WebBrowserPage.py	Mon Feb 20 19:27:37 2017 +0100
@@ -310,27 +310,30 @@
         else:
             request.reject()
     
-    def printPage(self, printer):
+    def execPrintPage(self, printer, timeout=1000):
         """
-        Public method to print the current page.
-        
-        Note: This is just a wrapper around QWebEnginePage.print() to ensure
-        the printer object is available until the print job finished.
+        Public method to execute a synchronous print.
         
         @param printer reference to the printer object
         @type QPrinter
-        """
-        self.__printer = printer
-        self.print(self.__printer, self.__printFinished)
-    
-    def __printFinished(self, ok):
+        @param timeout timeout value in milliseconds
+        @type int
+        @return flag indicating a successful print job
+        @rtype bool
         """
-        Private method called when the print job finished.
+        loop = QEventLoop()
+        resultDict = {"res": None}
+        QTimer.singleShot(timeout, loop.quit)
         
-        @param ok flag indicating a successful print
-        @type bool
-        """
-        self.__printer = None
+        def printCallback(res, resDict=resultDict):
+            if loop and loop.isRunning():
+                resDict["res"] = res
+                loop.quit()
+        
+        self.print(printer, printCallback)
+        
+        loop.exec_()
+        return resultDict["res"]
     
     ##############################################
     ## Methods below deal with JavaScript messages
--- a/WebBrowser/WebBrowserTabWidget.py	Sun Feb 19 19:57:28 2017 +0100
+++ b/WebBrowser/WebBrowserTabWidget.py	Mon Feb 20 19:27:37 2017 +0100
@@ -14,7 +14,8 @@
 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl, QDir, QFile, \
     QFileDevice, QTemporaryFile, qVersion
 from PyQt5.QtGui import QIcon, QPixmap, QPainter
-from PyQt5.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, QDialog
+from PyQt5.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, \
+    QDialog, QApplication
 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog
 
 from E5Gui.E5TabWidget import E5TabWidget
@@ -183,11 +184,13 @@
         self.__tabContextMenu.addAction(
             self.tr('Close All'), self.closeAllBrowsers)
         self.__tabContextMenu.addSeparator()
-        if not Globals.isWindowsPlatform() and qVersion() < "5.7.0":
+        if qVersion() >= "5.8.0" or (
+                not Globals.isWindowsPlatform() and qVersion() < "5.7.0"):
             self.__tabContextMenu.addAction(
                 UI.PixmapCache.getIcon("printPreview.png"),
                 self.tr('Print Preview'), self.__tabContextMenuPrintPreview)
-        if not Globals.isWindowsPlatform() or qVersion() >= "5.7.0":
+        if qVersion() >= "5.8.0" or (
+                not Globals.isWindowsPlatform() or qVersion() >= "5.7.0"):
             self.__tabContextMenu.addAction(
                 UI.PixmapCache.getIcon("print.png"),
                 self.tr('Print'), self.__tabContextMenuPrint)
@@ -639,12 +642,10 @@
                 printDialog.setOption(QAbstractPrintDialog.PrintCollateCopies)
             printDialog.setOption(QAbstractPrintDialog.PrintPageRange)
         if printDialog.exec_() == QDialog.Accepted:
-            # TODO: enable this once it works correctly in Qt
-##            if hasattr(browser.page(), "print"):
-##                # Qt >= 5.8.0
-##                browser.page().printPage(printer)
-##            elif hasattr(browser.page(), "printToPdf"):
-            if hasattr(browser.page(), "printToPdf"):
+            if hasattr(browser.page(), "print"):
+                # Qt >= 5.8.0
+                browser.page().execPrintPage(printer)
+            elif hasattr(browser.page(), "printToPdf"):
                 # Qt >= 5.7.0
                 if printer.outputFormat() == QPrinter.PdfFormat:
                     # print to PDF file selected
@@ -658,8 +659,8 @@
                     browser.page().printToPdf(
                         self.__pdfGeneratedForPrinting,
                         printer.pageLayout())
-        else:
-            browser.render(printer)
+            else:
+                browser.render(printer)
     
     @pyqtSlot()
     def printBrowserPdf(self, browser=None):
@@ -780,7 +781,7 @@
         """
         Public slot called to show a print preview of the displayed file.
         
-        @param browser reference to the browser to be printed (HelpBrowserWV)
+        @param browser reference to the browser to be printed (WebBrowserView)
         """
         from PyQt5.QtPrintSupport import QPrintPreviewDialog
         
@@ -809,9 +810,27 @@
         printer.setResolution(Preferences.getPrinter("Resolution"))
         
         preview = QPrintPreviewDialog(printer, self)
-        preview.paintRequested.connect(lambda p: browser.render(p))
+        preview.resize(800, 750)
+        if qVersion() >= "5.8.0":
+            preview.paintRequested.connect(
+                lambda p: self.__printPreviewRequested(p, browser))
+        else:
+            preview.paintRequested.connect(lambda p: browser.render(p))
         preview.exec_()
     
+    def __printPreviewRequested(self, printer, browser):
+        """
+        Private slot to generate the print preview.
+        
+        @param printer reference to the printer object
+        @type QPrinter
+        @param browser reference to the browser to be printed
+        @type WebBrowserView
+        """
+        QApplication.setOverrideCursor(Qt.WaitCursor);
+        browser.page().execPrintPage(printer, 10 * 1000)
+        QApplication.restoreOverrideCursor();
+    
     def __sourceChanged(self, url):
         """
         Private slot to handle a change of a browsers source.
--- a/WebBrowser/WebBrowserWindow.py	Sun Feb 19 19:57:28 2017 +0100
+++ b/WebBrowser/WebBrowserWindow.py	Mon Feb 20 19:27:37 2017 +0100
@@ -714,8 +714,8 @@
                 bookmarksManager.exportBookmarks)
         self.__actions.append(self.exportBookmarksAct)
         
-        if not Globals.isWindowsPlatform() or \
-                qVersion() >= "5.7.0":
+        if qVersion() >= "5.8.0" or (
+                not Globals.isWindowsPlatform() or qVersion() >= "5.7.0"):
             self.printAct = E5Action(
                 self.tr('Print'),
                 UI.PixmapCache.getIcon("print.png"),
@@ -752,7 +752,8 @@
         else:
             self.printPdfAct = None
         
-        if not Globals.isWindowsPlatform() and qVersion() < "5.7.0":
+        if qVersion() >= "5.8.0" or (
+                not Globals.isWindowsPlatform() and qVersion() < "5.7.0"):
             self.printPreviewAct = E5Action(
                 self.tr('Print Preview'),
                 UI.PixmapCache.getIcon("printPreview.png"),

eric ide

mercurial