QScintilla/Editor.py

changeset 1928
adde55ed4ce5
parent 1897
4c89af5a756f
child 1930
3ecd42f536fd
--- 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