7 Module implementing a widget showing the list of open pages. |
7 Module implementing a widget showing the list of open pages. |
8 """ |
8 """ |
9 |
9 |
10 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QPoint |
10 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QPoint |
11 from PyQt6.QtGui import QGuiApplication, QClipboard |
11 from PyQt6.QtGui import QGuiApplication, QClipboard |
12 from PyQt6.QtWidgets import ( |
12 from PyQt6.QtWidgets import QListWidget, QAbstractItemView, QMenu |
13 QWidget, QListWidget, QVBoxLayout, QAbstractItemView, QMenu |
|
14 ) |
|
15 |
13 |
16 import UI.PixmapCache |
14 import UI.PixmapCache |
17 |
15 |
18 |
16 |
19 class OpenPagesWidget(QWidget): |
17 class OpenPagesWidget(QListWidget): |
20 """ |
18 """ |
21 Class implementing a widget showing the list of open pages. |
19 Class implementing a widget showing the list of open pages. |
22 |
20 |
23 @signal currentChanged(index) emitted to signal a change of the current |
21 @signal currentPageChanged(index) emitted to signal a change of the current |
24 page index |
22 page index |
25 """ |
23 """ |
26 currentChanged = pyqtSignal(int) |
24 currentPageChanged = pyqtSignal(int) |
27 |
25 |
28 def __init__(self, stack, parent=None): |
26 def __init__(self, stack, parent=None): |
29 """ |
27 """ |
30 Constructor |
28 Constructor |
31 |
29 |
38 super().__init__(parent) |
36 super().__init__(parent) |
39 self.setObjectName("OpenPagesWidget") |
37 self.setObjectName("OpenPagesWidget") |
40 |
38 |
41 self.__helpViewer = parent |
39 self.__helpViewer = parent |
42 |
40 |
43 self.__layout = QVBoxLayout() |
41 self.setAlternatingRowColors(True) |
44 self.__layout.setContentsMargins(0, 0, 0, 0) |
42 self.setSelectionMode( |
45 |
|
46 self.__openPagesList = QListWidget(self) |
|
47 self.__openPagesList.setAlternatingRowColors(True) |
|
48 self.__openPagesList.setSelectionMode( |
|
49 QAbstractItemView.SelectionMode.SingleSelection) |
43 QAbstractItemView.SelectionMode.SingleSelection) |
50 self.__openPagesList.setContextMenuPolicy( |
44 self.setContextMenuPolicy( |
51 Qt.ContextMenuPolicy.CustomContextMenu) |
45 Qt.ContextMenuPolicy.CustomContextMenu) |
52 self.__openPagesList.currentRowChanged.connect( |
46 self.currentRowChanged.connect( |
53 self.__currentRowChanged) |
47 self.__currentRowChanged) |
54 self.__openPagesList.customContextMenuRequested.connect( |
48 self.customContextMenuRequested.connect( |
55 self.__showContextMenu) |
49 self.__showContextMenu) |
56 self.__layout.addWidget(self.__openPagesList) |
|
57 |
|
58 self.setLayout(self.__layout) |
|
59 |
50 |
60 self.__stack = stack |
51 self.__stack = stack |
61 self.__stack.currentChanged.connect(self.__currentPageChanged) |
52 self.__stack.currentChanged.connect(self.__currentPageChanged) |
62 |
53 |
63 self.__initContextMenu() |
54 self.__initContextMenu() |
64 |
55 |
65 self.__defaultFont = self.__openPagesList.font() |
56 self.__defaultFont = self.font() |
66 self.__boldFont = self.__openPagesList.font() |
57 self.__boldFont = self.font() |
67 self.__boldFont.setBold(True) |
58 self.__boldFont.setBold(True) |
68 |
59 |
69 def __initContextMenu(self): |
60 def __initContextMenu(self): |
70 """ |
61 """ |
71 Private method to initialize the context menu. |
62 Private method to initialize the context menu. |
92 the viewlist. |
83 the viewlist. |
93 |
84 |
94 @param point position to open the menu at |
85 @param point position to open the menu at |
95 @type QPoint |
86 @type QPoint |
96 """ |
87 """ |
97 itm = self.__openPagesList.itemAt(point) |
88 itm = self.itemAt(point) |
98 self.__copyUrlAct.setEnabled(bool(itm) and itm.text() != "about:blank") |
89 self.__copyUrlAct.setEnabled(bool(itm) and itm.text() != "about:blank") |
99 self.closeOthersMenuAct.setEnabled(self.__openPagesList.count() > 1) |
90 self.closeOthersMenuAct.setEnabled(self.count() > 1) |
100 self.__menu.popup(self.__openPagesList.mapToGlobal(point)) |
91 self.__menu.popup(self.mapToGlobal(point)) |
101 |
92 |
102 @pyqtSlot(int) |
93 @pyqtSlot(int) |
103 def __currentPageChanged(self, index): |
94 def __currentPageChanged(self, index): |
104 """ |
95 """ |
105 Private slot to handle a change of the shown page. |
96 Private slot to handle a change of the shown page. |
106 |
97 |
107 @param index index of the current page |
98 @param index index of the current page |
108 @type int |
99 @type int |
109 """ |
100 """ |
110 for row in range(self.__openPagesList.count()): |
101 for row in range(self.count()): |
111 itm = self.__openPagesList.item(row) |
102 itm = self.item(row) |
112 itm.setFont( |
103 itm.setFont( |
113 self.__boldFont if row == index else self.__defaultFont |
104 self.__boldFont if row == index else self.__defaultFont |
114 ) |
105 ) |
115 |
106 |
116 @pyqtSlot(int) |
107 @pyqtSlot(int) |
120 |
111 |
121 @param row current row |
112 @param row current row |
122 @type int |
113 @type int |
123 """ |
114 """ |
124 self.__stack.setCurrentIndex(row) |
115 self.__stack.setCurrentIndex(row) |
125 self.currentChanged.emit(row) |
116 self.currentPageChanged.emit(row) |
126 |
117 |
127 def addPage(self, viewer, background=False): |
118 def addPage(self, viewer, background=False): |
128 """ |
119 """ |
129 Public method to add a viewer page to our list. |
120 Public method to add a viewer page to our list. |
130 |
121 |
132 @type HelpViewerImpl |
123 @type HelpViewerImpl |
133 @param background flag indicating to not change the current page |
124 @param background flag indicating to not change the current page |
134 (defaults to False) |
125 (defaults to False) |
135 @type bool (optional) |
126 @type bool (optional) |
136 """ |
127 """ |
137 self.__openPagesList.addItem(viewer.pageTitle()) |
128 self.addItem(viewer.pageTitle()) |
138 viewer.titleChanged.connect( |
129 viewer.titleChanged.connect( |
139 lambda: self.__viewerTitleChanged(viewer)) |
130 lambda: self.__viewerTitleChanged(viewer)) |
140 |
131 |
141 if not background: |
132 if not background: |
142 self.__openPagesList.setCurrentRow( |
133 self.setCurrentRow( |
143 self.__openPagesList.count() - 1) |
134 self.count() - 1) |
144 if self.__openPagesList.count() == 1: |
135 if self.count() == 1: |
145 self.__currentPageChanged(0) |
136 self.__currentPageChanged(0) |
146 |
137 |
147 def insertPage(self, index, viewer, background=False): |
138 def insertPage(self, index, viewer, background=False): |
148 """ |
139 """ |
149 Public method to insert a viewer page into our list. |
140 Public method to insert a viewer page into our list. |
154 @type HelpViewerImpl |
145 @type HelpViewerImpl |
155 @param background flag indicating to not change the current page |
146 @param background flag indicating to not change the current page |
156 (defaults to False) |
147 (defaults to False) |
157 @type bool (optional) |
148 @type bool (optional) |
158 """ |
149 """ |
159 currentRow = self.__openPagesList.currentRow() |
150 currentRow = self.currentRow() |
160 self.__openPagesList.insertItem(index, viewer.pageTitle()) |
151 self.insertItem(index, viewer.pageTitle()) |
161 viewer.titleChanged.connect( |
152 viewer.titleChanged.connect( |
162 lambda: self.__viewerTitleChanged(viewer)) |
153 lambda: self.__viewerTitleChanged(viewer)) |
163 |
154 |
164 if not background: |
155 if not background: |
165 self.__openPagesList.setCurrentRow(index) |
156 self.setCurrentRow(index) |
166 else: |
157 else: |
167 self.__openPagesList.setCurrentRow(currentRow) |
158 self.setCurrentRow(currentRow) |
168 |
159 |
169 def __viewerTitleChanged(self, viewer): |
160 def __viewerTitleChanged(self, viewer): |
170 """ |
161 """ |
171 Private method to handle the change of a viewer title. |
162 Private method to handle the change of a viewer title. |
172 |
163 |
173 @param viewer reference to the viewer that change title |
164 @param viewer reference to the viewer that change title |
174 @type HelpViewerImpl |
165 @type HelpViewerImpl |
175 """ |
166 """ |
176 index = self.__stack.indexOf(viewer) |
167 index = self.__stack.indexOf(viewer) |
177 itm = self.__openPagesList.item(index) |
168 itm = self.item(index) |
178 itm.setText(viewer.pageTitle()) |
169 itm.setText(viewer.pageTitle()) |
179 self.currentChanged.emit(index) |
170 self.currentPageChanged.emit(index) |
180 |
171 |
181 ####################################################################### |
172 ####################################################################### |
182 ## Context menu action methods |
173 ## Context menu action methods |
183 ####################################################################### |
174 ####################################################################### |
184 |
175 |
206 @pyqtSlot() |
197 @pyqtSlot() |
207 def __contextMenuCopyUrlToClipboard(self): |
198 def __contextMenuCopyUrlToClipboard(self): |
208 """ |
199 """ |
209 Private slot to copy the URL to the clipboard. |
200 Private slot to copy the URL to the clipboard. |
210 """ |
201 """ |
211 row = self.__openPagesList.currentRow() |
202 row = self.currentRow() |
212 viewer = self.__stack.widget(row) |
203 viewer = self.__stack.widget(row) |
213 url = viewer.link() |
204 url = viewer.link() |
214 if url.isValid(): |
205 if url.isValid(): |
215 urlStr = url.toString() |
206 urlStr = url.toString() |
216 |
207 |
229 """ |
220 """ |
230 viewer = self.__stack.widget(row) |
221 viewer = self.__stack.widget(row) |
231 self.__stack.removeWidget(viewer) |
222 self.__stack.removeWidget(viewer) |
232 viewer.deleteLater() |
223 viewer.deleteLater() |
233 |
224 |
234 itm = self.__openPagesList.takeItem(row) |
225 itm = self.takeItem(row) |
235 del itm |
226 del itm |
236 |
227 |
237 ####################################################################### |
228 ####################################################################### |
238 ## Slots for external access below |
229 ## Slots for external access below |
239 ####################################################################### |
230 ####################################################################### |
241 @pyqtSlot() |
232 @pyqtSlot() |
242 def closeCurrentPage(self): |
233 def closeCurrentPage(self): |
243 """ |
234 """ |
244 Public slot to close the current page. |
235 Public slot to close the current page. |
245 """ |
236 """ |
246 row = self.__openPagesList.currentRow() |
237 row = self.currentRow() |
247 self.__removeViewer(row) |
238 self.__removeViewer(row) |
248 |
239 |
249 if self.__openPagesList.count() == 0: |
240 if self.count() == 0: |
250 self.__helpViewer.addPage() |
241 self.__helpViewer.addPage() |
251 |
242 |
252 @pyqtSlot() |
243 @pyqtSlot() |
253 def closeOtherPages(self): |
244 def closeOtherPages(self): |
254 """ |
245 """ |
255 Public slot to close all other pages. |
246 Public slot to close all other pages. |
256 """ |
247 """ |
257 currentRow = self.__openPagesList.currentRow() |
248 currentRow = self.currentRow() |
258 for row in range(self.__openPagesList.count() - 1, -1, -1): |
249 for row in range(self.count() - 1, -1, -1): |
259 if row != currentRow: |
250 if row != currentRow: |
260 self.__removeViewer(row) |
251 self.__removeViewer(row) |
261 |
252 |
262 @pyqtSlot() |
253 @pyqtSlot() |
263 def closeAllPages(self): |
254 def closeAllPages(self): |
264 """ |
255 """ |
265 Public slot to close all pages. |
256 Public slot to close all pages. |
266 """ |
257 """ |
267 while self.__openPagesList.count() != 0: |
258 while self.count() != 0: |
268 self.__removeViewer(0) |
259 self.__removeViewer(0) |
269 self.__helpViewer.addPage() |
260 self.__helpViewer.addPage() |