Mon, 02 Jul 2012 19:55:18 +0200
Fixed the breakpoint performance issue properly.
--- a/Debugger/BreakPointModel.py Sun Jul 01 19:25:40 2012 +0200 +++ b/Debugger/BreakPointModel.py Mon Jul 02 19:55:18 2012 +0200 @@ -62,7 +62,7 @@ else: return 0 - def data(self, index, role): + def data(self, index, role=Qt.DisplayRole): """ Public method to get the requested data. @@ -91,6 +91,25 @@ return None + def setData(self, index, value, role=Qt.EditRole): + """ + Public method to change data in the model. + + @param index index of the changed data (QModelIndex) + @param value value of the changed data + @param role role of the changed data (Qt.ItemDataRole) + @return flag indicating success (boolean) + """ + if not index.isValid() or \ + index.column() >= len(self.header) or \ + index.row() >= len(self.breakpoints): + return False + + self.dataAboutToBeChanged.emit(index, index) + self.breakpoints[index.row()][index.column()] = value + self.dataChanged.emit(index, index) + return True + def flags(self, index): """ Public method to get item flags.
--- a/Debugger/BreakPointViewer.py Sun Jul 01 19:25:40 2012 +0200 +++ b/Debugger/BreakPointViewer.py Mon Jul 02 19:55:18 2012 +0200 @@ -64,20 +64,18 @@ """ self.__model = model - # TODO: Remove these comments once proven ok in daily use -## self.sortingModel = QSortFilterProxyModel() -## self.sortingModel.setDynamicSortFilter(True) -## self.sortingModel.setSourceModel(self.__model) -## super().setModel(self.sortingModel) - super().setModel(self.__model) + self.sortingModel = QSortFilterProxyModel() + self.sortingModel.setDynamicSortFilter(True) + self.sortingModel.setSourceModel(self.__model) + super().setModel(self.sortingModel) -## header = self.header() -## header.setSortIndicator(0, Qt.AscendingOrder) -## header.setSortIndicatorShown(True) -## header.setClickable(True) -## -## self.setSortingEnabled(True) -## + header = self.header() + header.setSortIndicator(0, Qt.AscendingOrder) + header.setSortIndicatorShown(True) + header.setClickable(True) + + self.setSortingEnabled(True) + self.__layoutDisplay() def __layoutDisplay(self): @@ -107,8 +105,7 @@ @param index index to be converted (QModelIndex) """ -## return self.sortingModel.mapToSource(index) - return index + return self.sortingModel.mapToSource(index) def __fromSourceIndex(self, sindex): """ @@ -116,8 +113,7 @@ @param sindex source index to be converted (QModelIndex) """ -## return self.sortingModel.mapFromSource(sindex) - return sindex + return self.sortingModel.mapFromSource(sindex) def __setRowSelected(self, index, selected=True): """
--- a/Debugger/WatchPointViewer.py Sun Jul 01 19:25:40 2012 +0200 +++ b/Debugger/WatchPointViewer.py Mon Jul 02 19:55:18 2012 +0200 @@ -60,18 +60,18 @@ self.__model = model # TODO: Remove these comments once proven ok in daily use -## self.sortingModel = QSortFilterProxyModel() -## self.sortingModel.setSourceModel(self.__model) -## super().setModel(self.sortingModel) - super().setModel(self.__model) + self.sortingModel = QSortFilterProxyModel() + self.sortingModel.setDynamicSortFilter(True) + self.sortingModel.setSourceModel(self.__model) + super().setModel(self.sortingModel) -## header = self.header() -## header.setSortIndicator(0, Qt.AscendingOrder) -## header.setSortIndicatorShown(True) -## header.setClickable(True) -## -## self.setSortingEnabled(True) -## + header = self.header() + header.setSortIndicator(0, Qt.AscendingOrder) + header.setSortIndicatorShown(True) + header.setClickable(True) + + self.setSortingEnabled(True) + self.__layoutDisplay() def __layoutDisplay(self): @@ -101,8 +101,7 @@ @param index index to be converted (QModelIndex) """ -## return self.sortingModel.mapToSource(index) - return index + return self.sortingModel.mapToSource(index) def __fromSourceIndex(self, sindex): """ @@ -110,8 +109,7 @@ @param sindex source index to be converted (QModelIndex) """ -## return self.sortingModel.mapFromSource(sindex) - return sindex + return self.sortingModel.mapFromSource(sindex) def __setRowSelected(self, index, selected=True): """
--- a/QScintilla/Editor.py Sun Jul 01 19:25:40 2012 +0200 +++ b/QScintilla/Editor.py Mon Jul 02 19:55:18 2012 +0200 @@ -399,7 +399,7 @@ self.__changeBreakPoints) self.breakpointModel.rowsInserted.connect( self.__addBreakPoints) - self.linesChanged.connect(self.__linesChanged) + self.SCN_MODIFIED.connect(self.__modified) # establish connection to some ViewManager action groups self.addActions(self.vm.editorActGrp.actions()) @@ -1804,26 +1804,37 @@ ## Breakpoint handling methods below ############################################################################ - def __linesChanged(self): - """ - Private method to track text changes. - - This method checks, if lines have been inserted or removed in order to - update the breakpoints. - """ - if self.breaks: - bps = [] # list of breakpoints - for handle, (ln, cond, temp, enabled, ignorecount) in self.breaks.items(): - line = self.markerLine(handle) + 1 - bps.append((ln, line, (cond, temp, enabled, ignorecount))) - self.markerDeleteHandle(handle) - self.breaks = {} - self.inLinesChanged = True - for bp in bps: - index = self.breakpointModel.getBreakPointIndex(self.fileName, bp[0]) - self.breakpointModel.setBreakPointByIndex(index, - self.fileName, bp[1], bp[2]) - self.inLinesChanged = False + def __modified(self, pos, mtype, text, length, linesAdded, line, foldNow, foldPrev, + token, annotationLinesAdded): + """ + Private method to handle changes of the number of lines. + + @param pos start position of change (integer) + @param mtype flags identifying the change (integer) + @param text text that is given to the Undo system (string) + @param length length of the change (integer) + @param linesAdded number of added/deleted lines (integer) + @param line line number of a fold level or marker change (integer) + @param foldNow new fold level (integer) + @param foldPrev previous fold level (integer) + @param token ??? + @param annotationLinesAdded number of added/deleted annotation lines (integer) + """ + if mtype & (self.SC_MOD_INSERTTEXT | self.SC_MOD_DELETETEXT) and \ + linesAdded != 0: + if self.breaks: + bps = [] # list of breakpoints + for handle, (ln, cond, temp, enabled, ignorecount) in self.breaks.items(): + line = self.markerLine(handle) + 1 + if ln != line: + bps.append((ln, line)) + self.breaks[handle] = (line, cond, temp, enabled, ignorecount) + self.inLinesChanged = True + for ln, line in sorted(bps, reverse=linesAdded > 0): + index1 = self.breakpointModel.getBreakPointIndex(self.fileName, ln) + index2 = self.breakpointModel.index(index1.row(), 1) + self.breakpointModel.setData(index2, line) + self.inLinesChanged = False def __restoreBreakpoints(self): """ @@ -1853,7 +1864,8 @@ @param indexes indexes of changed breakpoints. """ - self.__addBreakPoints(QModelIndex(), startIndex.row(), endIndex.row()) + if not self.inLinesChanged: + self.__addBreakPoints(QModelIndex(), startIndex.row(), endIndex.row()) def __breakPointDataAboutToBeChanged(self, startIndex, endIndex): """