Skip to content
Snippets Groups Projects
development_class_viewer.py 5.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    bl_info = {
    
    Campbell Barton's avatar
    Campbell Barton committed
        "name": "Class Viewer",
        "author": "Mackraken", "batFinger"
        "version": (0, 1, 2),
    
        "blender": (2, 58, 0),
    
    Campbell Barton's avatar
    Campbell Barton committed
        "location": "Text Editor > Toolbar, Text Editor > Right Click",
        "warning": "",
    
        "description": "List classes and definitions of a text block",
    
    Campbell Barton's avatar
    Campbell Barton committed
        "wiki_url": "https://sites.google.com/site/aleonserra/home/scripts/class-viewer",
    
        "tracker_url": "https://developer.blender.org/T29463",
    
    Campbell Barton's avatar
    Campbell Barton committed
        "category": "Development"}
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    import bpy
    
    #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= ""):
    
    Campbell Barton's avatar
    Campbell Barton committed
        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)::]
                        else:
                            func = line[len(tipo):end]
                        defs.append([func, i+1])
                
                if sort: defs.sort()
        
        return defs
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    class TEXT_OT_Jumptoline(bpy.types.Operator):
    
    Campbell Barton's avatar
    Campbell Barton committed
        bl_label = "Jump"
        bl_idname = "text.jumptoline"
        __doc__ = "Jump to line"
        line = bpy.props.IntProperty(default=-1)
        
        @classmethod
        def poll(cls, context):
            if context.area.spaces[0].type!="TEXT_EDITOR":
                return False
            else: 
                return context.area.spaces[0].text!=None
        
        def execute(self, context):
            
            scn = context.scene
    
    Campbell Barton's avatar
    Campbell Barton committed
            if self.line!=-1:
                bpy.ops.text.jump(line=self.line)
    
    Campbell Barton's avatar
    Campbell Barton committed
            return {'FINISHED'}
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    
    
    class CommentsMenu(bpy.types.Menu):
    
    Campbell Barton's avatar
    Campbell Barton committed
        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
            
        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]
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    class DefsMenu(bpy.types.Menu):
    
    Campbell Barton's avatar
    Campbell Barton committed
        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
            
        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]
                    
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    class ClassesMenu(bpy.types.Menu):
    
    Campbell Barton's avatar
    Campbell Barton committed
        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
            
        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]
    
    
                
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    def GotoComments(self, context): 
    
    Campbell Barton's avatar
    Campbell Barton committed
        self.layout.menu("OBJECT_MT_select_comments", text="Comments", icon='PLUGIN')
        return False
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    def GotoDefs(self, context): 
    
    Campbell Barton's avatar
    Campbell Barton committed
        self.layout.menu("OBJECT_MT_select_defs", text="Defs", icon='PLUGIN')
        return False
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    def GotoClasses(self, context): 
    
    Campbell Barton's avatar
    Campbell Barton committed
        self.layout.menu("OBJECT_MT_select_classes", text="Classes", icon='PLUGIN')
        return False
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    
    classes = [TEXT_OT_Jumptoline, ClassesMenu, DefsMenu, CommentsMenu]
    
    
    def register():
    
    Campbell Barton's avatar
    Campbell Barton committed
        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)
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    
    def unregister():
    
    Campbell Barton's avatar
    Campbell Barton committed
        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)
        
    
    Alfonso de Leon Serra's avatar
    Alfonso de Leon Serra committed
    if __name__ == "__main__":
    
    Campbell Barton's avatar
    Campbell Barton committed
        register()