From 5b345524ea4aed30aa2fc9ef735ccae82bdffeae Mon Sep 17 00:00:00 2001 From: Martin Poirier Date: Mon, 2 Aug 2010 02:55:12 +0000 Subject: 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 --- release/scripts/modules/bpy_types.py | 71 +++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 5 deletions(-) (limited to 'release/scripts/modules/bpy_types.py') 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 @@ # 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={}): -- cgit v1.2.3