eric6/WebBrowser/WebBrowserTabWidget.py

changeset 8143
2c730d5fd177
parent 7923
91e843545d9a
child 8176
31965986ecd1
child 8218
7c09585bd960
equal deleted inserted replaced
8141:27f636beebad 8143:2c730d5fd177
89 89
90 self.__mainWindow = parent 90 self.__mainWindow = parent
91 91
92 self.setUsesScrollButtons(True) 92 self.setUsesScrollButtons(True)
93 self.setDocumentMode(True) 93 self.setDocumentMode(True)
94 self.setElideMode(Qt.ElideNone) 94 self.setElideMode(Qt.TextElideMode.ElideNone)
95 95
96 from .ClosedTabsManager import ClosedTabsManager 96 from .ClosedTabsManager import ClosedTabsManager
97 self.__closedTabsManager = ClosedTabsManager(self) 97 self.__closedTabsManager = ClosedTabsManager(self)
98 self.__closedTabsManager.closedTabAvailable.connect( 98 self.__closedTabsManager.closedTabAvailable.connect(
99 self.__closedTabAvailable) 99 self.__closedTabAvailable)
102 self.__stackedUrlBar = StackedUrlBar(self) 102 self.__stackedUrlBar = StackedUrlBar(self)
103 self.__tabBar.tabMoved.connect(self.__stackedUrlBar.moveBar) 103 self.__tabBar.tabMoved.connect(self.__stackedUrlBar.moveBar)
104 104
105 self.__tabContextMenuIndex = -1 105 self.__tabContextMenuIndex = -1
106 self.currentChanged[int].connect(self.__currentChanged) 106 self.currentChanged[int].connect(self.__currentChanged)
107 self.setTabContextMenuPolicy(Qt.CustomContextMenu) 107 self.setTabContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
108 self.customTabContextMenuRequested.connect(self.__showContextMenu) 108 self.customTabContextMenuRequested.connect(self.__showContextMenu)
109 109
110 self.__rightCornerWidget = QWidget(self) 110 self.__rightCornerWidget = QWidget(self)
111 self.__rightCornerWidgetLayout = QHBoxLayout(self.__rightCornerWidget) 111 self.__rightCornerWidgetLayout = QHBoxLayout(self.__rightCornerWidget)
112 self.__rightCornerWidgetLayout.setContentsMargins(0, 0, 0, 0) 112 self.__rightCornerWidgetLayout.setContentsMargins(0, 0, 0, 0)
119 self.__navigationButton = QToolButton(self) 119 self.__navigationButton = QToolButton(self)
120 self.__navigationButton.setIcon( 120 self.__navigationButton.setIcon(
121 UI.PixmapCache.getIcon("1downarrow")) 121 UI.PixmapCache.getIcon("1downarrow"))
122 self.__navigationButton.setToolTip( 122 self.__navigationButton.setToolTip(
123 self.tr("Show a navigation menu")) 123 self.tr("Show a navigation menu"))
124 self.__navigationButton.setPopupMode(QToolButton.InstantPopup) 124 self.__navigationButton.setPopupMode(
125 QToolButton.ToolButtonPopupMode.InstantPopup)
125 self.__navigationButton.setMenu(self.__navigationMenu) 126 self.__navigationButton.setMenu(self.__navigationMenu)
126 self.__navigationButton.setEnabled(False) 127 self.__navigationButton.setEnabled(False)
127 self.__rightCornerWidgetLayout.addWidget(self.__navigationButton) 128 self.__rightCornerWidgetLayout.addWidget(self.__navigationButton)
128 129
129 self.__closedTabsMenu = QMenu(self) 130 self.__closedTabsMenu = QMenu(self)
132 133
133 self.__closedTabsButton = QToolButton(self) 134 self.__closedTabsButton = QToolButton(self)
134 self.__closedTabsButton.setIcon(UI.PixmapCache.getIcon("trash")) 135 self.__closedTabsButton.setIcon(UI.PixmapCache.getIcon("trash"))
135 self.__closedTabsButton.setToolTip( 136 self.__closedTabsButton.setToolTip(
136 self.tr("Show a navigation menu for closed tabs")) 137 self.tr("Show a navigation menu for closed tabs"))
137 self.__closedTabsButton.setPopupMode(QToolButton.InstantPopup) 138 self.__closedTabsButton.setPopupMode(
139 QToolButton.ToolButtonPopupMode.InstantPopup)
138 self.__closedTabsButton.setMenu(self.__closedTabsMenu) 140 self.__closedTabsButton.setMenu(self.__closedTabsMenu)
139 self.__closedTabsButton.setEnabled(False) 141 self.__closedTabsButton.setEnabled(False)
140 self.__rightCornerWidgetLayout.addWidget(self.__closedTabsButton) 142 self.__rightCornerWidgetLayout.addWidget(self.__closedTabsButton)
141 143
142 self.setTabsClosable(True) 144 self.setTabsClosable(True)
143 self.tabCloseRequested.connect(self.closeBrowserAt) 145 self.tabCloseRequested.connect(self.closeBrowserAt)
144 146
145 self.setCornerWidget(self.__rightCornerWidget, Qt.TopRightCorner) 147 self.setCornerWidget(
148 self.__rightCornerWidget, Qt.Corner.TopRightCorner)
146 149
147 self.__newTabButton = QToolButton(self) 150 self.__newTabButton = QToolButton(self)
148 self.__newTabButton.setIcon(UI.PixmapCache.getIcon("plus")) 151 self.__newTabButton.setIcon(UI.PixmapCache.getIcon("plus"))
149 self.__newTabButton.setToolTip( 152 self.__newTabButton.setToolTip(
150 self.tr("Open a new web browser tab")) 153 self.tr("Open a new web browser tab"))
151 self.setCornerWidget(self.__newTabButton, Qt.TopLeftCorner) 154 self.setCornerWidget(self.__newTabButton, Qt.Corner.TopLeftCorner)
152 self.__newTabButton.clicked.connect(self.__newBrowser) 155 self.__newTabButton.clicked.connect(self.__newBrowser)
153 156
154 self.__initTabContextMenu() 157 self.__initTabContextMenu()
155 158
156 self.__historyCompleter = None 159 self.__historyCompleter = None
348 icon = page.icon() 351 icon = page.icon()
349 352
350 if page.isAudioMuted() or ( 353 if page.isAudioMuted() or (
351 not page.isAudioMuted() and recentlyAudible): 354 not page.isAudioMuted() and recentlyAudible):
352 pix = QPixmap(32, 32) 355 pix = QPixmap(32, 32)
353 pix.fill(Qt.transparent) 356 pix.fill(Qt.GlobalColor.transparent)
354 painter = QPainter(pix) 357 painter = QPainter(pix)
355 icon.paint(painter, 0, 0, 22, 22) 358 icon.paint(painter, 0, 0, 22, 22)
356 if page.isAudioMuted(): 359 if page.isAudioMuted():
357 audioIcon = UI.PixmapCache.getIcon("audioMuted") 360 audioIcon = UI.PixmapCache.getIcon("audioMuted")
358 else: 361 else:
474 linkName = "about:blank" 477 linkName = "about:blank"
475 478
476 if linkName: 479 if linkName:
477 browser.setSource(QUrl(linkName)) 480 browser.setSource(QUrl(linkName))
478 if not browser.documentTitle(): 481 if not browser.documentTitle():
479 self.setTabText(index, self.__elide(linkName, Qt.ElideMiddle)) 482 self.setTabText(
483 index,
484 self.__elide(linkName, Qt.TextElideMode.ElideMiddle)
485 )
480 self.setTabToolTip(index, linkName) 486 self.setTabToolTip(index, linkName)
481 else: 487 else:
482 self.setTabText( 488 self.setTabText(
483 index, 489 index,
484 self.__elide(browser.documentTitle().replace("&", "&&"))) 490 self.__elide(browser.documentTitle().replace("&", "&&")))
642 @param browser reference to the browser to be printed (WebBrowserView) 648 @param browser reference to the browser to be printed (WebBrowserView)
643 """ 649 """
644 if browser is None: 650 if browser is None:
645 browser = self.currentBrowser() 651 browser = self.currentBrowser()
646 652
647 printer = QPrinter(mode=QPrinter.HighResolution) 653 printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
648 if Preferences.getPrinter("ColorMode"): 654 if Preferences.getPrinter("ColorMode"):
649 printer.setColorMode(QPrinter.Color) 655 printer.setColorMode(QPrinter.ColorMode.Color)
650 else: 656 else:
651 printer.setColorMode(QPrinter.GrayScale) 657 printer.setColorMode(QPrinter.ColorMode.GrayScale)
652 if Preferences.getPrinter("FirstPageFirst"): 658 if Preferences.getPrinter("FirstPageFirst"):
653 printer.setPageOrder(QPrinter.FirstPageFirst) 659 printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
654 else: 660 else:
655 printer.setPageOrder(QPrinter.LastPageFirst) 661 printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
656 printer.setPageMargins( 662 printer.setPageMargins(
657 Preferences.getPrinter("LeftMargin") * 10, 663 Preferences.getPrinter("LeftMargin") * 10,
658 Preferences.getPrinter("TopMargin") * 10, 664 Preferences.getPrinter("TopMargin") * 10,
659 Preferences.getPrinter("RightMargin") * 10, 665 Preferences.getPrinter("RightMargin") * 10,
660 Preferences.getPrinter("BottomMargin") * 10, 666 Preferences.getPrinter("BottomMargin") * 10,
661 QPrinter.Millimeter 667 QPrinter.Unit.Millimeter
662 ) 668 )
663 printerName = Preferences.getPrinter("PrinterName") 669 printerName = Preferences.getPrinter("PrinterName")
664 if printerName: 670 if printerName:
665 printer.setPrinterName(printerName) 671 printer.setPrinterName(printerName)
666 printer.setResolution(Preferences.getPrinter("Resolution")) 672 printer.setResolution(Preferences.getPrinter("Resolution"))
667 documentName = WebBrowserTools.getFileNameFromUrl(browser.url()) 673 documentName = WebBrowserTools.getFileNameFromUrl(browser.url())
668 printer.setDocName(documentName) 674 printer.setDocName(documentName)
669 675
670 printDialog = QPrintDialog(printer, self) 676 printDialog = QPrintDialog(printer, self)
671 printDialog.setOptions(QAbstractPrintDialog.PrintToFile | 677 printDialog.setOptions(
672 QAbstractPrintDialog.PrintShowPageSize) 678 QAbstractPrintDialog.PrintDialogOption.PrintToFile |
679 QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize
680 )
673 if not Globals.isWindowsPlatform(): 681 if not Globals.isWindowsPlatform():
674 if isCupsAvailable(): 682 if isCupsAvailable():
675 printDialog.setOption(QAbstractPrintDialog.PrintCollateCopies) 683 printDialog.setOption(
676 printDialog.setOption(QAbstractPrintDialog.PrintPageRange) 684 QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies)
677 if printDialog.exec() == QDialog.Accepted: 685 printDialog.setOption(
686 QAbstractPrintDialog.PrintDialogOption.PrintPageRange)
687 if printDialog.exec() == QDialog.DialogCode.Accepted:
678 browser.page().execPrintPage(printer, 10 * 1000) 688 browser.page().execPrintPage(printer, 10 * 1000)
679 689
680 @pyqtSlot() 690 @pyqtSlot()
681 def printBrowserPdf(self, browser=None): 691 def printBrowserPdf(self, browser=None):
682 """ 692 """
694 if hasattr(browser.page(), "printToPdf"): 704 if hasattr(browser.page(), "printToPdf"):
695 from .Tools.PrintToPdfDialog import PrintToPdfDialog 705 from .Tools.PrintToPdfDialog import PrintToPdfDialog
696 if not name: 706 if not name:
697 name = "printout.pdf" 707 name = "printout.pdf"
698 dlg = PrintToPdfDialog(name, self) 708 dlg = PrintToPdfDialog(name, self)
699 if dlg.exec() == QDialog.Accepted: 709 if dlg.exec() == QDialog.DialogCode.Accepted:
700 filePath, pageLayout = dlg.getData() 710 filePath, pageLayout = dlg.getData()
701 if filePath: 711 if filePath:
702 if os.path.exists(filePath): 712 if os.path.exists(filePath):
703 res = E5MessageBox.warning( 713 res = E5MessageBox.warning(
704 self, 714 self,
714 return 724 return
715 browser.page().printToPdf( 725 browser.page().printToPdf(
716 lambda pdf: self.__pdfGeneratedForSave(filePath, pdf), 726 lambda pdf: self.__pdfGeneratedForSave(filePath, pdf),
717 pageLayout) 727 pageLayout)
718 elif Globals.isLinuxPlatform(): 728 elif Globals.isLinuxPlatform():
719 printer = QPrinter(mode=QPrinter.HighResolution) 729 printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
720 if Preferences.getPrinter("ColorMode"): 730 if Preferences.getPrinter("ColorMode"):
721 printer.setColorMode(QPrinter.Color) 731 printer.setColorMode(QPrinter.ColorMode.Color)
722 else: 732 else:
723 printer.setColorMode(QPrinter.GrayScale) 733 printer.setColorMode(QPrinter.ColorMode.GrayScale)
724 printerName = Preferences.getPrinter("PrinterName") 734 printerName = Preferences.getPrinter("PrinterName")
725 if printerName: 735 if printerName:
726 printer.setPrinterName(printerName) 736 printer.setPrinterName(printerName)
727 printer.setOutputFormat(QPrinter.PdfFormat) 737 printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)
728 if name: 738 if name:
729 printer.setOutputFileName(name) 739 printer.setOutputFileName(name)
730 printer.setResolution(Preferences.getPrinter("Resolution")) 740 printer.setResolution(Preferences.getPrinter("Resolution"))
731 741
732 printDialog = QPrintDialog(printer, self) 742 printDialog = QPrintDialog(printer, self)
733 if printDialog.exec() == QDialog.Accepted: 743 if printDialog.exec() == QDialog.DialogCode.Accepted:
734 browser.render(printer) 744 browser.render(printer)
735 745
736 def __pdfGeneratedForSave(self, filePath, pdfData): 746 def __pdfGeneratedForSave(self, filePath, pdfData):
737 """ 747 """
738 Private slot to save the generated PDF data to a file. 748 Private slot to save the generated PDF data to a file.
747 757
748 pdfFile = QFile(filePath) 758 pdfFile = QFile(filePath)
749 if pdfFile.open(QFile.WriteOnly): 759 if pdfFile.open(QFile.WriteOnly):
750 pdfFile.write(pdfData) 760 pdfFile.write(pdfData)
751 pdfFile.close() 761 pdfFile.close()
752 if pdfFile.error() != QFileDevice.NoError: 762 if pdfFile.error() != QFileDevice.FileError.NoError:
753 E5MessageBox.critical( 763 E5MessageBox.critical(
754 self, 764 self,
755 self.tr("Print to PDF"), 765 self.tr("Print to PDF"),
756 self.tr("""<p>The PDF could not be written to file <b>{0}""" 766 self.tr("""<p>The PDF could not be written to file <b>{0}"""
757 """</b>.</p><p><b>Error:</b> {1}</p>""").format( 767 """</b>.</p><p><b>Error:</b> {1}</p>""").format(
769 from PyQt5.QtPrintSupport import QPrintPreviewDialog 779 from PyQt5.QtPrintSupport import QPrintPreviewDialog
770 780
771 if browser is None: 781 if browser is None:
772 browser = self.currentBrowser() 782 browser = self.currentBrowser()
773 783
774 printer = QPrinter(mode=QPrinter.HighResolution) 784 printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
775 if Preferences.getPrinter("ColorMode"): 785 if Preferences.getPrinter("ColorMode"):
776 printer.setColorMode(QPrinter.Color) 786 printer.setColorMode(QPrinter.ColorMode.Color)
777 else: 787 else:
778 printer.setColorMode(QPrinter.GrayScale) 788 printer.setColorMode(QPrinter.ColorMode.GrayScale)
779 if Preferences.getPrinter("FirstPageFirst"): 789 if Preferences.getPrinter("FirstPageFirst"):
780 printer.setPageOrder(QPrinter.FirstPageFirst) 790 printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
781 else: 791 else:
782 printer.setPageOrder(QPrinter.LastPageFirst) 792 printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
783 printer.setPageMargins( 793 printer.setPageMargins(
784 Preferences.getPrinter("LeftMargin") * 10, 794 Preferences.getPrinter("LeftMargin") * 10,
785 Preferences.getPrinter("TopMargin") * 10, 795 Preferences.getPrinter("TopMargin") * 10,
786 Preferences.getPrinter("RightMargin") * 10, 796 Preferences.getPrinter("RightMargin") * 10,
787 Preferences.getPrinter("BottomMargin") * 10, 797 Preferences.getPrinter("BottomMargin") * 10,
788 QPrinter.Millimeter 798 QPrinter.Unit.Millimeter
789 ) 799 )
790 printerName = Preferences.getPrinter("PrinterName") 800 printerName = Preferences.getPrinter("PrinterName")
791 if printerName: 801 if printerName:
792 printer.setPrinterName(printerName) 802 printer.setPrinterName(printerName)
793 printer.setResolution(Preferences.getPrinter("Resolution")) 803 printer.setResolution(Preferences.getPrinter("Resolution"))
840 self.setTabText(index, self.__elide(title.replace("&", "&&"))) 850 self.setTabText(index, self.__elide(title.replace("&", "&&")))
841 self.setTabToolTip(index, title) 851 self.setTabToolTip(index, title)
842 852
843 self.titleChanged.emit(browser, title) 853 self.titleChanged.emit(browser, title)
844 854
845 def __elide(self, txt, mode=Qt.ElideRight, length=40): 855 def __elide(self, txt, mode=Qt.TextElideMode.ElideRight, length=40):
846 """ 856 """
847 Private method to elide some text. 857 Private method to elide some text.
848 858
849 @param txt text to be elided (string) 859 @param txt text to be elided (string)
850 @param mode elide mode (Qt.TextElideMode) 860 @param mode elide mode (Qt.TextElideMode)
851 @param length amount of characters to be used (integer) 861 @param length amount of characters to be used (integer)
852 @return the elided text (string) 862 @return the elided text (string)
853 """ 863 """
854 if mode == Qt.ElideNone or len(txt) < length: 864 if mode == Qt.TextElideMode.ElideNone or len(txt) < length:
855 return txt 865 return txt
856 elif mode == Qt.ElideLeft: 866 elif mode == Qt.TextElideMode.ElideLeft:
857 return "...{0}".format(txt[-length:]) 867 return "...{0}".format(txt[-length:])
858 elif mode == Qt.ElideMiddle: 868 elif mode == Qt.TextElideMode.ElideMiddle:
859 return "{0}...{1}".format(txt[:length // 2], txt[-(length // 2):]) 869 return "{0}...{1}".format(txt[:length // 2], txt[-(length // 2):])
860 elif mode == Qt.ElideRight: 870 elif mode == Qt.TextElideMode.ElideRight:
861 return "{0}...".format(txt[:length]) 871 return "{0}...".format(txt[:length])
862 else: 872 else:
863 # just in case 873 # just in case
864 return txt 874 return txt
865 875
1021 1031
1022 @param edit reference to the line edit 1032 @param edit reference to the line edit
1023 @type UrlBar 1033 @type UrlBar
1024 """ 1034 """
1025 url = self.__guessUrlFromPath(edit.text()) 1035 url = self.__guessUrlFromPath(edit.text())
1026 if e5App().keyboardModifiers() == Qt.AltModifier: 1036 if e5App().keyboardModifiers() == Qt.KeyboardModifier.AltModifier:
1027 self.newBrowser(url) 1037 self.newBrowser(url)
1028 else: 1038 else:
1029 self.currentBrowser().setSource(url) 1039 self.currentBrowser().setSource(url)
1030 self.currentBrowser().setFocus() 1040 self.currentBrowser().setFocus()
1031 1041
1070 (url.host() != "" or url.path() != "") 1080 (url.host() != "" or url.path() != "")
1071 ): 1081 ):
1072 return url 1082 return url
1073 1083
1074 urlString = Preferences.getWebBrowser("DefaultScheme") + path.strip() 1084 urlString = Preferences.getWebBrowser("DefaultScheme") + path.strip()
1075 url = QUrl.fromEncoded(urlString.encode("utf-8"), QUrl.TolerantMode) 1085 url = QUrl.fromEncoded(urlString.encode("utf-8"),
1086 QUrl.ParsingMode.TolerantMode)
1076 1087
1077 return url 1088 return url
1078 1089
1079 def __currentChanged(self, index): 1090 def __currentChanged(self, index):
1080 """ 1091 """
1141 maxWidth = fm.width('m') * 40 1152 maxWidth = fm.width('m') * 40
1142 1153
1143 self.__closedTabsMenu.clear() 1154 self.__closedTabsMenu.clear()
1144 index = 0 1155 index = 0
1145 for tab in self.__closedTabsManager.allClosedTabs(): 1156 for tab in self.__closedTabsManager.allClosedTabs():
1146 title = fm.elidedText(tab.title, Qt.ElideRight, maxWidth) 1157 title = fm.elidedText(tab.title, Qt.TextElideMode.ElideRight,
1158 maxWidth)
1147 act = self.__closedTabsMenu.addAction( 1159 act = self.__closedTabsMenu.addAction(
1148 self.__mainWindow.icon(tab.url), title) 1160 self.__mainWindow.icon(tab.url), title)
1149 act.setData(index) 1161 act.setData(index)
1150 act.triggered.connect(lambda: self.restoreClosedTab(act)) 1162 act.triggered.connect(lambda: self.restoreClosedTab(act))
1151 index += 1 1163 index += 1

eric ide

mercurial