src/eric7/PdfViewer/PdfZoomSelector.py

Sat, 14 Jan 2023 18:25:26 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 14 Jan 2023 18:25:26 +0100
branch
pdf_viewer
changeset 9699
92dcd34d54e4
child 9700
b74a13a382a8
permissions
-rw-r--r--

PDF Viewer
- finished 'Go to' functions
- started with 'Zoom' functions

# -*- coding: utf-8 -*-

# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a widget to select a PDF zoom factor.
"""

from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt
from PyQt6.QtPdfWidgets import QPdfView
from PyQt6.QtWidgets import QComboBox


class PdfZoomSelector(QComboBox):
    """
    Class implementing a widget to select a PDF zoom factor.
    
    @signal zoomFactorChanged(factor) emitted to indicate the selected zoom factor
    @signal zoomModeChanged(zoomMode) emitted to indicate the selected zoom mode
    """
    zoomFactorChanged = pyqtSignal(float)
    zoomModeChanged = pyqtSignal(QPdfView.ZoomMode)

    def __init__(self, parent=None):
        """
        Constructor

        @param parent reference to the parent widget (defaults to None)
        @type QWidget (optional)
        """
        super().__init__(parent)

        self.setEditable(True)
        self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert)

        self.addItem(self.tr("Page Width"))
        self.addItem(self.tr("Whole Page"))
        self.addItem(self.tr("12%"))
        self.addItem(self.tr("25%"))
        self.addItem(self.tr("33%"))
        self.addItem(self.tr("50%"))
        self.addItem(self.tr("66%"))
        self.addItem(self.tr("75%"))
        self.addItem(self.tr("100%"))
        self.addItem(self.tr("125%"))
        self.addItem(self.tr("150%"))
        self.addItem(self.tr("200%"))
        self.addItem(self.tr("400%"))
        self.addItem(self.tr("800%"))
        self.addItem(self.tr("1600%"))
        self.addItem(self.tr("2500%"))
        self.addItem(self.tr("5000%"))

        self.lineEdit().setAlignment(Qt.AlignmentFlag.AlignCenter)

        self.currentTextChanged.connect(self.__processText)
        self.lineEdit().editingFinished.connect(self.__editingFinished)

    @pyqtSlot()
    def __editingFinished(self):
        """
        Private slot handling the end of entering a zoom factor.
        """
        self.__processText(self.lineEdit().text())

    @pyqtSlot(str)
    def __processText(self, text):
        """
        Private slot to handle the change of the entered zoom factor.

        @param text text to be handled
        @type str
        """
        if text == self.tr("Page Width"):
            self.zoomModeChanged.emit(QPdfView.ZoomMode.FitToWidth)
        elif text == self.tr("Whole Page"):
            self.zoomModeChanged.emit(QPdfView.ZoomMode.FitInView)
        else:
            withoutPercent = text.replace("%", "")
            try:
                zoomLevel = int(withoutPercent)
                factor = zoomLevel / 100.0
            except ValueError:
                factor = 1.0

            self.zoomModeChanged.emit(QPdfView.ZoomMode.Custom)
            self.zoomFactorChanged.emit(factor)

    @pyqtSlot()
    def reset(self):
        """
        Public slot to reset the zoom factor to 100%.
        """
        self.setCurrentIndex(8)  # index 8 is 100%

    @pyqtSlot(float)
    def setZoomFactor(self, zoomFactor):
        """
        Public slot to set the current zoom factor.

        @param zoomFactor current zoom factor
        @type float
        """
        self.setCurrentText(self.tr("{0}%").format(round(zoomFactor * 100)))

eric ide

mercurial