|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a widget to select a PDF zoom factor. |
|
8 """ |
|
9 |
|
10 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt |
|
11 from PyQt6.QtPdfWidgets import QPdfView |
|
12 from PyQt6.QtWidgets import QComboBox |
|
13 |
|
14 |
|
15 class PdfZoomSelector(QComboBox): |
|
16 """ |
|
17 Class implementing a widget to select a PDF zoom factor. |
|
18 |
|
19 @signal zoomFactorChanged(factor) emitted to indicate the selected zoom factor |
|
20 @signal zoomModeChanged(zoomMode) emitted to indicate the selected zoom mode |
|
21 """ |
|
22 zoomFactorChanged = pyqtSignal(float) |
|
23 zoomModeChanged = pyqtSignal(QPdfView.ZoomMode) |
|
24 |
|
25 def __init__(self, parent=None): |
|
26 """ |
|
27 Constructor |
|
28 |
|
29 @param parent reference to the parent widget (defaults to None) |
|
30 @type QWidget (optional) |
|
31 """ |
|
32 super().__init__(parent) |
|
33 |
|
34 self.setEditable(True) |
|
35 self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) |
|
36 |
|
37 self.addItem(self.tr("Page Width")) |
|
38 self.addItem(self.tr("Whole Page")) |
|
39 self.addItem(self.tr("12%")) |
|
40 self.addItem(self.tr("25%")) |
|
41 self.addItem(self.tr("33%")) |
|
42 self.addItem(self.tr("50%")) |
|
43 self.addItem(self.tr("66%")) |
|
44 self.addItem(self.tr("75%")) |
|
45 self.addItem(self.tr("100%")) |
|
46 self.addItem(self.tr("125%")) |
|
47 self.addItem(self.tr("150%")) |
|
48 self.addItem(self.tr("200%")) |
|
49 self.addItem(self.tr("400%")) |
|
50 self.addItem(self.tr("800%")) |
|
51 self.addItem(self.tr("1600%")) |
|
52 self.addItem(self.tr("2500%")) |
|
53 self.addItem(self.tr("5000%")) |
|
54 |
|
55 self.lineEdit().setAlignment(Qt.AlignmentFlag.AlignCenter) |
|
56 |
|
57 self.currentTextChanged.connect(self.__processText) |
|
58 self.lineEdit().editingFinished.connect(self.__editingFinished) |
|
59 |
|
60 @pyqtSlot() |
|
61 def __editingFinished(self): |
|
62 """ |
|
63 Private slot handling the end of entering a zoom factor. |
|
64 """ |
|
65 self.__processText(self.lineEdit().text()) |
|
66 |
|
67 @pyqtSlot(str) |
|
68 def __processText(self, text): |
|
69 """ |
|
70 Private slot to handle the change of the entered zoom factor. |
|
71 |
|
72 @param text text to be handled |
|
73 @type str |
|
74 """ |
|
75 if text == self.tr("Page Width"): |
|
76 self.zoomModeChanged.emit(QPdfView.ZoomMode.FitToWidth) |
|
77 elif text == self.tr("Whole Page"): |
|
78 self.zoomModeChanged.emit(QPdfView.ZoomMode.FitInView) |
|
79 else: |
|
80 withoutPercent = text.replace("%", "") |
|
81 try: |
|
82 zoomLevel = int(withoutPercent) |
|
83 factor = zoomLevel / 100.0 |
|
84 except ValueError: |
|
85 factor = 1.0 |
|
86 |
|
87 self.zoomModeChanged.emit(QPdfView.ZoomMode.Custom) |
|
88 self.zoomFactorChanged.emit(factor) |
|
89 |
|
90 @pyqtSlot() |
|
91 def reset(self): |
|
92 """ |
|
93 Public slot to reset the zoom factor to 100%. |
|
94 """ |
|
95 self.setCurrentIndex(8) # index 8 is 100% |
|
96 |
|
97 @pyqtSlot(float) |
|
98 def setZoomFactor(self, zoomFactor): |
|
99 """ |
|
100 Public slot to set the current zoom factor. |
|
101 |
|
102 @param zoomFactor current zoom factor |
|
103 @type float |
|
104 """ |
|
105 self.setCurrentText(self.tr("{0}%").format(round(zoomFactor * 100))) |