Wed, 18 Jan 2023 16:37:08 +0100
Fixed a few bugs in the PDF Viewer.
9702 | 1 | # -*- coding: utf-8 -*- |
2 | ||
3 | # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> | |
4 | # | |
5 | ||
6 | """ | |
7 | Module implementing an info widget showing data of a PDF document. | |
8 | """ | |
9 | ||
10 | from PyQt6.QtCore import Qt, pyqtSlot, QFileInfo | |
11 | from PyQt6.QtPdf import QPdfDocument | |
12 | from PyQt6.QtWidgets import QWidget, QFormLayout, QLabel | |
13 | ||
14 | from eric7.Globals import dataString | |
15 | ||
16 | ||
17 | class PdfInfoWidget(QWidget): | |
18 | """ | |
19 | Class implementing an info widget showing data of a PDF document. | |
20 | """ | |
21 | ||
22 | def __init__(self, document, parent=None): | |
23 | """ | |
24 | Constructor | |
25 | ||
26 | @param document reference to the PDF document object | |
27 | @type QPdfDocument | |
28 | @param parent reference to the parent widget (defaults to None) | |
29 | @type QWidget (optional) | |
30 | """ | |
31 | super().__init__(parent) | |
32 | ||
9705
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
33 | self.__document = None |
9702 | 34 | |
35 | self.__layout = QFormLayout(self) | |
36 | self.__layout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows) | |
37 | self.__layout.setFieldGrowthPolicy( | |
38 | QFormLayout.FieldGrowthPolicy.AllNonFixedFieldsGrow | |
39 | ) | |
40 | self.__layout.setFormAlignment( | |
41 | Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop | |
42 | ) | |
43 | self.__layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight) | |
44 | ||
45 | self.__infoLabels = { | |
46 | "filePath": QLabel(), | |
47 | "fileSize": QLabel(), | |
48 | "title": QLabel(), | |
49 | "subject": QLabel(), | |
50 | "author": QLabel(), | |
51 | "creator": QLabel(), | |
52 | "producer": QLabel(), | |
53 | "pages": QLabel(), | |
54 | "creationDate": QLabel(), | |
55 | "modificationDate": QLabel(), | |
56 | "keywords": QLabel(), | |
57 | "security": QLabel(), | |
58 | } | |
59 | for label in self.__infoLabels.values(): | |
60 | label.setWordWrap(True) | |
61 | self.__layout.addRow(self.tr("File Path:"), self.__infoLabels["filePath"]) | |
62 | self.__layout.addRow(self.tr("File Size:"), self.__infoLabels["fileSize"]) | |
63 | self.__layout.addRow(self.tr("Title:"), self.__infoLabels["title"]) | |
64 | self.__layout.addRow(self.tr("Subject:"), self.__infoLabels["subject"]) | |
65 | self.__layout.addRow(self.tr("Author:"), self.__infoLabels["author"]) | |
66 | self.__layout.addRow(self.tr("Created with:"), self.__infoLabels["creator"]) | |
67 | self.__layout.addRow(self.tr("Creator:"), self.__infoLabels["producer"]) | |
68 | self.__layout.addRow(self.tr("Pages:"), self.__infoLabels["pages"]) | |
69 | self.__layout.addRow(self.tr("Created at:"), self.__infoLabels["creationDate"]) | |
70 | self.__layout.addRow( | |
71 | self.tr("Last Modified at:"), self.__infoLabels["modificationDate"] | |
72 | ) | |
73 | self.__layout.addRow(self.tr("Keywords:"), self.__infoLabels["keywords"]) | |
74 | self.__layout.addRow(self.tr("Security:"), self.__infoLabels["security"]) | |
75 | ||
76 | self.setLayout(self.__layout) | |
77 | ||
9705
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
78 | self.setDocument(document) |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
79 | |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
80 | def setDocument(self, document): |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
81 | """ |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
82 | Public method to set the reference to the PDF document. |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
83 | |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
84 | @param document reference to the document |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
85 | @type QPdfDocument |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
86 | """ |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
87 | if self.__document is not None: |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
88 | self.__document.statusChanged.disconnect(self.__populateInfoLabels) |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
89 | self.__document.pageCountChanged.disconnect(self.__handlePageCountChanged) |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
90 | self.__document.passwordChanged.disconnect(self.__handlePasswordChanged) |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
91 | |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
92 | self.__document = document |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
93 | |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
94 | if document is not None: |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
95 | self.__document.statusChanged.connect(self.__populateInfoLabels) |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
96 | self.__document.pageCountChanged.connect(self.__handlePageCountChanged) |
7629a6f23b2e
Fixed a few bugs in the PDF Viewer.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9704
diff
changeset
|
97 | self.__document.passwordChanged.connect(self.__handlePasswordChanged) |
9702 | 98 | |
99 | @pyqtSlot(QPdfDocument.Status) | |
100 | def __populateInfoLabels(self, status): | |
101 | """ | |
102 | Private slot to populate the info labels upon a change of the document status. | |
103 | ||
104 | @param status document status | |
105 | @type QPdfDocument.Status | |
106 | """ | |
107 | ready = status == QPdfDocument.Status.Ready | |
108 | ||
109 | self.__infoLabels["title"].setText( | |
110 | self.__document.metaData(QPdfDocument.MetaDataField.Title) if ready else "" | |
111 | ) | |
112 | self.__infoLabels["subject"].setText( | |
113 | self.__document.metaData(QPdfDocument.MetaDataField.Subject) | |
114 | if ready | |
115 | else "" | |
116 | ) | |
117 | self.__infoLabels["author"].setText( | |
118 | self.__document.metaData(QPdfDocument.MetaDataField.Author) if ready else "" | |
119 | ) | |
120 | self.__infoLabels["creator"].setText( | |
121 | self.__document.metaData(QPdfDocument.MetaDataField.Creator) | |
122 | if ready | |
123 | else "" | |
124 | ) | |
125 | self.__infoLabels["producer"].setText( | |
126 | self.__document.metaData(QPdfDocument.MetaDataField.Producer) | |
127 | if ready | |
128 | else "" | |
129 | ) | |
130 | self.__infoLabels["pages"].setText( | |
131 | str(self.__document.pageCount()) if ready else "" | |
132 | ) | |
133 | self.__infoLabels["creationDate"].setText( | |
134 | self.__document.metaData(QPdfDocument.MetaDataField.CreationDate).toString( | |
135 | "yyyy-MM-dd hh:mm:ss t" | |
136 | ) if ready | |
137 | else "" | |
138 | ) | |
139 | self.__infoLabels["modificationDate"].setText( | |
140 | self.__document.metaData( | |
141 | QPdfDocument.MetaDataField.ModificationDate | |
142 | ).toString("yyyy-MM-dd hh:mm:ss t") | |
143 | if ready | |
144 | else "" | |
145 | ) | |
146 | self.__infoLabels["keywords"].setText( | |
147 | self.__document.metaData(QPdfDocument.MetaDataField.Keywords) | |
148 | if ready | |
149 | else "" | |
150 | ) | |
151 | ||
152 | if ready: | |
153 | self.__handlePasswordChanged() | |
154 | else: | |
155 | self.__infoLabels["security"].setText("") | |
156 | ||
157 | @pyqtSlot(int) | |
158 | def __handlePageCountChanged(self, pageCount): | |
159 | """ | |
160 | Private slot to handle a change of the page count. | |
161 | ||
162 | @param pageCount changed page count | |
163 | @type int | |
164 | """ | |
165 | self.__infoLabels["pages"].setText(str(pageCount)) | |
166 | ||
167 | @pyqtSlot() | |
168 | def __handlePasswordChanged(self): | |
169 | """ | |
170 | Private slot to handle a change of the password. | |
171 | """ | |
172 | self.__infoLabels["security"].setText( | |
173 | self.tr("Encrypted") | |
174 | if self.__document.password() | |
175 | else self.tr("Not Encrypted") | |
176 | ) | |
177 | ||
178 | def setFileName(self, filename): | |
179 | """ | |
180 | Public method to set the file name info. | |
181 | ||
182 | @param filename DESCRIPTION | |
183 | @type TYPE | |
184 | """ | |
185 | self.__infoLabels["filePath"].setText(filename) | |
186 | if filename: | |
187 | fi = QFileInfo(filename) | |
188 | fileSize = fi.size() | |
189 | self.__infoLabels["fileSize"].setText(dataString(fileSize)) | |
190 | else: | |
191 | self.__infoLabels["fileSize"].setText("") |