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