Fixed the breakpoint performance issue properly.

Mon, 02 Jul 2012 19:55:18 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 02 Jul 2012 19:55:18 +0200
changeset 1928
adde55ed4ce5
parent 1927
a0959cd5f923
child 1929
b41f87fbd145

Fixed the breakpoint performance issue properly.

Debugger/BreakPointModel.py file | annotate | diff | comparison | revisions
Debugger/BreakPointViewer.py file | annotate | diff | comparison | revisions
Debugger/WatchPointViewer.py file | annotate | diff | comparison | revisions
QScintilla/Editor.py file | annotate | diff | comparison | revisions
--- 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):
         """

eric ide

mercurial