eric7/HelpViewer/OpenPagesWidget.py

branch
eric7-maintenance
changeset 8941
e1f6a9e53979
parent 8898
cf11386c25ec
equal deleted inserted replaced
8897:a906ba97c1fe 8941:e1f6a9e53979
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()

eric ide

mercurial