eric6/WebBrowser/WebBrowserTabWidget.py

branch
without_py2_and_pyqt4
changeset 7201
6b42677d7043
parent 6999
f23e546a7eb9
child 7229
53054eb5b15a
equal deleted inserted replaced
7200:ebab8ba287e6 7201:6b42677d7043
9 9
10 from __future__ import unicode_literals 10 from __future__ import unicode_literals
11 11
12 import os 12 import os
13 13
14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl, QDir, QFile, \ 14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl, QFile, QFileDevice
15 QFileDevice, QTemporaryFile
16 from PyQt5.QtGui import QIcon, QPixmap, QPainter 15 from PyQt5.QtGui import QIcon, QPixmap, QPainter
17 from PyQt5.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, \ 16 from PyQt5.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, \
18 QDialog, QApplication 17 QDialog, QApplication
19 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog 18 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog
20 19
23 from E5Gui.E5Application import e5App 22 from E5Gui.E5Application import e5App
24 23
25 from .WebBrowserView import WebBrowserView 24 from .WebBrowserView import WebBrowserView
26 from .WebBrowserPage import WebBrowserPage 25 from .WebBrowserPage import WebBrowserPage
27 from .Tools import WebBrowserTools 26 from .Tools import WebBrowserTools
28 from .Tools import FilePrinter
29 from . import WebInspector 27 from . import WebInspector
30 28
31 import UI.PixmapCache 29 import UI.PixmapCache
32 30
33 import Utilities 31 import Utilities
34 import Preferences 32 import Preferences
35 import Globals 33 import Globals
36 from Globals import qVersionTuple
37 34
38 from eric6config import getConfig 35 from eric6config import getConfig
36
37
38 def isCupsAvailable():
39 """
40 Static method to test the availability of CUPS.
41
42 @return flag indicating the availability of CUPS
43 @rtype bool
44 """
45 if Globals.isMacPlatform():
46 # OS X/MacOS always have CUPS
47 return True
48 elif Globals.isLinuxPlatform():
49 testPrinter = QPrinter()
50 return testPrinter.supportsMultipleCopies()
51 else:
52 return False
39 53
40 54
41 class WebBrowserTabWidget(E5TabWidget): 55 class WebBrowserTabWidget(E5TabWidget):
42 """ 56 """
43 Class implementing the central widget showing the web pages. 57 Class implementing the central widget showing the web pages.
140 self.__newTabButton.clicked.connect(self.__newBrowser) 154 self.__newTabButton.clicked.connect(self.__newBrowser)
141 155
142 self.__initTabContextMenu() 156 self.__initTabContextMenu()
143 157
144 self.__historyCompleter = None 158 self.__historyCompleter = None
145
146 self.__pdfPrinter = None
147 159
148 def __initTabContextMenu(self): 160 def __initTabContextMenu(self):
149 """ 161 """
150 Private method to create the tab context menu. 162 Private method to create the tab context menu.
151 """ 163 """
171 UI.PixmapCache.getIcon("tabCloseOther.png"), 183 UI.PixmapCache.getIcon("tabCloseOther.png"),
172 self.tr("Close Others"), self.__tabContextMenuCloseOthers) 184 self.tr("Close Others"), self.__tabContextMenuCloseOthers)
173 self.__tabContextMenu.addAction( 185 self.__tabContextMenu.addAction(
174 self.tr('Close All'), self.closeAllBrowsers) 186 self.tr('Close All'), self.closeAllBrowsers)
175 self.__tabContextMenu.addSeparator() 187 self.__tabContextMenu.addSeparator()
176 if qVersionTuple() >= (5, 8, 0) or ( 188 self.__tabContextMenu.addAction(
177 not Globals.isWindowsPlatform() and qVersionTuple() < (5, 7, 0)): 189 UI.PixmapCache.getIcon("printPreview.png"),
178 self.__tabContextMenu.addAction( 190 self.tr('Print Preview'), self.__tabContextMenuPrintPreview)
179 UI.PixmapCache.getIcon("printPreview.png"), 191 self.__tabContextMenu.addAction(
180 self.tr('Print Preview'), self.__tabContextMenuPrintPreview) 192 UI.PixmapCache.getIcon("print.png"),
181 if qVersionTuple() >= (5, 8, 0) or ( 193 self.tr('Print'), self.__tabContextMenuPrint)
182 not Globals.isWindowsPlatform() or qVersionTuple() >= (5, 7, 0)): 194 self.__tabContextMenu.addAction(
183 self.__tabContextMenu.addAction( 195 UI.PixmapCache.getIcon("printPdf.png"),
184 UI.PixmapCache.getIcon("print.png"), 196 self.tr('Print as PDF'), self.__tabContextMenuPrintPdf)
185 self.tr('Print'), self.__tabContextMenuPrint)
186 if Globals.isLinuxPlatform() or qVersionTuple() >= (5, 7, 0):
187 self.__tabContextMenu.addAction(
188 UI.PixmapCache.getIcon("printPdf.png"),
189 self.tr('Print as PDF'), self.__tabContextMenuPrintPdf)
190 self.__tabContextMenu.addSeparator() 197 self.__tabContextMenu.addSeparator()
191 if hasattr(WebBrowserPage, "isAudioMuted"): 198 if hasattr(WebBrowserPage, "isAudioMuted"):
192 self.__audioAct = self.__tabContextMenu.addAction( 199 self.__audioAct = self.__tabContextMenu.addAction(
193 "", self.__tabContextMenuAudioMute) 200 "", self.__tabContextMenuAudioMute)
194 self.__tabContextMenu.addSeparator() 201 self.__tabContextMenu.addSeparator()
658 665
659 printDialog = QPrintDialog(printer, self) 666 printDialog = QPrintDialog(printer, self)
660 printDialog.setOptions(QAbstractPrintDialog.PrintToFile | 667 printDialog.setOptions(QAbstractPrintDialog.PrintToFile |
661 QAbstractPrintDialog.PrintShowPageSize) 668 QAbstractPrintDialog.PrintShowPageSize)
662 if not Globals.isWindowsPlatform(): 669 if not Globals.isWindowsPlatform():
663 if FilePrinter.isCupsAvailable(): 670 if isCupsAvailable():
664 printDialog.setOption(QAbstractPrintDialog.PrintCollateCopies) 671 printDialog.setOption(QAbstractPrintDialog.PrintCollateCopies)
665 printDialog.setOption(QAbstractPrintDialog.PrintPageRange) 672 printDialog.setOption(QAbstractPrintDialog.PrintPageRange)
666 if printDialog.exec_() == QDialog.Accepted: 673 if printDialog.exec_() == QDialog.Accepted:
667 if hasattr(browser.page(), "print"): 674 browser.page().execPrintPage(printer, 10 * 1000)
668 # Qt >= 5.8.0
669 browser.page().execPrintPage(printer, 10 * 1000)
670 elif hasattr(browser.page(), "printToPdf"):
671 # Qt >= 5.7.0
672 if printer.outputFormat() == QPrinter.PdfFormat:
673 # print to PDF file selected
674 browser.page().printToPdf(
675 lambda pdf: self.__pdfGeneratedForSave(
676 printer.outputFileName(), pdf),
677 printer.pageLayout())
678 else:
679 # print to printer
680 self.__pdfPrinter = printer
681 browser.page().printToPdf(
682 self.__pdfGeneratedForPrinting,
683 printer.pageLayout())
684 else:
685 browser.render(printer)
686 675
687 @pyqtSlot() 676 @pyqtSlot()
688 def printBrowserPdf(self, browser=None): 677 def printBrowserPdf(self, browser=None):
689 """ 678 """
690 Public slot called to print the displayed page to PDF. 679 Public slot called to print the displayed page to PDF.
764 """</b>.</p><p><b>Error:</b> {1}</p>""").format( 753 """</b>.</p><p><b>Error:</b> {1}</p>""").format(
765 filePath, pdfFile.errorString()), 754 filePath, pdfFile.errorString()),
766 E5MessageBox.StandardButtons( 755 E5MessageBox.StandardButtons(
767 E5MessageBox.Ok)) 756 E5MessageBox.Ok))
768 757
769 def __pdfGeneratedForPrinting(self, pdfData):
770 """
771 Private slot to print the generated PDF data.
772
773 @param pdfData generated PDF document
774 @type QByteArray
775 """
776 if self.__pdfPrinter is None or pdfData.isEmpty():
777 return
778
779 tempFile = QTemporaryFile(QDir.tempPath() + "/ericBrowserXXXXXX.pdf")
780 tempFile.setAutoRemove(False)
781 if tempFile.open():
782 bytesWritten = tempFile.write(pdfData)
783 tempFile.close()
784 if bytesWritten == pdfData.size():
785 if Globals.isWindowsPlatform():
786 printerName = self.__pdfPrinter.printerName()
787 import ctypes
788 ctypes.windll.shell32.ShellExecuteW(
789 None, "printto", tempFile.fileName(),
790 '"{0}"'.format(printerName), None, 0)
791 else:
792 FilePrinter.printFile(
793 self.__pdfPrinter, tempFile.fileName(),
794 FilePrinter.FilePrinter.SystemDeletesFiles,
795 FilePrinter.FilePrinter.SystemSelectsPages)
796 else:
797 tempFile.remove()
798
799 self.__pdfPrinter = None
800
801 @pyqtSlot() 758 @pyqtSlot()
802 def printPreviewBrowser(self, browser=None): 759 def printPreviewBrowser(self, browser=None):
803 """ 760 """
804 Public slot called to show a print preview of the displayed file. 761 Public slot called to show a print preview of the displayed file.
805 762
831 printer.setPrinterName(printerName) 788 printer.setPrinterName(printerName)
832 printer.setResolution(Preferences.getPrinter("Resolution")) 789 printer.setResolution(Preferences.getPrinter("Resolution"))
833 790
834 preview = QPrintPreviewDialog(printer, self) 791 preview = QPrintPreviewDialog(printer, self)
835 preview.resize(800, 750) 792 preview.resize(800, 750)
836 if qVersionTuple() >= (5, 8, 0): 793 preview.paintRequested.connect(
837 preview.paintRequested.connect( 794 lambda p: self.__printPreviewRequested(p, browser))
838 lambda p: self.__printPreviewRequested(p, browser))
839 else:
840 preview.paintRequested.connect(lambda p: browser.render(p))
841 preview.exec_() 795 preview.exec_()
842 796
843 def __printPreviewRequested(self, printer, browser): 797 def __printPreviewRequested(self, printer, browser):
844 """ 798 """
845 Private slot to generate the print preview. 799 Private slot to generate the print preview.

eric ide

mercurial