Thu, 12 Oct 2023 17:05:08 +0200
Corrected the web browser printing code.
--- a/src/eric7/APIs/Python3/eric7.api Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/APIs/Python3/eric7.api Thu Oct 12 17:05:08 2023 +0200 @@ -12672,7 +12672,7 @@ eric7.WebBrowser.Tools.DelayedFileWatcher.DelayedFileWatcher?1(paths=None, parent=None) eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog.getData?4() eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog.on_pageLayoutButton_clicked?4() -eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog?1(filePath, parent=None) +eric7.WebBrowser.Tools.PrintToPdfDialog.PrintToPdfDialog?1(printer, parent=None) eric7.WebBrowser.Tools.Scripts.completeFormData?4(data) eric7.WebBrowser.Tools.Scripts.getAllImages?4() eric7.WebBrowser.Tools.Scripts.getAllMetaAttributes?4() @@ -12849,7 +12849,6 @@ eric7.WebBrowser.WebBrowserPage.WebBrowserPage.certificateError?4(error) eric7.WebBrowser.WebBrowserPage.WebBrowserPage.clearSslConfiguration?4() eric7.WebBrowser.WebBrowserPage.WebBrowserPage.execJavaScript?4(script, worldId=QWebEngineScript.ScriptWorldId.MainWorld, timeout=500) -eric7.WebBrowser.WebBrowserPage.WebBrowserPage.execPrintPage?4(printer, timeout=1000) eric7.WebBrowser.WebBrowserPage.WebBrowserPage.getSafeBrowsingStatus?4() eric7.WebBrowser.WebBrowserPage.WebBrowserPage.getSslCertificate?4() eric7.WebBrowser.WebBrowserPage.WebBrowserPage.getSslCertificateChain?4() @@ -12860,7 +12859,6 @@ eric7.WebBrowser.WebBrowserPage.WebBrowserPage.javaScriptConsoleMessage?4(level, message, lineNumber, sourceId) eric7.WebBrowser.WebBrowserPage.WebBrowserPage.mapToViewport?4(pos) eric7.WebBrowser.WebBrowserPage.WebBrowserPage.navigationRequestAccepted?7 -eric7.WebBrowser.WebBrowserPage.WebBrowserPage.printCallback?4(resDict=resultDict) eric7.WebBrowser.WebBrowserPage.WebBrowserPage.printPageRequested?7 eric7.WebBrowser.WebBrowserPage.WebBrowserPage.resultCallback?4(resDict=resultDict) eric7.WebBrowser.WebBrowserPage.WebBrowserPage.runJavaScript?4(script, worldId=-1, callback=None) @@ -12930,7 +12928,6 @@ eric7.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.titleChanged?7 eric7.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.urlBarForView?4(view) eric7.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget?1(parent) -eric7.WebBrowser.WebBrowserTabWidget.isCupsAvailable?4() eric7.WebBrowser.WebBrowserView.WebBrowserView.ZoomLevelDefault?7 eric7.WebBrowser.WebBrowserView.WebBrowserView.ZoomLevels?7 eric7.WebBrowser.WebBrowserView.WebBrowserView._gestureEvent?5(evt) @@ -12981,6 +12978,9 @@ eric7.WebBrowser.WebBrowserView.WebBrowserView.mapToViewport?4(pos) eric7.WebBrowser.WebBrowserView.WebBrowserView.paste?4() eric7.WebBrowser.WebBrowserView.WebBrowserView.preferencesChanged?4() +eric7.WebBrowser.WebBrowserView.WebBrowserView.printPage?4() +eric7.WebBrowser.WebBrowserView.WebBrowserView.printPageToPdf?4() +eric7.WebBrowser.WebBrowserView.WebBrowserView.printPreviewPage?4() eric7.WebBrowser.WebBrowserView.WebBrowserView.progress?4() eric7.WebBrowser.WebBrowserView.WebBrowserView.redo?4() eric7.WebBrowser.WebBrowserView.WebBrowserView.reload?4() @@ -13008,6 +13008,7 @@ eric7.WebBrowser.WebBrowserView.WebBrowserView.zoomValue?4() eric7.WebBrowser.WebBrowserView.WebBrowserView.zoomValueChanged?7 eric7.WebBrowser.WebBrowserView.WebBrowserView?1(mainWindow, parent=None, name="") +eric7.WebBrowser.WebBrowserView.isCupsAvailable?4() eric7.WebBrowser.WebBrowserWebSearchWidget.WebBrowserWebSearchWidget.clear?4() eric7.WebBrowser.WebBrowserWebSearchWidget.WebBrowserWebSearchWidget.mousePressEvent?4(evt) eric7.WebBrowser.WebBrowserWebSearchWidget.WebBrowserWebSearchWidget.openSearchManager?4()
--- a/src/eric7/Documentation/Help/source.qhp Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/Documentation/Help/source.qhp Thu Oct 12 17:05:08 2023 +0200 @@ -18594,7 +18594,6 @@ <keyword name="WebBrowserPage.certificateError" id="WebBrowserPage.certificateError" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.certificateError" /> <keyword name="WebBrowserPage.clearSslConfiguration" id="WebBrowserPage.clearSslConfiguration" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.clearSslConfiguration" /> <keyword name="WebBrowserPage.execJavaScript" id="WebBrowserPage.execJavaScript" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.execJavaScript" /> - <keyword name="WebBrowserPage.execPrintPage" id="WebBrowserPage.execPrintPage" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.execPrintPage" /> <keyword name="WebBrowserPage.getSafeBrowsingStatus" id="WebBrowserPage.getSafeBrowsingStatus" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.getSafeBrowsingStatus" /> <keyword name="WebBrowserPage.getSslCertificate" id="WebBrowserPage.getSslCertificate" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.getSslCertificate" /> <keyword name="WebBrowserPage.getSslCertificateChain" id="WebBrowserPage.getSslCertificateChain" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.getSslCertificateChain" /> @@ -18609,7 +18608,6 @@ <keyword name="WebBrowserPage.on_setCurrentPageButton_clicked" id="WebBrowserPage.on_setCurrentPageButton_clicked" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_setCurrentPageButton_clicked" /> <keyword name="WebBrowserPage.on_setSpeedDialPageButton_clicked" id="WebBrowserPage.on_setSpeedDialPageButton_clicked" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_setSpeedDialPageButton_clicked" /> <keyword name="WebBrowserPage.on_startupCombo_currentIndexChanged" id="WebBrowserPage.on_startupCombo_currentIndexChanged" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_startupCombo_currentIndexChanged" /> - <keyword name="WebBrowserPage.printCallback" id="WebBrowserPage.printCallback" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.printCallback" /> <keyword name="WebBrowserPage.resultCallback" id="WebBrowserPage.resultCallback" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.resultCallback" /> <keyword name="WebBrowserPage.runJavaScript" id="WebBrowserPage.runJavaScript" ref="eric7.WebBrowser.WebBrowserPage.html#WebBrowserPage.runJavaScript" /> <keyword name="WebBrowserPage.save" id="WebBrowserPage.save" ref="eric7.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.save" /> @@ -18671,8 +18669,6 @@ <keyword name="WebBrowserTabWidget.__navigationMenuTriggered" id="WebBrowserTabWidget.__navigationMenuTriggered" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__navigationMenuTriggered" /> <keyword name="WebBrowserTabWidget.__newBrowser" id="WebBrowserTabWidget.__newBrowser" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__newBrowser" /> <keyword name="WebBrowserTabWidget.__pathSelected" id="WebBrowserTabWidget.__pathSelected" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pathSelected" /> - <keyword name="WebBrowserTabWidget.__pdfGeneratedForSave" id="WebBrowserTabWidget.__pdfGeneratedForSave" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__pdfGeneratedForSave" /> - <keyword name="WebBrowserTabWidget.__printPreviewRequested" id="WebBrowserTabWidget.__printPreviewRequested" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__printPreviewRequested" /> <keyword name="WebBrowserTabWidget.__recentlyAudibleChanged" id="WebBrowserTabWidget.__recentlyAudibleChanged" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__recentlyAudibleChanged" /> <keyword name="WebBrowserTabWidget.__showContextMenu" id="WebBrowserTabWidget.__showContextMenu" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__showContextMenu" /> <keyword name="WebBrowserTabWidget.__showNavigationMenu" id="WebBrowserTabWidget.__showNavigationMenu" ref="eric7.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.__showNavigationMenu" /> @@ -18756,7 +18752,9 @@ <keyword name="WebBrowserView.__openLinkInNewTab" id="WebBrowserView.__openLinkInNewTab" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__openLinkInNewTab" /> <keyword name="WebBrowserView.__openLinkInNewWindow" id="WebBrowserView.__openLinkInNewWindow" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__openLinkInNewWindow" /> <keyword name="WebBrowserView.__pauseMedia" id="WebBrowserView.__pauseMedia" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__pauseMedia" /> - <keyword name="WebBrowserView.__printPage" id="WebBrowserView.__printPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPage" /> + <keyword name="WebBrowserView.__printPageFinished" id="WebBrowserView.__printPageFinished" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPageFinished" /> + <keyword name="WebBrowserView.__printPageToPdfFinished" id="WebBrowserView.__printPageToPdfFinished" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPageToPdfFinished" /> + <keyword name="WebBrowserView.__printPreviewRequested" id="WebBrowserView.__printPreviewRequested" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__printPreviewRequested" /> <keyword name="WebBrowserView.__quotaRequested" id="WebBrowserView.__quotaRequested" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__quotaRequested" /> <keyword name="WebBrowserView.__reloadAllSpeedDials" id="WebBrowserView.__reloadAllSpeedDials" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__reloadAllSpeedDials" /> <keyword name="WebBrowserView.__renderPreview" id="WebBrowserView.__renderPreview" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__renderPreview" /> @@ -18769,6 +18767,7 @@ <keyword name="WebBrowserView.__selectClientCertificate" id="WebBrowserView.__selectClientCertificate" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__selectClientCertificate" /> <keyword name="WebBrowserView.__sendLink" id="WebBrowserView.__sendLink" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__sendLink" /> <keyword name="WebBrowserView.__setRwhvqt" id="WebBrowserView.__setRwhvqt" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__setRwhvqt" /> + <keyword name="WebBrowserView.__setupPrinter" id="WebBrowserView.__setupPrinter" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__setupPrinter" /> <keyword name="WebBrowserView.__showContextMenu" id="WebBrowserView.__showContextMenu" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__showContextMenu" /> <keyword name="WebBrowserView.__showEventSlot" id="WebBrowserView.__showEventSlot" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__showEventSlot" /> <keyword name="WebBrowserView.__showTabCrashPage" id="WebBrowserView.__showTabCrashPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.__showTabCrashPage" /> @@ -18819,6 +18818,9 @@ <keyword name="WebBrowserView.mapToViewport" id="WebBrowserView.mapToViewport" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.mapToViewport" /> <keyword name="WebBrowserView.paste" id="WebBrowserView.paste" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.paste" /> <keyword name="WebBrowserView.preferencesChanged" id="WebBrowserView.preferencesChanged" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.preferencesChanged" /> + <keyword name="WebBrowserView.printPage" id="WebBrowserView.printPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.printPage" /> + <keyword name="WebBrowserView.printPageToPdf" id="WebBrowserView.printPageToPdf" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.printPageToPdf" /> + <keyword name="WebBrowserView.printPreviewPage" id="WebBrowserView.printPreviewPage" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.printPreviewPage" /> <keyword name="WebBrowserView.progress" id="WebBrowserView.progress" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.progress" /> <keyword name="WebBrowserView.redo" id="WebBrowserView.redo" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.redo" /> <keyword name="WebBrowserView.reload" id="WebBrowserView.reload" ref="eric7.WebBrowser.WebBrowserView.html#WebBrowserView.reload" /> @@ -20151,7 +20153,7 @@ <keyword name="isClientSecretFileAvailable" id="isClientSecretFileAvailable" ref="eric7.EricNetwork.EricGoogleMailHelpers.html#isClientSecretFileAvailable" /> <keyword name="isCondaAvailable" id="isCondaAvailable" ref="eric7.CondaInterface.__init__.html#isCondaAvailable" /> <keyword name="isConfigured" id="isConfigured" ref="eric7.Preferences.__init__.html#isConfigured" /> - <keyword name="isCupsAvailable" id="isCupsAvailable" ref="eric7.WebBrowser.WebBrowserTabWidget.html#isCupsAvailable" /> + <keyword name="isCupsAvailable" id="isCupsAvailable" ref="eric7.WebBrowser.WebBrowserView.html#isCupsAvailable" /> <keyword name="isDrive" id="isDrive" ref="eric7.SystemUtilities.FileSystemUtilities.html#isDrive" /> <keyword name="isEllipsis" id="isEllipsis" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isEllipsis" /> <keyword name="isExecutable" id="isExecutable" ref="eric7.DebugClients.Python.DebugUtilities.html#isExecutable" />
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.Tools.PrintToPdfDialog.html Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/Documentation/Source/eric7.WebBrowser.Tools.PrintToPdfDialog.html Thu Oct 12 17:05:08 2023 +0200 @@ -80,16 +80,16 @@ <a NAME="PrintToPdfDialog.__init__" ID="PrintToPdfDialog.__init__"></a> <h4>PrintToPdfDialog (Constructor)</h4> -<b>PrintToPdfDialog</b>(<i>filePath, parent=None</i>) +<b>PrintToPdfDialog</b>(<i>printer, parent=None</i>) <p> Constructor </p> <dl> -<dt><i>filePath</i> (str)</dt> +<dt><i>printer</i> (QPrinter)</dt> <dd> -path of the file to write into +reference to an initialized QPrinter object </dd> <dt><i>parent</i> (QWidget)</dt> <dd>
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserPage.html Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserPage.html Thu Oct 12 17:05:08 2023 +0200 @@ -144,10 +144,6 @@ <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.getSafeBrowsingStatus">getSafeBrowsingStatus</a></td> <td>Public method to get the safe browsing status of the current page.</td> </tr> @@ -184,10 +180,6 @@ <td>Public method to map a position to the viewport.</td> </tr> <tr> -<td><a href="#WebBrowserPage.printCallback">printCallback</a></td> -<td></td> -</tr> -<tr> <td><a href="#WebBrowserPage.resultCallback">resultCallback</a></td> <td></td> </tr> @@ -483,36 +475,6 @@ 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>Return:</dt> -<dd> -flag indicating a successful print job -</dd> -</dl> -<dl> -<dt>Return Type:</dt> -<dd> -bool -</dd> -</dl> <a NAME="WebBrowserPage.getSafeBrowsingStatus" ID="WebBrowserPage.getSafeBrowsingStatus"></a> <h4>WebBrowserPage.getSafeBrowsingStatus</h4> <b>getSafeBrowsingStatus</b>(<i></i>) @@ -705,10 +667,6 @@ QPoint </dd> </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/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserTabWidget.html Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserTabWidget.html Thu Oct 12 17:05:08 2023 +0200 @@ -28,11 +28,7 @@ <h3>Functions</h3> <table> - -<tr> -<td><a href="#isCupsAvailable">isCupsAvailable</a></td> -<td>Static method to test the availability of CUPS.</td> -</tr> +<tr><td>None</td></tr> </table> <hr /> <hr /> @@ -152,14 +148,6 @@ <td>Private slot called when a URL is selected from the completer.</td> </tr> <tr> -<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> @@ -523,42 +511,6 @@ path to be shown (string) </dd> </dl> -<a NAME="WebBrowserTabWidget.__pdfGeneratedForSave" ID="WebBrowserTabWidget.__pdfGeneratedForSave"></a> -<h4>WebBrowserTabWidget.__pdfGeneratedForSave</h4> -<b>__pdfGeneratedForSave</b>(<i>filePath, pdfData</i>) - -<p> - Private slot to save the generated PDF data to a file. -</p> -<dl> - -<dt><i>filePath</i> (str)</dt> -<dd> -path to save the PDF to -</dd> -<dt><i>pdfData</i> (QByteArray)</dt> -<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, page</i>) @@ -1114,26 +1066,4 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /> -<hr /> -<a NAME="isCupsAvailable" ID="isCupsAvailable"></a> -<h2>isCupsAvailable</h2> -<b>isCupsAvailable</b>(<i></i>) - -<p> - Static method to test the availability of CUPS. -</p> -<dl> -<dt>Return:</dt> -<dd> -flag indicating the availability of CUPS -</dd> -</dl> -<dl> -<dt>Return Type:</dt> -<dd> -bool -</dd> -</dl> -<div align="right"><a href="#top">Up</a></div> -<hr /> </body></html> \ No newline at end of file
--- a/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserView.html Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/Documentation/Source/eric7.WebBrowser.WebBrowserView.html Thu Oct 12 17:05:08 2023 +0200 @@ -28,7 +28,11 @@ <h3>Functions</h3> <table> -<tr><td>None</td></tr> + +<tr> +<td><a href="#isCupsAvailable">isCupsAvailable</a></td> +<td>Static method to test the availability of CUPS.</td> +</tr> </table> <hr /> <hr /> @@ -258,8 +262,16 @@ <td>Private slot to pause or play the selected media.</td> </tr> <tr> -<td><a href="#WebBrowserView.__printPage">__printPage</a></td> -<td>Private slot to support printing from the web page.</td> +<td><a href="#WebBrowserView.__printPageFinished">__printPageFinished</a></td> +<td>Private slot to handle the finishing of a print job.</td> +</tr> +<tr> +<td><a href="#WebBrowserView.__printPageToPdfFinished">__printPageToPdfFinished</a></td> +<td>Private slot to handle the finishing of a PDF print job.</td> +</tr> +<tr> +<td><a href="#WebBrowserView.__printPreviewRequested">__printPreviewRequested</a></td> +<td>Private slot to generate the print preview.</td> </tr> <tr> <td><a href="#WebBrowserView.__quotaRequested">__quotaRequested</a></td> @@ -310,6 +322,10 @@ <td>Private slot to set widget that receives input events.</td> </tr> <tr> +<td><a href="#WebBrowserView.__setupPrinter">__setupPrinter</a></td> +<td>Private method to create and initialize a QPrinter object.</td> +</tr> +<tr> <td><a href="#WebBrowserView.__showContextMenu">__showContextMenu</a></td> <td>Private slot to show a context menu.</td> </tr> @@ -510,6 +526,18 @@ <td>Public method to indicate a change of the settings.</td> </tr> <tr> +<td><a href="#WebBrowserView.printPage">printPage</a></td> +<td>Public slot to print the current page.</td> +</tr> +<tr> +<td><a href="#WebBrowserView.printPageToPdf">printPageToPdf</a></td> +<td>Public slot to save the current page as a PDF file.</td> +</tr> +<tr> +<td><a href="#WebBrowserView.printPreviewPage">printPreviewPage</a></td> +<td>Public slot to create a print preview of the current page.</td> +</tr> +<tr> <td><a href="#WebBrowserView.progress">progress</a></td> <td>Public method to get the load progress.</td> </tr> @@ -1103,13 +1131,52 @@ <p> Private slot to pause or play the selected media. </p> -<a NAME="WebBrowserView.__printPage" ID="WebBrowserView.__printPage"></a> -<h4>WebBrowserView.__printPage</h4> -<b>__printPage</b>(<i></i>) +<a NAME="WebBrowserView.__printPageFinished" ID="WebBrowserView.__printPageFinished"></a> +<h4>WebBrowserView.__printPageFinished</h4> +<b>__printPageFinished</b>(<i>success</i>) + +<p> + Private slot to handle the finishing of a print job. +</p> +<dl> + +<dt><i>success</i> (bool)</dt> +<dd> +flag indicating success (not used) +</dd> +</dl> +<a NAME="WebBrowserView.__printPageToPdfFinished" ID="WebBrowserView.__printPageToPdfFinished"></a> +<h4>WebBrowserView.__printPageToPdfFinished</h4> +<b>__printPageToPdfFinished</b>(<i>filepath, success</i>) <p> - Private slot to support printing from the web page. + Private slot to handle the finishing of a PDF print job. </p> +<dl> + +<dt><i>filepath</i> (str)</dt> +<dd> +path of the output PDF file +</dd> +<dt><i>success</i> (bool)</dt> +<dd> +flag indicating success +</dd> +</dl> +<a NAME="WebBrowserView.__printPreviewRequested" ID="WebBrowserView.__printPreviewRequested"></a> +<h4>WebBrowserView.__printPreviewRequested</h4> +<b>__printPreviewRequested</b>(<i>printer</i>) + +<p> + Private slot to generate the print preview. +</p> +<dl> + +<dt><i>printer</i> (QPrinter)</dt> +<dd> +reference to the printer object +</dd> +</dl> <a NAME="WebBrowserView.__quotaRequested" ID="WebBrowserView.__quotaRequested"></a> <h4>WebBrowserView.__quotaRequested</h4> <b>__quotaRequested</b>(<i>quotaRequest</i>) @@ -1234,6 +1301,32 @@ <p> Private slot to set widget that receives input events. </p> +<a NAME="WebBrowserView.__setupPrinter" ID="WebBrowserView.__setupPrinter"></a> +<h4>WebBrowserView.__setupPrinter</h4> +<b>__setupPrinter</b>(<i>filePath=None</i>) + +<p> + Private method to create and initialize a QPrinter object. +</p> +<dl> + +<dt><i>filePath</i> (str (optional))</dt> +<dd> +name of the output file for the printer (defaults to None) +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +initialized QPrinter object +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +QPrinter +</dd> +</dl> <a NAME="WebBrowserView.__showContextMenu" ID="WebBrowserView.__showContextMenu"></a> <h4>WebBrowserView.__showContextMenu</h4> <b>__showContextMenu</b>(<i>pos</i>) @@ -1939,6 +2032,27 @@ <p> Public method to indicate a change of the settings. </p> +<a NAME="WebBrowserView.printPage" ID="WebBrowserView.printPage"></a> +<h4>WebBrowserView.printPage</h4> +<b>printPage</b>(<i></i>) + +<p> + Public slot to print the current page. +</p> +<a NAME="WebBrowserView.printPageToPdf" ID="WebBrowserView.printPageToPdf"></a> +<h4>WebBrowserView.printPageToPdf</h4> +<b>printPageToPdf</b>(<i></i>) + +<p> + Public slot to save the current page as a PDF file. +</p> +<a NAME="WebBrowserView.printPreviewPage" ID="WebBrowserView.printPreviewPage"></a> +<h4>WebBrowserView.printPreviewPage</h4> +<b>printPreviewPage</b>(<i></i>) + +<p> + Public slot to create a print preview of the current page. +</p> <a NAME="WebBrowserView.progress" ID="WebBrowserView.progress"></a> <h4>WebBrowserView.progress</h4> <b>progress</b>(<i></i>) @@ -2168,4 +2282,26 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /> +<hr /> +<a NAME="isCupsAvailable" ID="isCupsAvailable"></a> +<h2>isCupsAvailable</h2> +<b>isCupsAvailable</b>(<i></i>) + +<p> + Static method to test the availability of CUPS. +</p> +<dl> +<dt>Return:</dt> +<dd> +flag indicating the availability of CUPS +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> </body></html> \ No newline at end of file
--- a/src/eric7/WebBrowser/Tools/PrintToPdfDialog.py Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/WebBrowser/Tools/PrintToPdfDialog.py Thu Oct 12 17:05:08 2023 +0200 @@ -7,11 +7,9 @@ Module implementing a dialog to enter the data for printing a web page to PDF. """ -import os - -from PyQt6.QtCore import QMarginsF, QStandardPaths, pyqtSlot -from PyQt6.QtGui import QPageLayout, QPageSize -from PyQt6.QtPrintSupport import QPageSetupDialog, QPrinter +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtGui import QPageLayout +from PyQt6.QtPrintSupport import QPageSetupDialog from PyQt6.QtWidgets import QDialog from eric7.EricWidgets.EricPathPicker import EricPathPickerModes @@ -25,35 +23,23 @@ PDF. """ - def __init__(self, filePath, parent=None): + def __init__(self, printer, parent=None): """ Constructor - @param filePath path of the file to write into - @type str + @param printer reference to an initialized QPrinter object + @type QPrinter @param parent reference to the parent widget @type QWidget """ super().__init__(parent) self.setupUi(self) + self.__printer = printer + self.pdfFilePicker.setMode(EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE) self.pdfFilePicker.setFilters(self.tr("PDF Files (*.pdf);;All Files (*)")) - if not os.path.isabs(filePath): - documentsPath = QStandardPaths.writableLocation( - QStandardPaths.StandardLocation.DocumentsLocation - ) - if documentsPath: - filePath = os.path.join(documentsPath, filePath) - else: - filePath = os.path.abspath(filePath) - self.pdfFilePicker.setText(filePath, toNative=True) - - self.__currentPageLayout = QPageLayout( - QPageSize(QPageSize.PageSizeId.A4), - QPageLayout.Orientation.Portrait, - QMarginsF(0.0, 0.0, 0.0, 0.0), - ) + self.pdfFilePicker.setText(self.__printer.outputFileName(), toNative=True) self.__updatePageLayoutLabel() @@ -62,12 +48,8 @@ """ Private slot to define the page layout. """ - printer = QPrinter() - printer.setPageLayout(self.__currentPageLayout) - - dlg = QPageSetupDialog(printer, self) + dlg = QPageSetupDialog(self.__printer, self) if dlg.exec() == QDialog.DialogCode.Accepted: - self.__currentPageLayout = printer.pageLayout() self.__updatePageLayoutLabel() def __updatePageLayoutLabel(self): @@ -77,14 +59,14 @@ orientation = ( self.tr("Portrait") if ( - self.__currentPageLayout.orientation() + self.__printer.pageLayout().orientation() == QPageLayout.Orientation.Portrait ) else self.tr("Landscape") ) self.pageLayoutLabel.setText( self.tr("{0}, {1}", "page size, page orientation").format( - self.__currentPageLayout.pageSize().name(), orientation + self.__printer.pageLayout().pageSize().name(), orientation ) ) @@ -97,5 +79,5 @@ """ return ( self.pdfFilePicker.text(toNative=True), - self.__currentPageLayout, + self.__printer.pageLayout(), )
--- a/src/eric7/WebBrowser/WebBrowserPage.py Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/WebBrowser/WebBrowserPage.py Thu Oct 12 17:05:08 2023 +0200 @@ -463,32 +463,6 @@ else: request.reject() - def execPrintPage(self, printer, timeout=1000): - """ - Public method to execute a synchronous print. - - @param printer reference to the printer object - @type QPrinter - @param timeout timeout value in milliseconds - @type int - @return flag indicating a successful print job - @rtype bool - """ - # FIXME: replace this logic with QWebEngineView.print(printer) - loop = QEventLoop() - resultDict = {"res": None} - QTimer.singleShot(timeout, loop.quit) - - def printCallback(res, resDict=resultDict): - if loop and loop.isRunning(): - resDict["res"] = res - loop.quit() - - self.print(printer, printCallback) - - loop.exec() - return resultDict["res"] - def __contentsSizeChanged(self, size): # noqa: U100 """ Private slot to work around QWebEnginePage not scrolling to anchors
--- a/src/eric7/WebBrowser/WebBrowserTabWidget.py Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/WebBrowser/WebBrowserTabWidget.py Thu Oct 12 17:05:08 2023 +0200 @@ -7,53 +7,26 @@ Module implementing the central widget showing the web pages. """ -import os - -from PyQt6.QtCore import QMarginsF, Qt, QUrl, pyqtSignal, pyqtSlot -from PyQt6.QtGui import QIcon, QPageLayout, QPainter, QPixmap -from PyQt6.QtPrintSupport import ( - QAbstractPrintDialog, - QPrintDialog, - QPrinter, - QPrintPreviewDialog, -) -from PyQt6.QtWidgets import QDialog, QHBoxLayout, QMenu, QToolButton, QWidget +from PyQt6.QtCore import Qt, QUrl, pyqtSignal, pyqtSlot +from PyQt6.QtGui import QIcon, QPainter, QPixmap +from PyQt6.QtWidgets import QHBoxLayout, QMenu, QToolButton, QWidget from eric7 import Preferences from eric7.EricGui import EricPixmapCache -from eric7.EricGui.EricOverrideCursor import EricOverrideCursor from eric7.EricWidgets import EricMessageBox from eric7.EricWidgets.EricApplication import ericApp from eric7.EricWidgets.EricTabWidget import EricTabWidget -from eric7.SystemUtilities import FileSystemUtilities, OSUtilities +from eric7.SystemUtilities import FileSystemUtilities from eric7.WebBrowser.WebBrowserWindow import WebBrowserWindow from . import WebInspector from .ClosedTabsManager import ClosedTabsManager -from .Tools import WebBrowserTools from .UrlBar.StackedUrlBar import StackedUrlBar from .WebBrowserPage import WebBrowserPage from .WebBrowserTabBar import WebBrowserTabBar from .WebBrowserView import WebBrowserView -def isCupsAvailable(): - """ - Static method to test the availability of CUPS. - - @return flag indicating the availability of CUPS - @rtype bool - """ - if OSUtilities.isMacPlatform(): - # OS X/MacOS always have CUPS - return True - elif OSUtilities.isLinuxPlatform(): - testPrinter = QPrinter() - return testPrinter.supportsMultipleCopies() - else: - return False - - class WebBrowserTabWidget(EricTabWidget): """ Class implementing the central widget showing the web pages. @@ -650,44 +623,8 @@ if browser is None: browser = self.currentBrowser() - printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution) - if Preferences.getPrinter("ColorMode"): - printer.setColorMode(QPrinter.ColorMode.Color) - else: - printer.setColorMode(QPrinter.ColorMode.GrayScale) - if Preferences.getPrinter("FirstPageFirst"): - printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst) - else: - printer.setPageOrder(QPrinter.PageOrder.LastPageFirst) - printer.setPageMargins( - QMarginsF( - Preferences.getPrinter("LeftMargin") * 10, - Preferences.getPrinter("TopMargin") * 10, - Preferences.getPrinter("RightMargin") * 10, - Preferences.getPrinter("BottomMargin") * 10, - ), - QPageLayout.Unit.Millimeter, - ) - printerName = Preferences.getPrinter("PrinterName") - if printerName: - printer.setPrinterName(printerName) - printer.setResolution(Preferences.getPrinter("Resolution")) - documentName = WebBrowserTools.getFileNameFromUrl(browser.url()) - printer.setDocName(documentName) - - printDialog = QPrintDialog(printer, self) - printDialog.setOptions( - QAbstractPrintDialog.PrintDialogOption.PrintToFile - | QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize - ) - if not OSUtilities.isWindowsPlatform(): - if isCupsAvailable(): - printDialog.setOption( - QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies - ) - printDialog.setOption(QAbstractPrintDialog.PrintDialogOption.PrintPageRange) - if printDialog.exec() == QDialog.DialogCode.Accepted: - browser.page().execPrintPage(printer, 10 * 1000) + if browser is not None: + browser.printPage() @pyqtSlot() def printBrowserPdf(self, browser=None): @@ -696,83 +633,11 @@ @param browser reference to the browser to be printed (HelpBrowser) """ - from .Tools.PrintToPdfDialog import PrintToPdfDialog - if browser is None: browser = self.currentBrowser() - name = WebBrowserTools.getFileNameFromUrl(browser.url()) - if name: - name = name.rsplit(".", 1)[0] - name += ".pdf" - if hasattr(browser.page(), "printToPdf"): - if not name: - name = "printout.pdf" - dlg = PrintToPdfDialog(name, self) - if dlg.exec() == QDialog.DialogCode.Accepted: - filePath, pageLayout = dlg.getData() - if filePath: - if os.path.exists(filePath): - res = EricMessageBox.warning( - self, - self.tr("Print to PDF"), - self.tr( - """<p>The file <b>{0}</b> exists""" - """ already. Shall it be""" - """ overwritten?</p>""" - ).format(filePath), - EricMessageBox.No | EricMessageBox.Yes, - EricMessageBox.No, - ) - if res == EricMessageBox.No: - return - browser.page().printToPdf( - lambda pdf: self.__pdfGeneratedForSave(filePath, pdf), - pageLayout, - ) - elif OSUtilities.isLinuxPlatform(): - printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution) - if Preferences.getPrinter("ColorMode"): - printer.setColorMode(QPrinter.ColorMode.Color) - else: - printer.setColorMode(QPrinter.ColorMode.GrayScale) - printerName = Preferences.getPrinter("PrinterName") - if printerName: - printer.setPrinterName(printerName) - printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat) - if name: - printer.setOutputFileName(name) - printer.setResolution(Preferences.getPrinter("Resolution")) - - printDialog = QPrintDialog(printer, self) - if printDialog.exec() == QDialog.DialogCode.Accepted: - browser.render(printer) - - def __pdfGeneratedForSave(self, filePath, pdfData): - """ - Private slot to save the generated PDF data to a file. - - @param filePath path to save the PDF to - @type str - @param pdfData generated PDF document - @type QByteArray - """ - if pdfData.size() == 0: - return - - try: - with open(filePath, "wb") as f: - f.write(pdfData) - except OSError as err: - EricMessageBox.critical( - self, - self.tr("Print to PDF"), - self.tr( - """<p>The PDF could not be written to file <b>{0}""" - """</b>.</p><p><b>Error:</b> {1}</p>""" - ).format(filePath, str(err)), - EricMessageBox.Ok, - ) + if browser is not None: + browser.printPageToPdf() @pyqtSlot() def printPreviewBrowser(self, browser=None): @@ -784,47 +649,8 @@ if browser is None: browser = self.currentBrowser() - printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution) - if Preferences.getPrinter("ColorMode"): - printer.setColorMode(QPrinter.ColorMode.Color) - else: - printer.setColorMode(QPrinter.ColorMode.GrayScale) - if Preferences.getPrinter("FirstPageFirst"): - printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst) - else: - printer.setPageOrder(QPrinter.PageOrder.LastPageFirst) - printer.setPageMargins( - QMarginsF( - Preferences.getPrinter("LeftMargin") * 10, - Preferences.getPrinter("TopMargin") * 10, - Preferences.getPrinter("RightMargin") * 10, - Preferences.getPrinter("BottomMargin") * 10, - ), - QPageLayout.Unit.Millimeter, - ) - printerName = Preferences.getPrinter("PrinterName") - if printerName: - printer.setPrinterName(printerName) - printer.setResolution(Preferences.getPrinter("Resolution")) - - preview = QPrintPreviewDialog(printer, self) - preview.resize(800, 750) - preview.paintRequested.connect( - lambda p: self.__printPreviewRequested(p, browser) - ) - 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 - """ - with EricOverrideCursor(): - browser.page().execPrintPage(printer, 10 * 1000) + if browser is not None: + browser.printPreviewPage() def __sourceChanged(self, url, browser): """
--- a/src/eric7/WebBrowser/WebBrowserView.py Thu Oct 12 17:03:41 2023 +0200 +++ b/src/eric7/WebBrowser/WebBrowserView.py Thu Oct 12 17:05:08 2023 +0200 @@ -18,7 +18,9 @@ QDataStream, QDateTime, QEvent, + QEventLoop, QIODevice, + QMarginsF, QPoint, QPointF, QStandardPaths, @@ -28,7 +30,20 @@ pyqtSignal, pyqtSlot, ) -from PyQt6.QtGui import QClipboard, QCursor, QDesktopServices, QIcon, QPixmap +from PyQt6.QtGui import ( + QClipboard, + QCursor, + QDesktopServices, + QIcon, + QPageLayout, + QPixmap, +) +from PyQt6.QtPrintSupport import ( + QAbstractPrintDialog, + QPrintDialog, + QPrinter, + QPrintPreviewDialog, +) from PyQt6.QtWebEngineCore import QWebEngineDownloadRequest, QWebEnginePage from PyQt6.QtWebEngineWidgets import QWebEngineView from PyQt6.QtWidgets import QApplication, QDialog, QMenu, QStyle @@ -38,16 +53,34 @@ from eric7.EricWidgets import EricFileDialog, EricMessageBox from eric7.EricWidgets.EricApplication import ericApp from eric7.SystemUtilities import FileSystemUtilities, OSUtilities +from eric7.UI.Info import Homepage, VersionOnly from eric7.WebBrowser.WebBrowserWindow import WebBrowserWindow from eric7.WebBrowser.ZoomManager import ZoomManager from . import WebInspector -from .Tools import Scripts +from .Tools import Scripts, WebBrowserTools from .Tools.WebBrowserTools import getHtmlPage, pixmapToDataUrl from .Tools.WebIconLoader import WebIconLoader from .WebBrowserPage import WebBrowserPage +def isCupsAvailable(): + """ + Static method to test the availability of CUPS. + + @return flag indicating the availability of CUPS + @rtype bool + """ + if OSUtilities.isMacPlatform(): + # OS X/MacOS always have CUPS + return True + elif OSUtilities.isLinuxPlatform(): + testPrinter = QPrinter() + return testPrinter.supportsMultipleCopies() + else: + return False + + class WebBrowserView(QWebEngineView): """ Class implementing the web browser view widget. @@ -130,6 +163,8 @@ self.__clickedPos = QPoint() self.__firstLoad = False self.__preview = QPixmap() + self.__currentPrinter = None + self.__printPreviewLoop = None self.__currentZoom = 100 self.__zoomLevels = WebBrowserView.ZoomLevels[:] @@ -146,6 +181,10 @@ self.loadFinished.connect(self.__loadFinished) self.renderProcessTerminated.connect(self.__renderProcessTerminated) + self.printRequested.connect(self.printPage) + self.printFinished.connect(self.__printPageFinished) + self.pdfPrintingFinished.connect(self.__printPageToPdfFinished) + self.__mw.openSearchManager().currentEngineChanged.connect( self.__currentEngineChanged ) @@ -177,7 +216,6 @@ self.__page.safeBrowsingAbort.connect(self.safeBrowsingAbort) self.__page.safeBrowsingBad.connect(self.safeBrowsingBad) - self.__page.printPageRequested.connect(self.__printPage) with contextlib.suppress(AttributeError): # deprecated with Qt 6.5+ self.__page.quotaRequested.connect(self.__quotaRequested) @@ -2299,15 +2337,185 @@ return True ########################################################################### - ## Methods below implement print support from the page + ## Methods below implement print support ########################################################################### + def __setupPrinter(self, filePath=None): + """ + Private method to create and initialize a QPrinter object. + + @param filePath name of the output file for the printer (defaults to None) + @type str (optional) + @return initialized QPrinter object + @rtype QPrinter + """ + printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution) + if Preferences.getPrinter("ColorMode"): + printer.setColorMode(QPrinter.ColorMode.Color) + else: + printer.setColorMode(QPrinter.ColorMode.GrayScale) + if Preferences.getPrinter("FirstPageFirst"): + printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst) + else: + printer.setPageOrder(QPrinter.PageOrder.LastPageFirst) + printer.setPageMargins( + QMarginsF( + Preferences.getPrinter("LeftMargin") * 10, + Preferences.getPrinter("TopMargin") * 10, + Preferences.getPrinter("RightMargin") * 10, + Preferences.getPrinter("BottomMargin") * 10, + ), + QPageLayout.Unit.Millimeter, + ) + printerName = Preferences.getPrinter("PrinterName") + if printerName: + printer.setPrinterName(printerName) + printer.setResolution(Preferences.getPrinter("Resolution")) + documentName = WebBrowserTools.getFileNameFromUrl(self.url()) + printer.setDocName(documentName) + documentsPath = QStandardPaths.writableLocation( + QStandardPaths.StandardLocation.DocumentsLocation + ) + if filePath is None: + filePath = "{0}.pdf".format(documentName) + filePath = ( + os.path.join(documentsPath, filePath) + if documentsPath + else os.path.abspath(filePath) + ) + printer.setOutputFileName(filePath) + printer.setCreator(self.tr("eric7 {0} ({1})").format(VersionOnly, Homepage)) + return printer + + @pyqtSlot() + def printPage(self): + """ + Public slot to print the current page. + """ + if self.__currentPrinter is not None: + EricMessageBox.warning( + self, + self.tr("Print Page"), + self.tr( + "There is already a print job in progress. Printing is temporarily" + " disabled until the current job is finished." + ), + ) + return + + printer = self.__setupPrinter() + + printDialog = QPrintDialog(printer, self) + printDialog.setOptions( + QAbstractPrintDialog.PrintDialogOption.PrintToFile + | QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize + ) + if not OSUtilities.isWindowsPlatform(): + if isCupsAvailable(): + printDialog.setOption( + QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies + ) + printDialog.setOption(QAbstractPrintDialog.PrintDialogOption.PrintPageRange) + if printDialog.exec() == QDialog.DialogCode.Accepted: + if printer.outputFormat() == QPrinter.OutputFormat.PdfFormat: + self.printToPdf( + printer.outputFileName(), printer.pageLayout(), printer.pageRanges() + ) + else: + self.__currentPrinter = printer + self.print(printer) + @pyqtSlot() - def __printPage(self): + def printPageToPdf(self): + """ + Public slot to save the current page as a PDF file. + """ + from .Tools.PrintToPdfDialog import PrintToPdfDialog + + name = WebBrowserTools.getFileNameFromUrl(self.url()) + name = name.rsplit(".", 1)[0] + ".pdf" if name else "printout.pdf" + dlg = PrintToPdfDialog(self.__setupPrinter(filePath=name), self) + if dlg.exec() == QDialog.DialogCode.Accepted: + filePath, pageLayout = dlg.getData() + if filePath: + if os.path.exists(filePath): + res = EricMessageBox.warning( + self, + self.tr("Print to PDF"), + self.tr( + """<p>The file <b>{0}</b> exists""" + """ already. Shall it be""" + """ overwritten?</p>""" + ).format(filePath), + EricMessageBox.No | EricMessageBox.Yes, + EricMessageBox.No, + ) + if res == EricMessageBox.No: + return + self.printToPdf(filePath, pageLayout) + + @pyqtSlot() + def printPreviewPage(self): + """ + Public slot to create a print preview of the current page. + """ + printer = self.__setupPrinter() + preview = QPrintPreviewDialog(printer, self) + preview.resize(800, 750) + preview.paintRequested.connect(self.__printPreviewRequested) + preview.exec() + + @pyqtSlot(QPrinter) + def __printPreviewRequested(self, printer): """ - Private slot to support printing from the web page. + Private slot to generate the print preview. + + @param printer reference to the printer object + @type QPrinter + """ + # This needs to run its own event loop to prevent a premature return from + # the method. + self.__printPreviewLoop = QEventLoop() + + self.print(printer) + + self.__printPreviewLoop.exec() + self.__printPreviewLoop = None + + @pyqtSlot(bool) + def __printPageFinished(self, success): + """ + Private slot to handle the finishing of a print job. + + @param success flag indicating success (not used) + @type bool """ - self.__mw.tabWidget.printBrowser(browser=self) + if self.__printPreviewLoop is not None: + # The print preview was created, now stop the print preview loop. + self.__printPreviewLoop.quit() + return + + # we printed to a real printer + self.__currentPrinter = None + + @pyqtSlot(str, bool) + def __printPageToPdfFinished(self, filepath, success): + """ + Private slot to handle the finishing of a PDF print job. + + @param filepath path of the output PDF file + @type str + @param success flag indicating success + @type bool + """ + if not success: + EricMessageBox.critical( + self, + self.tr("Print to PDF"), + self.tr( + """<p>The PDF file <b>{0}</b> could not be generated.</p>""" + ).format(filepath), + ) ########################################################################### ## Methods below implement slots for Qt 6.0 to 6.4