QScintilla/EditorAssembly.py

changeset 2768
eab35f6e709f
parent 2409
df3820f08247
child 2791
a9577f248f04
child 3011
18292228c724
--- a/QScintilla/EditorAssembly.py	Wed Jul 03 19:23:52 2013 +0200
+++ b/QScintilla/EditorAssembly.py	Wed Jul 03 19:34:42 2013 +0200
@@ -50,6 +50,7 @@
         
         self.__globalsCombo.activated[int].connect(self.__globalsActivated)
         self.__membersCombo.activated[int].connect(self.__membersActivated)
+        self.__editor.cursorLineChanged.connect(self.__editorCursorLineChanged)
         
         self.__parseTimer = QTimer(self)
         self.__parseTimer.setSingleShot(True)
@@ -60,6 +61,8 @@
         
         self.__selectedGlobal = ""
         self.__selectedMember = ""
+        self.__globalsBoundaries = {}
+        self.__membersBoundaries = {}
         
         QTimer.singleShot(0, self.__parseEditor)
     
@@ -99,6 +102,9 @@
             
             # step 2: populate the members combo, if the entry is a class
             self.__membersCombo.clear()
+            self.__membersBoundaries = {}
+            self.__membersCombo.addItem("")
+            memberIndex = 0
             entryName = self.__globalsCombo.itemText(index)
             if self.__module:
                 if entryName in self.__module.classes:
@@ -114,10 +120,12 @@
                             icon = UI.PixmapCache.getIcon("class_protected.png")
                         else:
                             icon = UI.PixmapCache.getIcon("class.png")
-                        items[cl.name] = (icon, cl.lineno)
+                        items[cl.name] = (icon, cl.lineno, cl.endlineno)
                     for key in sorted(items.keys()):
                         itm = items[key]
                         self.__membersCombo.addItem(itm[0], key, itm[1])
+                        memberIndex += 1
+                        self.__membersBoundaries[(itm[1], itm[2])] = memberIndex
                 else:
                     return
                 
@@ -135,10 +143,12 @@
                         icon = UI.PixmapCache.getIcon("method_protected.png")
                     else:
                         icon = UI.PixmapCache.getIcon("method.png")
-                    items[meth.name] = (icon, meth.lineno)
+                    items[meth.name] = (icon, meth.lineno, meth.endlineno)
                 for key in sorted(items.keys()):
                     itm = items[key]
                     self.__membersCombo.addItem(itm[0], key, itm[1])
+                    memberIndex += 1
+                    self.__membersBoundaries[(itm[1], itm[2])] = memberIndex
                 
                 # step 2.2: add class instance attributes
                 items = {}
@@ -207,17 +217,22 @@
                 
                 self.__globalsCombo.clear()
                 self.__membersCombo.clear()
+                self.__globalsBoundaries = {}
+                self.__membersBoundaries = {}
                 
                 self.__globalsCombo.addItem("")
+                index = 0
                 
                 # step 1: add modules
                 items = {}
                 for module in self.__module.modules.values():
                     items[module.name] = (UI.PixmapCache.getIcon("module.png"),
-                                          module.lineno)
+                                          module.lineno, module.endlineno)
                 for key in sorted(items.keys()):
                     itm = items[key]
                     self.__globalsCombo.addItem(itm[0], key, itm[1])
+                    index += 1
+                    self.__globalsBoundaries[(itm[1], itm[2])] = index
                 
                 # step 2: add classes
                 items = {}
@@ -228,10 +243,12 @@
                         icon = UI.PixmapCache.getIcon("class_protected.png")
                     else:
                         icon = UI.PixmapCache.getIcon("class.png")
-                    items[cl.name] = (icon, cl.lineno)
+                    items[cl.name] = (icon, cl.lineno, cl.endlineno)
                 for key in sorted(items.keys()):
                     itm = items[key]
                     self.__globalsCombo.addItem(itm[0], key, itm[1])
+                    index += 1
+                    self.__globalsBoundaries[(itm[1], itm[2])] = index
                 
                 # step 3: add functions
                 items = {}
@@ -242,10 +259,12 @@
                         icon = UI.PixmapCache.getIcon("method_protected.png")
                     else:
                         icon = UI.PixmapCache.getIcon("method.png")
-                    items[func.name] = (icon, func.lineno)
+                    items[func.name] = (icon, func.lineno, func.endlineno)
                 for key in sorted(items.keys()):
                     itm = items[key]
                     self.__globalsCombo.addItem(itm[0], key, itm[1])
+                    index += 1
+                    self.__globalsBoundaries[(itm[1], itm[2])] = index
                 
                 # step 4: add attributes
                 items = {}
@@ -270,3 +289,33 @@
                 if index != -1:
                     self.__membersCombo.setCurrentIndex(index)
                     self.__membersActivated(index, moveCursor=False)
+    
+    def __editorCursorLineChanged(self, lineno):
+        """
+        Private slot handling a line change of the cursor of the editor.
+        
+        @param lineno line number of the cursor (integer)
+        """
+        lineno += 1     # cursor position is zero based, code info one based
+        
+        # step 1: search in the globals
+        for (lower, upper), index in self.__globalsBoundaries.items():
+            if upper == -1:
+                upper = 1000000     # it is the last line
+            if lower <= lineno <= upper:
+                break
+        else:
+            index = 0
+        self.__globalsCombo.setCurrentIndex(index)
+        self.__globalsActivated(index, moveCursor=False)
+        
+        # step 2: search in members
+        for (lower, upper), index in self.__membersBoundaries.items():
+            if upper == -1:
+                upper = 1000000     # it is the last line
+            if lower <= lineno <= upper:
+                break
+        else:
+            index = 0
+        self.__membersCombo.setCurrentIndex(index)
+        self.__membersActivated(index, moveCursor=False)

eric ide

mercurial