diff -r 7629a6f23b2e -r c0ff0b4d5657 src/eric7/PdfViewer/PdfViewerWindow.py --- a/src/eric7/PdfViewer/PdfViewerWindow.py Wed Jan 18 16:37:08 2023 +0100 +++ b/src/eric7/PdfViewer/PdfViewerWindow.py Wed Jan 18 16:38:29 2023 +0100 @@ -18,7 +18,8 @@ from PyQt6.QtPdf import QPdfDocument, QPdfLink from PyQt6.QtPdfWidgets import QPdfView from PyQt6.QtWidgets import ( - QWhatsThis, QMenu, QTabWidget, QSplitter, QToolBar, QDialog + QWhatsThis, QMenu, QTabWidget, QSplitter, QToolBar, QDialog, QInputDialog, + QLineEdit ) from eric7 import Preferences @@ -28,7 +29,7 @@ from eric7.EricWidgets.EricMainWindow import EricMainWindow from eric7.EricWidgets.EricStretchableSpacer import EricStretchableSpacer from eric7.Globals import recentNamePdfFiles -from eric7.SystemUtilities import FileSystemUtilities +from eric7.SystemUtilities import FileSystemUtilities, OSUtilities from .PdfPageSelector import PdfPageSelector from .PdfZoomSelector import PdfZoomSelector @@ -147,7 +148,10 @@ self.__view.zoomModeChanged.connect(self.__zoomSelector.setZoomMode) self.__tocWidget.topicActivated.connect(self.__tocActivated) + self.__searchWidget.searchResultActivated.connect(self.__handleSearchResult) + self.__searchWidget.searchNextAvailable.connect(self.searchNextAct.setEnabled) + self.__searchWidget.searchPrevAvailable.connect(self.searchPrevAct.setEnabled) PdfViewerWindow.windows.append(self) @@ -418,7 +422,23 @@ """ Private method to define the view related user interface actions. """ - # TODO: add Fullscreen action + self.fullScreenAct = EricAction( + self.tr("Full Screen"), + EricPixmapCache.getIcon("windowFullscreen"), + self.tr("&Full Screen"), + 0, + 0, + self, + "pdfviewer_view_full_screen", + ) + if OSUtilities.isMacPlatform(): + self.fullScreenAct.setShortcut(QKeySequence(self.tr("Meta+Ctrl+F"))) + else: + self.fullScreenAct.setShortcut(QKeySequence(self.tr("F11"))) + self.fullScreenAct.setCheckable(True) + self.fullScreenAct.triggered.connect(self.__toggleFullScreen) + self.__actions.append(self.fullScreenAct) + self.zoomInAct = EricAction( self.tr("Zoom in"), EricPixmapCache.getIcon("zoomIn"), @@ -508,6 +528,45 @@ self.copyAllPageAct.triggered.connect(self.__copyAllTextOfPage) self.__actions.append(self.copyAllPageAct) + self.searchAct = EricAction( + self.tr("Search"), + EricPixmapCache.getIcon("find"), + self.tr("&Search..."), + QKeySequence(self.tr("Ctrl+F", "Edit|Search")), + 0, + self, + "pdfviewer_edit_search", + ) + self.searchAct.triggered.connect(self.__search) + self.__actions.append(self.searchAct) + + self.searchNextAct = EricAction( + self.tr("Search Next"), + EricPixmapCache.getIcon("findNext"), + self.tr("Search &Next"), + QKeySequence(self.tr("F3", "Edit|Search Next")), + 0, + self, + "pdfviewer_edit_searchnext", + ) + self.searchNextAct.triggered.connect(self.__searchWidget.nextResult) + self.__actions.append(self.searchNextAct) + + self.searchPrevAct = EricAction( + self.tr("Search Previous"), + EricPixmapCache.getIcon("findPrev"), + self.tr("Search &Previous"), + QKeySequence(self.tr("Shift+F3", "Edit|Search Previous")), + 0, + self, + "pdfviewer_edit_searchprevious", + ) + self.searchPrevAct.triggered.connect(self.__searchWidget.previousResult) + self.__actions.append(self.searchPrevAct) + + self.searchNextAct.setEnabled(False) + self.searchPrevAct.setEnabled(False) + def __initSettingsActions(self): """ Private method to create the Settings actions. @@ -628,6 +687,10 @@ self.zoomWholePageAct.setEnabled(ready) self.__zoomSelector.setEnabled(ready) + self.copyAllAct.setEnabled(ready) + self.copyAllPageAct.setEnabled(ready) + self.searchAct.setEnabled(ready) + def __initMenus(self): """ Private method to create the menus. @@ -658,6 +721,8 @@ menu = mb.addMenu(self.tr("&View")) menu.setTearOffEnabled(True) + menu.addAction(self.fullScreenAct) + menu.addSeparator() menu.addAction(self.zoomInAct) menu.addAction(self.zoomOutAct) menu.addAction(self.zoomResetAct) @@ -679,6 +744,10 @@ menu.addAction(self.copyAllAct) menu.addSeparator() menu.addAction(self.copyAllPageAct) + menu.addSeparator() + menu.addAction(self.searchAct) + menu.addAction(self.searchNextAct) + menu.addAction(self.searchPrevAct) menu = mb.addMenu(self.tr("&Go To")) menu.setTearOffEnabled(True) @@ -774,6 +843,8 @@ self.__saveRecent() + self.__documentInfoWidget.setDocument(None) + evt.accept() self.viewerClosed.emit() @@ -855,9 +926,21 @@ @param fileName path of the PDF file to load @type str """ - # TODO: if error is QPdfDocument.Error.IncorrectPassword ask for PW and try - # again until cancelled - err = self.__pdfDocument.load(fileName) + canceled = False + err = QPdfDocument.Error.IncorrectPassword + while not canceled and err == QPdfDocument.Error.IncorrectPassword: + err = self.__pdfDocument.load(fileName) + if err == QPdfDocument.Error.IncorrectPassword: + password, ok = QInputDialog.getText( + self, + self.tr("Load PDF File"), + self.tr("Enter password to read the document:"), + QLineEdit.EchoMode.Password, + ) + if ok: + self.__pdfDocument.setPassword(password) + else: + canceled = True if err != QPdfDocument.Error.None_: EricMessageBox.critical( self, @@ -996,6 +1079,14 @@ """ self.__view.pageNavigator().jump(link) + @pyqtSlot() + def __search(self): + """ + Private slot to initiate a search. + """ + self.__info.setCurrentWidget(self.__searchWidget) + self.__searchWidget.activateSearch() + def __setCurrentFile(self, fileName): """ Private method to register the file name of the current file. @@ -1204,6 +1295,19 @@ """ self.__view.pageNavigator().forward() + @pyqtSlot(bool) + def __toggleFullScreen(self, on): + """ + Private slot to toggle the full screen mode. + + @param on flag indicating to activate full screen mode + @type bool + """ + if on: + self.showFullScreen() + else: + self.showNormal() + @pyqtSlot() def __zoomIn(self): """