diff options
author | Martin Poirier <theeth@yahoo.com> | 2010-08-02 06:55:12 +0400 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2010-08-02 06:55:12 +0400 |
commit | 5b345524ea4aed30aa2fc9ef735ccae82bdffeae (patch) | |
tree | 8d8e9ffbe5a0254ea78c4f4e56ba27f3f1b2db1c /release/scripts/modules/bpy_types.py | |
parent | 9f575e5446924770d8a0d118a14100dcd7366ead (diff) |
RNA Types metaclass registration
See mailing list posts for details [1][2][3]
Addons still need to be fixed; Campbell said he'd do it today.
See any of the py files (outside netrender) in this commit for how to do it (it's rather simple).
[1] http://lists.blender.org/pipermail/bf-committers/2010-February/026328.html
[2] http://lists.blender.org/pipermail/bf-committers/2010-August/028311.html
[3] http://lists.blender.org/pipermail/bf-committers/2010-August/028321.html
Diffstat (limited to 'release/scripts/modules/bpy_types.py')
-rw-r--r-- | release/scripts/modules/bpy_types.py | 71 |
1 files changed, 66 insertions, 5 deletions
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 8cbb2bf4e80..7e7b7f128ab 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,64 @@ 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 = {} + +def UnloadModule(module): + global TypeMap, PropertiesMap + for t in TypeMap.get(module, []): + bpy_types.unregister(t) + + TypeMap = {} + + for t in PropertiesMap.get(module, []): + bpy_types.unregister(t) + + PropertiesMap = {} + +def LoadModule(module, force=False): + for t in TypeMap.get(module, []): + bpy_types.register(t) + +_bpy.LoadModule = LoadModule +_bpy.UnloadModule = UnloadModule + +class RNAMeta(type): + @classmethod + def _immediate(cls): + return bpy_types.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._immediate(): + bpy_types.register(result) + ClassMap = PropertiesMap + + # first part of packages only + if "." in module: + module = module[:module.index(".")] + + if not module in ClassMap: + ClassMap[module] = [] + + ClassMap[module].append(result) + return result + +class RNAMetaRegister(RNAMeta): + @classmethod + def _immediate(cls): + return True; -class OrderedMeta(type): +class OrderedMeta(RNAMeta): def __init__(cls, name, bases, attributes): super(OrderedMeta, cls).__init__(name, bases, attributes) @@ -549,7 +606,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 +620,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 +667,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={}): |