Debugger/WatchPointViewer.py

changeset 2988
f53c03574697
parent 2953
703452a2876f
child 3020
542e97d4ecb3
child 3057
10516539f238
equal deleted inserted replaced
2987:c99695c0f13a 2988:f53c03574697
6 """ 6 """
7 Module implementing the watch expression viewer widget. 7 Module implementing the watch expression viewer widget.
8 """ 8 """
9 9
10 from PyQt4.QtCore import Qt, QModelIndex, qVersion 10 from PyQt4.QtCore import Qt, QModelIndex, qVersion
11 from PyQt4.QtGui import QTreeView, QAbstractItemView, QMenu, QSortFilterProxyModel, \ 11 from PyQt4.QtGui import QTreeView, QAbstractItemView, QMenu, \
12 QHeaderView, QItemSelectionModel, QDialog 12 QSortFilterProxyModel, QHeaderView, QItemSelectionModel, QDialog
13 13
14 from E5Gui.E5Application import e5App 14 from E5Gui.E5Application import e5App
15 from E5Gui import E5MessageBox 15 from E5Gui import E5MessageBox
16 16
17 import Utilities 17 import Utilities
19 19
20 class WatchPointViewer(QTreeView): 20 class WatchPointViewer(QTreeView):
21 """ 21 """
22 Class implementing the watch expression viewer widget. 22 Class implementing the watch expression viewer widget.
23 23
24 Watch expressions will be shown with all their details. They can be modified through 24 Watch expressions will be shown with all their details. They can be
25 the context menu of this widget. 25 modified through the context menu of this widget.
26 """ 26 """
27 def __init__(self, parent=None): 27 def __init__(self, parent=None):
28 """ 28 """
29 Constructor 29 Constructor
30 30
81 self.__resizeColumns() 81 self.__resizeColumns()
82 self.__resort() 82 self.__resort()
83 83
84 def __resizeColumns(self): 84 def __resizeColumns(self):
85 """ 85 """
86 Private slot to resize the view when items get added, edited or deleted. 86 Private slot to resize the view when items get added, edited or
87 deleted.
87 """ 88 """
88 self.header().resizeSections(QHeaderView.ResizeToContents) 89 self.header().resizeSections(QHeaderView.ResizeToContents)
89 self.header().setStretchLastSection(True) 90 self.header().setStretchLastSection(True)
90 91
91 def __resort(self): 92 def __resort(self):
138 self.menu = QMenu() 139 self.menu = QMenu()
139 self.menu.addAction(self.trUtf8("Add"), self.__addWatchPoint) 140 self.menu.addAction(self.trUtf8("Add"), self.__addWatchPoint)
140 self.menu.addAction(self.trUtf8("Edit..."), self.__editWatchPoint) 141 self.menu.addAction(self.trUtf8("Edit..."), self.__editWatchPoint)
141 self.menu.addSeparator() 142 self.menu.addSeparator()
142 self.menu.addAction(self.trUtf8("Enable"), self.__enableWatchPoint) 143 self.menu.addAction(self.trUtf8("Enable"), self.__enableWatchPoint)
143 self.menu.addAction(self.trUtf8("Enable all"), self.__enableAllWatchPoints) 144 self.menu.addAction(self.trUtf8("Enable all"),
145 self.__enableAllWatchPoints)
144 self.menu.addSeparator() 146 self.menu.addSeparator()
145 self.menu.addAction(self.trUtf8("Disable"), self.__disableWatchPoint) 147 self.menu.addAction(self.trUtf8("Disable"), self.__disableWatchPoint)
146 self.menu.addAction(self.trUtf8("Disable all"), self.__disableAllWatchPoints) 148 self.menu.addAction(self.trUtf8("Disable all"),
149 self.__disableAllWatchPoints)
147 self.menu.addSeparator() 150 self.menu.addSeparator()
148 self.menu.addAction(self.trUtf8("Delete"), self.__deleteWatchPoint) 151 self.menu.addAction(self.trUtf8("Delete"), self.__deleteWatchPoint)
149 self.menu.addAction(self.trUtf8("Delete all"), self.__deleteAllWatchPoints) 152 self.menu.addAction(self.trUtf8("Delete all"),
153 self.__deleteAllWatchPoints)
150 self.menu.addSeparator() 154 self.menu.addSeparator()
151 self.menu.addAction(self.trUtf8("Configure..."), self.__configure) 155 self.menu.addAction(self.trUtf8("Configure..."), self.__configure)
152 156
153 self.backMenuActions = {} 157 self.backMenuActions = {}
154 self.backMenu = QMenu() 158 self.backMenu = QMenu()
155 self.backMenu.addAction(self.trUtf8("Add"), self.__addWatchPoint) 159 self.backMenu.addAction(self.trUtf8("Add"), self.__addWatchPoint)
156 self.backMenuActions["EnableAll"] = \ 160 self.backMenuActions["EnableAll"] = \
157 self.backMenu.addAction(self.trUtf8("Enable all"), 161 self.backMenu.addAction(self.trUtf8("Enable all"),
158 self.__enableAllWatchPoints) 162 self.__enableAllWatchPoints)
159 self.backMenuActions["DisableAll"] = \ 163 self.backMenuActions["DisableAll"] = \
160 self.backMenu.addAction(self.trUtf8("Disable all"), 164 self.backMenu.addAction(self.trUtf8("Disable all"),
161 self.__disableAllWatchPoints) 165 self.__disableAllWatchPoints)
162 self.backMenuActions["DeleteAll"] = \ 166 self.backMenuActions["DeleteAll"] = \
163 self.backMenu.addAction(self.trUtf8("Delete all"), 167 self.backMenu.addAction(self.trUtf8("Delete all"),
164 self.__deleteAllWatchPoints) 168 self.__deleteAllWatchPoints)
165 self.backMenu.addSeparator() 169 self.backMenu.addSeparator()
166 self.backMenu.addAction(self.trUtf8("Configure..."), self.__configure) 170 self.backMenu.addAction(self.trUtf8("Configure..."), self.__configure)
167 self.backMenu.aboutToShow.connect(self.__showBackMenu) 171 self.backMenu.aboutToShow.connect(self.__showBackMenu)
168 172
169 self.multiMenu = QMenu() 173 self.multiMenu = QMenu()
170 self.multiMenu.addAction(self.trUtf8("Add"), self.__addWatchPoint) 174 self.multiMenu.addAction(self.trUtf8("Add"), self.__addWatchPoint)
171 self.multiMenu.addSeparator() 175 self.multiMenu.addSeparator()
172 self.multiMenu.addAction(self.trUtf8("Enable selected"), 176 self.multiMenu.addAction(self.trUtf8("Enable selected"),
173 self.__enableSelectedWatchPoints) 177 self.__enableSelectedWatchPoints)
174 self.multiMenu.addAction(self.trUtf8("Enable all"), self.__enableAllWatchPoints) 178 self.multiMenu.addAction(self.trUtf8("Enable all"),
179 self.__enableAllWatchPoints)
175 self.multiMenu.addSeparator() 180 self.multiMenu.addSeparator()
176 self.multiMenu.addAction(self.trUtf8("Disable selected"), 181 self.multiMenu.addAction(self.trUtf8("Disable selected"),
177 self.__disableSelectedWatchPoints) 182 self.__disableSelectedWatchPoints)
178 self.multiMenu.addAction(self.trUtf8("Disable all"), self.__disableAllWatchPoints) 183 self.multiMenu.addAction(self.trUtf8("Disable all"),
184 self.__disableAllWatchPoints)
179 self.multiMenu.addSeparator() 185 self.multiMenu.addSeparator()
180 self.multiMenu.addAction(self.trUtf8("Delete selected"), 186 self.multiMenu.addAction(self.trUtf8("Delete selected"),
181 self.__deleteSelectedWatchPoints) 187 self.__deleteSelectedWatchPoints)
182 self.multiMenu.addAction(self.trUtf8("Delete all"), self.__deleteAllWatchPoints) 188 self.multiMenu.addAction(self.trUtf8("Delete all"),
189 self.__deleteAllWatchPoints)
183 self.multiMenu.addSeparator() 190 self.multiMenu.addSeparator()
184 self.multiMenu.addAction(self.trUtf8("Configure..."), self.__configure) 191 self.multiMenu.addAction(self.trUtf8("Configure..."), self.__configure)
185 192
186 def __showContextMenu(self, coord): 193 def __showContextMenu(self, coord):
187 """ 194 """
208 Private slot to clear the selection. 215 Private slot to clear the selection.
209 """ 216 """
210 for index in self.selectedIndexes(): 217 for index in self.selectedIndexes():
211 self.__setRowSelected(index, False) 218 self.__setRowSelected(index, False)
212 219
213 def __findDuplicates(self, cond, special, showMessage=False, index=QModelIndex()): 220 def __findDuplicates(self, cond, special, showMessage=False,
221 index=QModelIndex()):
214 """ 222 """
215 Private method to check, if an entry already exists. 223 Private method to check, if an entry already exists.
216 224
217 @param cond condition to check (string) 225 @param cond condition to check (string)
218 @param special special condition to check (string) 226 @param special special condition to check (string)
219 @param showMessage flag indicating a message should be shown, 227 @param showMessage flag indicating a message should be shown,
220 if a duplicate entry is found (boolean) 228 if a duplicate entry is found (boolean)
221 @param index index that should not be considered duplicate (QModelIndex) 229 @param index index that should not be considered duplicate
230 (QModelIndex)
222 @return flag indicating a duplicate entry (boolean) 231 @return flag indicating a duplicate entry (boolean)
223 """ 232 """
224 idx = self.__model.getWatchPointIndex(cond, special) 233 idx = self.__model.getWatchPointIndex(cond, special)
225 duplicate = idx.isValid() and idx.internalPointer() != index.internalPointer() 234 duplicate = idx.isValid() and \
235 idx.internalPointer() != index.internalPointer()
226 if showMessage and duplicate: 236 if showMessage and duplicate:
227 if not special: 237 if not special:
228 msg = self.trUtf8("""<p>A watch expression '<b>{0}</b>'""" 238 msg = self.trUtf8("""<p>A watch expression '<b>{0}</b>'"""
229 """ already exists.</p>""")\ 239 """ already exists.</p>""")\
230 .format(Utilities.html_encode(cond)) 240 .format(Utilities.html_encode(cond))
231 else: 241 else:
232 msg = self.trUtf8("""<p>A watch expression '<b>{0}</b>'""" 242 msg = self.trUtf8(
233 """ for the variable <b>{1}</b> already exists.</p>""")\ 243 """<p>A watch expression '<b>{0}</b>'"""
234 .format(special, Utilities.html_encode(cond)) 244 """ for the variable <b>{1}</b> already exists.</p>""")\
245 .format(special, Utilities.html_encode(cond))
235 E5MessageBox.warning(self, 246 E5MessageBox.warning(self,
236 self.trUtf8("Watch expression already exists"), 247 self.trUtf8("Watch expression already exists"),
237 msg) 248 msg)
238 249
239 return duplicate 250 return duplicate
245 from .EditWatchpointDialog import EditWatchpointDialog 256 from .EditWatchpointDialog import EditWatchpointDialog
246 dlg = EditWatchpointDialog(("", False, True, 0, ""), self) 257 dlg = EditWatchpointDialog(("", False, True, 0, ""), self)
247 if dlg.exec_() == QDialog.Accepted: 258 if dlg.exec_() == QDialog.Accepted:
248 cond, temp, enabled, ignorecount, special = dlg.getData() 259 cond, temp, enabled, ignorecount, special = dlg.getData()
249 if not self.__findDuplicates(cond, special, True): 260 if not self.__findDuplicates(cond, special, True):
250 self.__model.addWatchPoint(cond, special, (temp, enabled, ignorecount)) 261 self.__model.addWatchPoint(cond, special,
262 (temp, enabled, ignorecount))
251 self.__resizeColumns() 263 self.__resizeColumns()
252 self.__resort() 264 self.__resort()
253 265
254 def __doubleClicked(self, index): 266 def __doubleClicked(self, index):
255 """ 267 """
295 307
296 def __setWpEnabled(self, index, enabled): 308 def __setWpEnabled(self, index, enabled):
297 """ 309 """
298 Private method to set the enabled status of a watch expression. 310 Private method to set the enabled status of a watch expression.
299 311
300 @param index index of watch expression to be enabled/disabled (QModelIndex) 312 @param index index of watch expression to be enabled/disabled
313 (QModelIndex)
301 @param enabled flag indicating the enabled status to be set (boolean) 314 @param enabled flag indicating the enabled status to be set (boolean)
302 """ 315 """
303 sindex = self.__toSourceIndex(index) 316 sindex = self.__toSourceIndex(index)
304 if sindex.isValid(): 317 if sindex.isValid():
305 self.__model.setWatchPointEnabledByIndex(sindex, enabled) 318 self.__model.setWatchPointEnabledByIndex(sindex, enabled)
313 self.__resizeColumns() 326 self.__resizeColumns()
314 self.__resort() 327 self.__resort()
315 328
316 def __enableAllWatchPoints(self): 329 def __enableAllWatchPoints(self):
317 """ 330 """
318 Private slot to handle the enable all watch expressions context menu entry. 331 Private slot to handle the enable all watch expressions context menu
332 entry.
319 """ 333 """
320 index = self.model().index(0, 0) 334 index = self.model().index(0, 0)
321 while index.isValid(): 335 while index.isValid():
322 self.__setWpEnabled(index, True) 336 self.__setWpEnabled(index, True)
323 index = self.indexBelow(index) 337 index = self.indexBelow(index)
324 self.__resizeColumns() 338 self.__resizeColumns()
325 self.__resort() 339 self.__resort()
326 340
327 def __enableSelectedWatchPoints(self): 341 def __enableSelectedWatchPoints(self):
328 """ 342 """
329 Private slot to handle the enable selected watch expressions context menu entry. 343 Private slot to handle the enable selected watch expressions context
344 menu entry.
330 """ 345 """
331 for index in self.selectedIndexes(): 346 for index in self.selectedIndexes():
332 if index.column() == 0: 347 if index.column() == 0:
333 self.__setWpEnabled(index, True) 348 self.__setWpEnabled(index, True)
334 self.__resizeColumns() 349 self.__resizeColumns()
343 self.__resizeColumns() 358 self.__resizeColumns()
344 self.__resort() 359 self.__resort()
345 360
346 def __disableAllWatchPoints(self): 361 def __disableAllWatchPoints(self):
347 """ 362 """
348 Private slot to handle the disable all watch expressions context menu entry. 363 Private slot to handle the disable all watch expressions context menu
364 entry.
349 """ 365 """
350 index = self.model().index(0, 0) 366 index = self.model().index(0, 0)
351 while index.isValid(): 367 while index.isValid():
352 self.__setWpEnabled(index, False) 368 self.__setWpEnabled(index, False)
353 index = self.indexBelow(index) 369 index = self.indexBelow(index)
354 self.__resizeColumns() 370 self.__resizeColumns()
355 self.__resort() 371 self.__resort()
356 372
357 def __disableSelectedWatchPoints(self): 373 def __disableSelectedWatchPoints(self):
358 """ 374 """
359 Private slot to handle the disable selected watch expressions context menu entry. 375 Private slot to handle the disable selected watch expressions context
376 menu entry.
360 """ 377 """
361 for index in self.selectedIndexes(): 378 for index in self.selectedIndexes():
362 if index.column() == 0: 379 if index.column() == 0:
363 self.__setWpEnabled(index, False) 380 self.__setWpEnabled(index, False)
364 self.__resizeColumns() 381 self.__resizeColumns()
373 if sindex.isValid(): 390 if sindex.isValid():
374 self.__model.deleteWatchPointByIndex(sindex) 391 self.__model.deleteWatchPointByIndex(sindex)
375 392
376 def __deleteAllWatchPoints(self): 393 def __deleteAllWatchPoints(self):
377 """ 394 """
378 Private slot to handle the delete all watch expressions context menu entry. 395 Private slot to handle the delete all watch expressions context menu
396 entry.
379 """ 397 """
380 self.__model.deleteAll() 398 self.__model.deleteAll()
381 399
382 def __deleteSelectedWatchPoints(self): 400 def __deleteSelectedWatchPoints(self):
383 """ 401 """
384 Private slot to handle the delete selected watch expressions context menu entry. 402 Private slot to handle the delete selected watch expressions context
403 menu entry.
385 """ 404 """
386 idxList = [] 405 idxList = []
387 for index in self.selectedIndexes(): 406 for index in self.selectedIndexes():
388 sindex = self.__toSourceIndex(index) 407 sindex = self.__toSourceIndex(index)
389 if sindex.isValid() and index.column() == 0: 408 if sindex.isValid() and index.column() == 0:
415 434
416 def __configure(self): 435 def __configure(self):
417 """ 436 """
418 Private method to open the configuration dialog. 437 Private method to open the configuration dialog.
419 """ 438 """
420 e5App().getObject("UserInterface").showPreferences("debuggerGeneralPage") 439 e5App().getObject("UserInterface")\
440 .showPreferences("debuggerGeneralPage")

eric ide

mercurial