src/eric7/PdfViewer/PdfViewerWindow.py

branch
pdf_viewer
changeset 9706
c0ff0b4d5657
parent 9704
6e1650b9b3b5
child 9707
717f95e35ca8
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):
         """

eric ide

mercurial