eric7/HelpViewer/OpenPagesWidget.py

branch
eric7
changeset 8895
d66181594630
parent 8881
54e42bc2437a
child 8898
cf11386c25ec
equal deleted inserted replaced
8894:7a5d78f8b64b 8895:d66181594630
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()

eric ide

mercurial