[Bf-extensions-cvs] [c72cd2b4] master: development_edit_operator, moved to contrib: T63750

meta-androcto noreply at git.blender.org
Fri May 24 02:53:06 CEST 2019


Commit: c72cd2b49b0b429a407b7a20aa47f881ec5f11c4
Author: meta-androcto
Date:   Fri May 24 10:52:44 2019 +1000
Branches: master
https://developer.blender.org/rBACc72cd2b49b0b429a407b7a20aa47f881ec5f11c4

development_edit_operator, moved to contrib: T63750

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

A	development_edit_operator.py

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

diff --git a/development_edit_operator.py b/development_edit_operator.py
new file mode 100644
index 00000000..257e61be
--- /dev/null
+++ b/development_edit_operator.py
@@ -0,0 +1,166 @@
+# ##### 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 = {
+    "name": "Edit Operator Source",
+    "author": "scorpion81",
+    "version": (1, 2, 2),
+    "blender": (2, 78, 0),
+    "location": "Text Editor > Edit > Edit Operator",
+    "description": "Opens source file of chosen operator, if it is an add-on one",
+    "warning": "",
+    "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/"
+                "Py/Scripts/Development/Edit_Operator_Source",
+    "category": "Development"}
+
+import bpy
+import sys
+import inspect
+from bpy.types import (
+        Operator,
+        Panel,
+        )
+from bpy.props import EnumProperty
+
+
+def get_py_class_from_op(opname):
+    opid = opname.split(".")
+    opmod = getattr(bpy.ops, opid[0])
+    op = getattr(opmod, opid[1])
+    id = op.get_rna_type().identifier
+    # C operators won't be added
+    return getattr(bpy.types, id, None)
+
+
+def getmodule(opname):
+    cls = get_py_class_from_op(opname)
+    if cls is None:
+        addon = False
+        line = -1
+        mod = 'C operator'
+    else:
+        addon = True
+        mod_name = cls.__module__
+        try:
+            line = inspect.getsourcelines(cls)[1]
+        except IOError:
+            line = -1
+        except TypeError:
+            line = -1
+
+        if mod_name == 'bpy.types':
+            addon = False
+        elif mod_name != '__main__':
+            mod = sys.modules[mod_name].__file__
+        else:
+            addon = False
+            mod = mod_name
+
+    return mod, line, addon
+
+
+def get_ops():
+    allops = []
+    opsdir = dir(bpy.ops)
+    for opmodname in opsdir:
+        opmod = getattr(bpy.ops, opmodname)
+        opmoddir = dir(opmod)
+        for o in opmoddir:
+            name = opmodname + "." + o
+            cls = get_py_class_from_op(name)
+            if cls is not None:
+                allops.append(name)
+        del opmoddir
+
+    # add own operator name too, since its not loaded yet when this is called
+    allops.append("text.edit_operator")
+    l = sorted(allops)
+    del allops
+    del opsdir
+
+    return [(y, y, "", x) for x, y in enumerate(l)]
+
+
+class EditOperator(Operator):
+    bl_idname = "text.edit_operator"
+    bl_label = "Edit Operator"
+    bl_description = "Opens the source file of operators chosen from Menu"
+    bl_property = "op"
+
+    items = get_ops()
+
+    op: EnumProperty(
+            name="Op",
+            description="",
+            items=items
+            )
+
+    def invoke(self, context, event):
+        context.window_manager.invoke_search_popup(self)
+        return {'PASS_THROUGH'}
+
+    def execute(self, context):
+        found = False
+        path, line, addon = getmodule(self.op)
+        if addon:
+            for t in bpy.data.texts:
+                if t.filepath == path:
+                    ctx = context.copy()
+                    ctx['edit_text'] = t
+                    bpy.ops.text.jump(ctx, line=line)
+                    found = True
+                    break
+
+            if (found is False):
+                self.report({'INFO'},
+                            "Opened file: " + path)
+                bpy.ops.text.open(filepath=path)
+                bpy.ops.text.jump(line=line)
+
+            return {'FINISHED'}
+        else:
+            self.report({'WARNING'},
+                        "Found no source file for " + self.op)
+
+            return {'CANCELLED'}
+
+
+class EditOperatorPanel(Panel):
+    bl_idname = "DEVEDIT_PT_operator"
+    bl_space_type = 'TEXT_EDITOR'
+    bl_region_type = 'UI'
+    bl_label = "Edit Operator"
+
+    def draw(self, context):
+        layout = self.layout
+        layout.operator("text.edit_operator")
+
+
+def register():
+    bpy.utils.register_class(EditOperator)
+    bpy.utils.register_class(EditOperatorPanel)
+
+
+def unregister():
+    bpy.utils.unregister_class(EditOperatorPanel)
+    bpy.utils.unregister_class(EditOperator)
+
+
+if __name__ == "__main__":
+    register()



More information about the Bf-extensions-cvs mailing list