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 |
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 |