diff options
Diffstat (limited to 'release/scripts/modules/bpy_types.py')
-rw-r--r-- | release/scripts/modules/bpy_types.py | 92 |
1 files changed, 86 insertions, 6 deletions
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 8cbb2bf4e80..0cd0aaaa3f0 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -19,6 +19,7 @@ # <pep8 compliant> from _bpy import types as bpy_types +import _bpy from mathutils import Vector StructRNA = bpy_types.Struct.__bases__[0] @@ -539,8 +540,83 @@ class Text(bpy_types.ID): import collections +TypeMap = {} +# Properties (IDPropertyGroup) are different from types because they need to be registered +# before adding sub properties to them, so they are registered on definition +# and unregistered on unload +PropertiesMap = {} -class OrderedMeta(type): +# Using our own loading function we set this to false +# so when running a script directly in the text editor +# registers moduals instantly. +_register_immediate = True + +def _unregister_module(module, free=True): + for t in TypeMap.get(module, ()): + try: + bpy_types.unregister(t) + except: + import traceback + print("bpy.utils._unregister_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__)) + traceback.print_exc() + + if free == True and module in TypeMap: + del TypeMap[module] + + + for t in PropertiesMap.get(module, ()): + try: + bpy_types.unregister(t) + except: + import traceback + print("bpy.utils._unload_module(): Module '%s' failed to unregister class '%s.%s'" % (module, t.__module__, t.__name__)) + traceback.print_exc() + + if free == True and module in PropertiesMap: + del PropertiesMap[module] + + +def _register_module(module): + for t in TypeMap.get(module, ()): + try: + bpy_types.register(t) + except: + import traceback + print("bpy.utils._register_module(): Module '%s' failed to register class '%s.%s'" % (module, t.__module__, t.__name__)) + traceback.print_exc() + + +class RNAMeta(type): + @classmethod + def _register_immediate(cls): + return _register_immediate + + def __new__(cls, name, bases, classdict, **args): + result = type.__new__(cls, name, bases, classdict) + if bases and bases[0] != StructRNA: + module = result.__module__ + + ClassMap = TypeMap + + # Register right away if needed + if cls._register_immediate(): + bpy_types.register(result) + ClassMap = PropertiesMap + + # first part of packages only + if "." in module: + module = module[:module.index(".")] + + ClassMap.setdefault(module, []).append(result) + + return result + +class RNAMetaRegister(RNAMeta): + @classmethod + def _register_immediate(cls): + return True + +class OrderedMeta(RNAMeta): def __init__(cls, name, bases, attributes): super(OrderedMeta, cls).__init__(name, bases, attributes) @@ -549,7 +625,6 @@ class OrderedMeta(type): def __prepare__(name, bases, **kwargs): return collections.OrderedDict() - # Only defined so operators members can be used by accessing self.order class Operator(StructRNA, metaclass=OrderedMeta): __slots__ = () @@ -564,7 +639,12 @@ class Macro(StructRNA, metaclass=OrderedMeta): def define(self, opname): from _bpy import ops return ops.macro_define(self, opname) + +class IDPropertyGroup(StructRNA, metaclass=RNAMetaRegister): + __slots__ = () +class RenderEngine(StructRNA, metaclass=RNAMeta): + __slots__ = () class _GenericUI: __slots__ = () @@ -606,15 +686,15 @@ class _GenericUI: pass -class Panel(StructRNA, _GenericUI): +class Panel(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () -class Header(StructRNA, _GenericUI): +class Header(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () -class Menu(StructRNA, _GenericUI): +class Menu(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () def path_menu(self, searchpaths, operator, props_default={}): @@ -638,7 +718,7 @@ class Menu(StructRNA, _GenericUI): if f.startswith("."): continue - preset_name = bpy.utils.display_name(f) + preset_name = bpy.path.display_name(f) props = layout.operator(operator, text=preset_name) for attr, value in props_default.items(): |