[Bf-extensions-cvs] [e88b7dfc] master: Class Viewer: Improve the handling of comments, cleanup

lijenstina noreply at git.blender.org
Thu Dec 14 16:13:43 CET 2017


Commit: e88b7dfc3bd68888be2d05437cf50e93e41ef47b
Author: lijenstina
Date:   Thu Dec 14 16:12:54 2017 +0100
Branches: master
https://developer.blender.org/rBACe88b7dfc3bd68888be2d05437cf50e93e41ef47b

Class Viewer: Improve the handling of comments, cleanup

Bumped version to 0.1.3
Pep 8 cleanup
Refactor menu code
Remove unused menu property
Use a BaseCheckPoll class for inheritance

Better support for comments:
- support inline comments
- trim the menu entries length to 60 characters
- skip the GPL block from the entries parsing

Some small UI changes

===================================================================

M	development_class_viewer.py

===================================================================

diff --git a/development_class_viewer.py b/development_class_viewer.py
index c4083b86..0bc338b8 100644
--- a/development_class_viewer.py
+++ b/development_class_viewer.py
@@ -19,7 +19,7 @@
 bl_info = {
     "name": "Class Viewer",
     "author": "Mackraken", "batFinger"
-    "version": (0, 1, 2),
+    "version": (0, 1, 3),
     "blender": (2, 58, 0),
     "location": "Text Editor > Toolbar, Text Editor > Right Click",
     "warning": "",
@@ -28,168 +28,176 @@ bl_info = {
     "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
     "category": "Development"}
 
+
 import bpy
+from bpy.types import (
+        Operator,
+        Menu,
+        )
+from bpy.props import IntProperty
+
+# lists all defs, comment or classes
+# space = current text editor
+# sort = sort result
+# tipo = kind of struct to look for
+# escape = character right next to the class or def name
+# note: GPL license block is skipped from the comment entries now
+
+
+def getfunc(space, sort, tipo="def ", escape=""):
+    defs, license_clean, return_lists = [], [], []
+
+    if space.type == "TEXT_EDITOR" and space.text is not None:
+        txt = space.text
+        line_block_start, line_block_end = None, None
+
+        for i, l in enumerate(txt.lines):
+            try:
+                line = l.body
+            except:
+                line = ""
+            if tipo == "# ":
+                linex, line_c = "", ""
+                if tipo in line:
+                    # find the license block
+                    block_start = line.find("BEGIN GPL LICENSE BLOCK")
+                    if block_start != -1:
+                        line_block_start = i + 1
+
+                    block_end = line.find("END GPL LICENSE BLOCK")
+                    if block_end != -1:
+                        line_block_end = i + 1
 
-#lists all defs, comment or classes
-#space = current text editor
-#sort = sort result
-#tipo = kind of struct to look for
-#escape = character right next to the class or def name 
-
-def getfunc(space, sort, tipo="def ", escape= ""):
-    defs = []
-    if space.type=="TEXT_EDITOR":
-        if space.text!=None:
-            txt = space.text
-            
-            for i, l in enumerate(txt.lines):
-                try:
-                    line = l.body
-                except:
-                    line=""
-                
-                if line[0:len(tipo)]==tipo:
                     end = line.find(escape)
-                    if end==0:
-                        func = line[len(tipo)::]
+                    # use line partition, get the last tuple element as it is the comment
+                    line_c = line.partition("#")[2]
+                    # strip the spaces from the left if any and
+                    # cut the comment at the 60 characters length max
+                    linex = line_c[:60].lstrip() if len(line_c) > 60 else line_c.lstrip()
+                    if end == 0:
+                        func = linex
                     else:
-                        func = line[len(tipo):end]
-                    defs.append([func, i+1])
-            
-            if sort: defs.sort()
-    
-    return defs
-
-class TEXT_OT_Jumptoline(bpy.types.Operator):
-    bl_label = "Jump"
-    bl_idname = "text.jumptoline"
-    __doc__ = "Jump to line"
-    line = bpy.props.IntProperty(default=-1)
-    
+                        func = linex.rstrip(escape)
+
+                    defs.append([func, i + 1])
+
+            elif line[0: len(tipo)] == tipo:
+                end = line.find(escape)
+                if end == 0:
+                    func = line[len(tipo)::]
+                else:
+                    func = line[len(tipo):end]
+                defs.append([func, i + 1])
+
+        if line_block_start and line_block_end:
+            # note : the slice should keep the first line of the license block
+            license_clean = defs[line_block_start: line_block_end]
+
+        return_lists = [line for line in defs if line not in license_clean] if license_clean else defs
+        if sort:
+            return_lists.sort()
+
+    return return_lists
+
+
+def draw_menus(layout, space, tipo, escape):
+
+    items = getfunc(space, 1, tipo, escape)
+    if not items:
+        layout.label(text="Not found", icon="INFO")
+        return
+
+    for it in items:
+        layout.operator("text.jumptoline", text="{}".format(it[0])).line = it[1]
+
+
+class BaseCheckPoll():
     @classmethod
     def poll(cls, context):
-        if context.area.spaces[0].type!="TEXT_EDITOR":
+        if context.area.spaces[0].type != "TEXT_EDITOR":
             return False
-        else: 
-            return context.area.spaces[0].text!=None
-    
+        else:
+            return context.area.spaces[0].text is not None
+
+
+class TEXT_OT_Jumptoline(Operator, BaseCheckPoll):
+    bl_label = "Jump"
+    bl_idname = "text.jumptoline"
+    bl_description = "Jump to line containing the text"
+    __doc__ = "Jump to line containing the passed line integer. Used by the Class Viewer add-on"
+
+    line = IntProperty(default=-1)
+
     def execute(self, context):
-        
-        scn = context.scene
+        if self.line == -1:
+            self.report({'WARNING'}, "No valid line found. Operation Cancelled")
+            return {'CANCELLED'}
 
-        if self.line!=-1:
-            bpy.ops.text.jump(line=self.line)
+        bpy.ops.text.jump(line=self.line)
+        self.report({'INFO'}, "Jump to line: {}".format(self.line))
 
         return {'FINISHED'}
 
 
-
-class CommentsMenu(bpy.types.Menu):
+class CommentsMenu(Menu, BaseCheckPoll):
     bl_idname = "OBJECT_MT_select_comments"
-    bl_label = "Select"
-    
-    
-    
-    @classmethod
-    def poll(cls, context):
-        if context.area.spaces[0].type!="TEXT_EDITOR":
-            return False
-        else: 
-            return context.area.spaces[0].text!=None
-        
+    bl_label = "Comments"
+
     def draw(self, context):
-    
         layout = self.layout
         space = context.area.spaces[0]
-        
-        items = getfunc(space, 1, "### ", "")
-        
-        for it in items:
-            layout.operator("text.jumptoline",text=it[0]).line = it[1]
+        draw_menus(layout, space, "# ", "\n")
+
 
-class DefsMenu(bpy.types.Menu):
+class DefsMenu(Menu, BaseCheckPoll):
     bl_idname = "OBJECT_MT_select_defs"
-    bl_label = "Select"
-    
-    tipo = bpy.props.BoolProperty(default=False)
-    
-    @classmethod
-    def poll(cls, context):
-        if context.area.spaces[0].type!="TEXT_EDITOR":
-            return False
-        else: 
-            return context.area.spaces[0].text!=None
-        
+    bl_label = "Definitions"
+
     def draw(self, context):
-        scn = context.scene
         layout = self.layout
         space = context.area.spaces[0]
-        tipo = self.tipo
-        
-        
-        items = getfunc(space, 1, "def ", "(")
-        
-        for it in items:
-            layout.operator("text.jumptoline",text=it[0]).line = it[1]
-                
-class ClassesMenu(bpy.types.Menu):
+        draw_menus(layout, space, "def ", "(")
+
+
+class ClassesMenu(Menu, BaseCheckPoll):
     bl_idname = "OBJECT_MT_select_classes"
-    bl_label = "Select"
-    
-    
-    
-    @classmethod
-    def poll(cls, context):
-        if context.area.spaces[0].type!="TEXT_EDITOR":
-            return False
-        else: 
-            return context.area.spaces[0].text!=None
-        
+    bl_label = "Classes"
+
     def draw(self, context):
-    
         layout = self.layout
         space = context.area.spaces[0]
-    
-        
-        
-        items = getfunc(space, 1, "class ", "(")
-        
-        for it in items:
-            layout.operator("text.jumptoline",text=it[0]).line = it[1]
-
+        draw_menus(layout, space, "class ", "(")
 
-            
-def GotoComments(self, context): 
-    self.layout.menu("OBJECT_MT_select_comments", text="Comments", icon='PLUGIN')
-    return False
 
-def GotoDefs(self, context): 
-    self.layout.menu("OBJECT_MT_select_defs", text="Defs", icon='PLUGIN')
-    return False
+def menu_development_class_view(self, context):
+    self.layout.separator()
 
-def GotoClasses(self, context): 
-    self.layout.menu("OBJECT_MT_select_classes", text="Classes", icon='PLUGIN')
-    return False
+    self.layout.menu("OBJECT_MT_select_comments", icon='SHORTDISPLAY')
+    self.layout.menu("OBJECT_MT_select_defs", icon='FILE_TEXT')
+    self.layout.menu("OBJECT_MT_select_classes", icon='SCRIPTPLUGINS')
 
 
-classes = [TEXT_OT_Jumptoline, ClassesMenu, DefsMenu, CommentsMenu]
+classes = (
+    TEXT_OT_Jumptoline,
+    ClassesMenu,
+    DefsMenu,
+    CommentsMenu,
+    )
 
 
 def register():
-    for c in classes:
-        bpy.utils.register_class(c)
-        
-    bpy.types.TEXT_MT_toolbox.append(GotoComments)
-    bpy.types.TEXT_MT_toolbox.append(GotoDefs)
-    bpy.types.TEXT_MT_toolbox.append(GotoClasses)
+    for cls in classes:
+        bpy.utils.register_class(cls)
+
+    bpy.types.TEXT_MT_toolbox.append(menu_development_class_view)
+
 
 def unregister():
-    for c in classes:
-        bpy.utils.unregister_class(c)
-        
-        bpy.types.TEXT_MT_toolbox.remove(GotoComments)
-    bpy.types.TEXT_MT_toolbox.remove(GotoDefs)
-    bpy.types.TEXT_MT_toolbox.remove(GotoClasses)
-    
+    for cls in classes:
+        bpy.utils.unregister_class(cls)
+
+    bpy.types.TEXT_MT_toolbox.remove(menu_development_class_view)
+
+
 if __name__ == "__main__":
     register()



More information about the Bf-extensions-cvs mailing list