--- a/src/eric7/Debugger/WatchPointViewer.py Wed Jul 13 11:16:20 2022 +0200 +++ b/src/eric7/Debugger/WatchPointViewer.py Wed Jul 13 14:55:47 2022 +0200 @@ -7,12 +7,8 @@ Module implementing the watch expression viewer widget. """ -from PyQt6.QtCore import ( - Qt, QModelIndex, QItemSelectionModel, QSortFilterProxyModel -) -from PyQt6.QtWidgets import ( - QTreeView, QAbstractItemView, QMenu, QHeaderView, QDialog -) +from PyQt6.QtCore import Qt, QModelIndex, QItemSelectionModel, QSortFilterProxyModel +from PyQt6.QtWidgets import QTreeView, QAbstractItemView, QMenu, QHeaderView, QDialog from EricWidgets.EricApplication import ericApp from EricWidgets import EricMessageBox @@ -23,66 +19,65 @@ class WatchPointViewer(QTreeView): """ Class implementing the watch expression viewer widget. - + Watch expressions will be shown with all their details. They can be modified through the context menu of this widget. """ + def __init__(self, parent=None): """ Constructor - + @param parent the parent (QWidget) """ super().__init__(parent) self.setObjectName("WatchExpressionViewer") - + self.__model = None - + self.setItemsExpandable(False) self.setRootIsDecorated(False) self.setAlternatingRowColors(True) - self.setSelectionMode( - QAbstractItemView.SelectionMode.ExtendedSelection) - self.setSelectionBehavior( - QAbstractItemView.SelectionBehavior.SelectRows) - + self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) + self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) + self.setWindowTitle(self.tr("Watchpoints")) - + self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.customContextMenuRequested.connect(self.__showContextMenu) self.doubleClicked.connect(self.__doubleClicked) - + self.__createPopupMenus() - + def setModel(self, model): """ Public slot to set the watch expression model. - + @param model reference to the watch expression model (WatchPointModel) """ self.__model = model - + self.sortingModel = QSortFilterProxyModel() self.sortingModel.setDynamicSortFilter(True) self.sortingModel.setSourceModel(self.__model) super().setModel(self.sortingModel) - + header = self.header() header.setSortIndicator(0, Qt.SortOrder.AscendingOrder) header.setSortIndicatorShown(True) header.setSectionsClickable(True) - + self.setSortingEnabled(True) - + self.__layoutDisplay() - + def __layoutDisplay(self): """ Private slot to perform a layout operation. """ self.__resizeColumns() self.__resort() - + def __resizeColumns(self): """ Private slot to resize the view when items get added, edited or @@ -90,51 +85,56 @@ """ self.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents) self.header().setStretchLastSection(True) - + def __resort(self): """ Private slot to resort the tree. """ - self.model().sort(self.header().sortIndicatorSection(), - self.header().sortIndicatorOrder()) - + self.model().sort( + self.header().sortIndicatorSection(), self.header().sortIndicatorOrder() + ) + def __toSourceIndex(self, index): """ Private slot to convert an index to a source index. - + @param index index to be converted (QModelIndex) @return mapped index (QModelIndex) """ return self.sortingModel.mapToSource(index) - + def __fromSourceIndex(self, sindex): """ Private slot to convert a source index to an index. - + @param sindex source index to be converted (QModelIndex) @return mapped index (QModelIndex) """ return self.sortingModel.mapFromSource(sindex) - + def __setRowSelected(self, index, selected=True): """ Private slot to select a complete row. - + @param index index determining the row to be selected (QModelIndex) @param selected flag indicating the action (bool) """ if not index.isValid(): return - + flags = ( - (QItemSelectionModel.SelectionFlag.ClearAndSelect | - QItemSelectionModel.SelectionFlag.Rows) - if selected else - (QItemSelectionModel.SelectionFlag.Deselect | - QItemSelectionModel.SelectionFlag.Rows) + ( + QItemSelectionModel.SelectionFlag.ClearAndSelect + | QItemSelectionModel.SelectionFlag.Rows + ) + if selected + else ( + QItemSelectionModel.SelectionFlag.Deselect + | QItemSelectionModel.SelectionFlag.Rows + ) ) self.selectionModel().select(index, flags) - + def __createPopupMenus(self): """ Private method to generate the popup menus. @@ -144,16 +144,13 @@ self.menu.addAction(self.tr("Edit..."), self.__editWatchPoint) self.menu.addSeparator() self.menu.addAction(self.tr("Enable"), self.__enableWatchPoint) - self.menu.addAction(self.tr("Enable all"), - self.__enableAllWatchPoints) + self.menu.addAction(self.tr("Enable all"), self.__enableAllWatchPoints) self.menu.addSeparator() self.menu.addAction(self.tr("Disable"), self.__disableWatchPoint) - self.menu.addAction(self.tr("Disable all"), - self.__disableAllWatchPoints) + self.menu.addAction(self.tr("Disable all"), self.__disableAllWatchPoints) self.menu.addSeparator() self.menu.addAction(self.tr("Delete"), self.__deleteWatchPoint) - self.menu.addAction(self.tr("Delete all"), - self.__deleteAllWatchPoints) + self.menu.addAction(self.tr("Delete all"), self.__deleteAllWatchPoints) self.menu.addSeparator() self.menu.addAction(self.tr("Configure..."), self.__configure) @@ -161,14 +158,14 @@ self.backMenu = QMenu() self.backMenu.addAction(self.tr("Add"), self.__addWatchPoint) self.backMenuActions["EnableAll"] = self.backMenu.addAction( - self.tr("Enable all"), - self.__enableAllWatchPoints) + self.tr("Enable all"), self.__enableAllWatchPoints + ) self.backMenuActions["DisableAll"] = self.backMenu.addAction( - self.tr("Disable all"), - self.__disableAllWatchPoints) + self.tr("Disable all"), self.__disableAllWatchPoints + ) self.backMenuActions["DeleteAll"] = self.backMenu.addAction( - self.tr("Delete all"), - self.__deleteAllWatchPoints) + self.tr("Delete all"), self.__deleteAllWatchPoints + ) self.backMenu.addSeparator() self.backMenu.addAction(self.tr("Configure..."), self.__configure) self.backMenu.aboutToShow.connect(self.__showBackMenu) @@ -176,27 +173,27 @@ self.multiMenu = QMenu() self.multiMenu.addAction(self.tr("Add"), self.__addWatchPoint) self.multiMenu.addSeparator() - self.multiMenu.addAction(self.tr("Enable selected"), - self.__enableSelectedWatchPoints) - self.multiMenu.addAction(self.tr("Enable all"), - self.__enableAllWatchPoints) + self.multiMenu.addAction( + self.tr("Enable selected"), self.__enableSelectedWatchPoints + ) + self.multiMenu.addAction(self.tr("Enable all"), self.__enableAllWatchPoints) self.multiMenu.addSeparator() - self.multiMenu.addAction(self.tr("Disable selected"), - self.__disableSelectedWatchPoints) - self.multiMenu.addAction(self.tr("Disable all"), - self.__disableAllWatchPoints) + self.multiMenu.addAction( + self.tr("Disable selected"), self.__disableSelectedWatchPoints + ) + self.multiMenu.addAction(self.tr("Disable all"), self.__disableAllWatchPoints) self.multiMenu.addSeparator() - self.multiMenu.addAction(self.tr("Delete selected"), - self.__deleteSelectedWatchPoints) - self.multiMenu.addAction(self.tr("Delete all"), - self.__deleteAllWatchPoints) + self.multiMenu.addAction( + self.tr("Delete selected"), self.__deleteSelectedWatchPoints + ) + self.multiMenu.addAction(self.tr("Delete all"), self.__deleteAllWatchPoints) self.multiMenu.addSeparator() self.multiMenu.addAction(self.tr("Configure..."), self.__configure) - + def __showContextMenu(self, coord): """ Private slot to show the context menu. - + @param coord the position of the mouse pointer (QPoint) """ cnt = self.__getSelectedItemsCount() @@ -212,19 +209,18 @@ self.menu.popup(coord) else: self.backMenu.popup(coord) - + def __clearSelection(self): """ Private slot to clear the selection. """ for index in self.selectedIndexes(): self.__setRowSelected(index, False) - - def __findDuplicates(self, cond, special, showMessage=False, - index=None): + + def __findDuplicates(self, cond, special, showMessage=False, index=None): """ Private method to check, if an entry already exists. - + @param cond condition to check (string) @param special special condition to check (string) @param showMessage flag indicating a message should be shown, @@ -236,13 +232,11 @@ if index is None: index = QModelIndex() idx = self.__model.getWatchPointIndex(cond, special) - duplicate = (idx.isValid() and - idx.internalPointer() != index.internalPointer()) + duplicate = idx.isValid() and idx.internalPointer() != index.internalPointer() if showMessage and duplicate: if not special: msg = self.tr( - """<p>A watch expression '<b>{0}</b>'""" - """ already exists.</p>""" + """<p>A watch expression '<b>{0}</b>'""" """ already exists.</p>""" ).format(Utilities.html_encode(cond)) else: msg = self.tr( @@ -250,30 +244,29 @@ """ for the variable <b>{1}</b> already exists.</p>""" ).format(special, Utilities.html_encode(cond)) EricMessageBox.warning( - self, - self.tr("Watch expression already exists"), - msg) - + self, self.tr("Watch expression already exists"), msg + ) + return duplicate - + def __addWatchPoint(self): """ Private slot to handle the add watch expression context menu entry. """ from .EditWatchpointDialog import EditWatchpointDialog + dlg = EditWatchpointDialog(("", False, True, 0, ""), self) if dlg.exec() == QDialog.DialogCode.Accepted: cond, temp, enabled, ignorecount, special = dlg.getData() if not self.__findDuplicates(cond, special, True): - self.__model.addWatchPoint(cond, special, - (temp, enabled, ignorecount)) + self.__model.addWatchPoint(cond, special, (temp, enabled, ignorecount)) self.__resizeColumns() self.__resort() def __doubleClicked(self, index): """ Private slot to handle the double clicked signal. - + @param index index of the entry that was double clicked (QModelIndex) """ if index.isValid(): @@ -286,11 +279,11 @@ index = self.currentIndex() if index.isValid(): self.__doEditWatchPoint(index) - + def __doEditWatchPoint(self, index): """ Private slot to edit a watch expression. - + @param index index of watch expression to be edited (QModelIndex) """ sindex = self.__toSourceIndex(index) @@ -298,24 +291,25 @@ wp = self.__model.getWatchPointByIndex(sindex) if not wp: return - + cond, special, temp, enabled, count = wp[:5] - + from .EditWatchpointDialog import EditWatchpointDialog - dlg = EditWatchpointDialog( - (cond, temp, enabled, count, special), self) + + dlg = EditWatchpointDialog((cond, temp, enabled, count, special), self) if dlg.exec() == QDialog.DialogCode.Accepted: cond, temp, enabled, count, special = dlg.getData() if not self.__findDuplicates(cond, special, True, sindex): self.__model.setWatchPointByIndex( - sindex, cond, special, (temp, enabled, count)) + sindex, cond, special, (temp, enabled, count) + ) self.__resizeColumns() self.__resort() def __setWpEnabled(self, index, enabled): """ Private method to set the enabled status of a watch expression. - + @param index index of watch expression to be enabled/disabled (QModelIndex) @param enabled flag indicating the enabled status to be set (boolean) @@ -323,7 +317,7 @@ sindex = self.__toSourceIndex(index) if sindex.isValid(): self.__model.setWatchPointEnabledByIndex(sindex, enabled) - + def __enableWatchPoint(self): """ Private slot to handle the enable watch expression context menu entry. @@ -396,7 +390,7 @@ sindex = self.__toSourceIndex(index) if sindex.isValid(): self.__model.deleteWatchPointByIndex(sindex) - + def __deleteAllWatchPoints(self): """ Private slot to handle the delete all watch expressions context menu @@ -432,16 +426,15 @@ def __getSelectedItemsCount(self): """ Private method to get the count of items selected. - + @return count of items selected (integer) """ count = len(self.selectedIndexes()) // (self.__model.columnCount() - 1) # column count is 1 greater than selectable return count - + def __configure(self): """ Private method to open the configuration dialog. """ - ericApp().getObject("UserInterface").showPreferences( - "debuggerGeneralPage") + ericApp().getObject("UserInterface").showPreferences("debuggerGeneralPage")