Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Poirier <theeth@yahoo.com>2010-08-02 06:55:12 +0400
committerMartin Poirier <theeth@yahoo.com>2010-08-02 06:55:12 +0400
commit5b345524ea4aed30aa2fc9ef735ccae82bdffeae (patch)
tree8d8e9ffbe5a0254ea78c4f4e56ba27f3f1b2db1c /release/scripts/modules/bpy_types.py
parent9f575e5446924770d8a0d118a14100dcd7366ead (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.py71
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={}):