Mon, 23 Jan 2023 17:12:03 +0100
Corrected some code formatting and style issues.
9699 | 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 | ||
9722
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
10 | from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot |
9699 | 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. | |
9722
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
18 | |
9699 | 19 | @signal zoomFactorChanged(factor) emitted to indicate the selected zoom factor |
20 | @signal zoomModeChanged(zoomMode) emitted to indicate the selected zoom mode | |
21 | """ | |
9722
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
22 | |
9699 | 23 | zoomFactorChanged = pyqtSignal(float) |
24 | zoomModeChanged = pyqtSignal(QPdfView.ZoomMode) | |
25 | ||
9722
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
26 | ZoomValues = ( |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
27 | 0.12, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
28 | 0.25, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
29 | 0.33, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
30 | 0.5, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
31 | 0.66, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
32 | 0.75, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
33 | 1.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
34 | 1.25, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
35 | 1.50, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
36 | 2.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
37 | 4.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
38 | 8.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
39 | 16.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
40 | 25.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
41 | 50.0, |
63135ab601e7
Corrected some code formatting and style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9705
diff
changeset
|
42 | ) |
9700 | 43 | |
9699 | 44 | def __init__(self, parent=None): |
45 | """ | |
46 | Constructor | |
47 | ||
48 | @param parent reference to the parent widget (defaults to None) | |
49 | @type QWidget (optional) | |
50 | """ | |
51 | super().__init__(parent) | |
52 | ||
53 | self.setEditable(True) | |
54 | self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) | |
55 | ||
9700 | 56 | self.__pageWidthLabel = self.tr("Page Width") |
57 | self.__wholePageLabel = self.tr("Whole Page") | |
58 | ||
59 | self.addItem(self.__pageWidthLabel) | |
60 | self.addItem(self.__wholePageLabel) | |
61 | for val in PdfZoomSelector.ZoomValues: | |
62 | self.addItem(self.tr("{0}%").format(int(val * 100))) | |
9699 | 63 | |
64 | self.lineEdit().setAlignment(Qt.AlignmentFlag.AlignCenter) | |
65 | ||
9705
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9700
diff
changeset
|
66 | self.currentIndexChanged.connect(self.__editingFinished) |
9699 | 67 | self.lineEdit().editingFinished.connect(self.__editingFinished) |
68 | ||
69 | @pyqtSlot() | |
70 | def __editingFinished(self): | |
71 | """ | |
72 | Private slot handling the end of entering a zoom factor. | |
73 | """ | |
74 | self.__processText(self.lineEdit().text()) | |
75 | ||
76 | @pyqtSlot(str) | |
77 | def __processText(self, text): | |
78 | """ | |
79 | Private slot to handle the change of the entered zoom factor. | |
80 | ||
81 | @param text text to be handled | |
82 | @type str | |
83 | """ | |
9700 | 84 | if text == self.__pageWidthLabel: |
9699 | 85 | self.zoomModeChanged.emit(QPdfView.ZoomMode.FitToWidth) |
9700 | 86 | elif text == self.__wholePageLabel: |
9699 | 87 | self.zoomModeChanged.emit(QPdfView.ZoomMode.FitInView) |
88 | else: | |
9700 | 89 | withoutPercent = text.replace("%", "").replace("&", "") |
9699 | 90 | try: |
91 | zoomLevel = int(withoutPercent) | |
92 | factor = zoomLevel / 100.0 | |
93 | except ValueError: | |
94 | factor = 1.0 | |
95 | ||
96 | self.zoomModeChanged.emit(QPdfView.ZoomMode.Custom) | |
97 | self.zoomFactorChanged.emit(factor) | |
98 | ||
99 | @pyqtSlot() | |
100 | def reset(self): | |
101 | """ | |
102 | Public slot to reset the zoom factor to 100%. | |
103 | """ | |
104 | self.setCurrentIndex(8) # index 8 is 100% | |
9700 | 105 | self.__editingFinished() |
9699 | 106 | |
107 | @pyqtSlot(float) | |
108 | def setZoomFactor(self, zoomFactor): | |
109 | """ | |
110 | Public slot to set the current zoom factor. | |
111 | ||
112 | @param zoomFactor current zoom factor | |
113 | @type float | |
114 | """ | |
115 | self.setCurrentText(self.tr("{0}%").format(round(zoomFactor * 100))) | |
9700 | 116 | self.__editingFinished() |
117 | ||
118 | @pyqtSlot(QPdfView.ZoomMode) | |
119 | def setZoomMode(self, zoomMode): | |
120 | """ | |
121 | Public slot to set the zoom value iaw. the zoom mode. | |
122 | ||
123 | @param zoomMode current zoom mode | |
124 | @type QPdfView.ZoomMode | |
125 | """ | |
126 | if zoomMode == QPdfView.ZoomMode.FitToWidth: | |
127 | self.setCurrentIndex(0) # index 0 is 'Page Width' | |
128 | elif zoomMode == QPdfView.ZoomMode.FitInView: | |
129 | self.setCurrentIndex(1) # index 1 is 'Whole Page' | |
130 | else: | |
131 | # ignore Custom mode here | |
132 | return | |
133 | self.__editingFinished() |