Mon, 20 Feb 2017 19:27:37 +0100
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.
--- 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)
--- 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"),