[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4063] contrib/py/scripts/addons/ node_categories/__init__.py: Use the new get_node_type class method of node classes to avoid the enum items hack .
Lukas Toenne
lukas.toenne at googlemail.com
Tue Dec 18 16:53:42 CET 2012
Revision: 4063
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4063
Author: lukastoenne
Date: 2012-12-18 15:53:37 +0000 (Tue, 18 Dec 2012)
Log Message:
-----------
Use the new get_node_type class method of node classes to avoid the enum items hack.
Modified Paths:
--------------
contrib/py/scripts/addons/node_categories/__init__.py
Modified: contrib/py/scripts/addons/node_categories/__init__.py
===================================================================
--- contrib/py/scripts/addons/node_categories/__init__.py 2012-12-18 13:21:54 UTC (rev 4062)
+++ contrib/py/scripts/addons/node_categories/__init__.py 2012-12-18 15:53:37 UTC (rev 4063)
@@ -38,26 +38,38 @@
# Types
+# Get an iterator over all actual node classes
+def gen_node_subclasses(base):
+ for nodeclass in base.__subclasses__():
+ # get_node_type used to distinguish base classes from actual node type classes
+ if hasattr(nodeclass, 'get_node_type'):
+ yield nodeclass
+ # call recursively for subclasses
+ for subclass in gen_node_subclasses(nodeclass):
+ yield subclass
+
+
# Enum items callback to get a list of possible node types from context.
# Used for both the node item and operator properties.
# self argument is unused, can be None
def node_type_items(self, context):
node_tree = context.space_data.edit_tree
- # XXX This trick only works with static enum items
- # Future nodes will use dynamic enum item callbacks,
- # need to find a better way to walk available types then ...
- return [(item.identifier, item.name, item.description) for item in node_tree.nodes.bl_rna.functions['new'].parameters['type'].enum_items]
-# Helper function for getting the enum UI name from the identifier
-# Enum properties always evaluate to the identifier strings by default
-def get_node_type_name(node_type, context):
- enum_node_types = node_type_items(None, context)
- for nt in enum_node_types:
- if nt[0] == node_type:
- return nt[1]
- return ""
+ # XXX In customnodes branch, node will use a poll function to determine possible types in the context tree.
+ # For now just use a poll function based on node subclass base
+ if node_tree.type == 'SHADER':
+ poll = lambda nodeclass: issubclass(nodeclass, bpy.types.ShaderNode) or issubclass(nodeclass, bpy.types.SpecialNode)
+ elif node_tree.type == 'COMPOSITING':
+ poll = lambda nodeclass: issubclass(nodeclass, bpy.types.CompositorNode) or issubclass(nodeclass, bpy.types.SpecialNode)
+ elif node_tree.type == 'TEXTURE':
+ poll = lambda nodeclass: issubclass(nodeclass, bpy.types.TextureNode) or issubclass(nodeclass, bpy.types.SpecialNode)
+ return [(nc.get_node_type(), nc.bl_rna.name, nc.bl_rna.description) for nc in gen_node_subclasses(bpy.types.Node) if (poll is None) or poll(nc)]
+
+node_class_dict = { nc.get_node_type() : nc for nc in set(gen_node_subclasses(bpy.types.Node)) }
+
+
class NodeCategoryItemSetting(PropertyGroup):
value = StringProperty(name="Value", description="Initial value to assign to the node property")
@@ -68,7 +80,7 @@
def node_type_update(self, context):
# convenience feature: reset to default label when changing the node type
# XXX might be better to check if the label has actually been modified?
- self.label = get_node_type_name(self.node_type, context)
+ self.label = node_class_dict[self.node_type].bl_rna.name
node_type = EnumProperty(name="Node Type", description="Node type identifier", items=node_type_items, update=node_type_update)
label = StringProperty(name="Label")
@@ -229,7 +241,7 @@
op = sub.operator("node.category_remove_item", text="", icon='X')
op.index = index
- box.prop_menu_enum(item, "node_type", text="Node: "+get_node_type_name(item.node_type, context), icon='NODE')
+ box.prop_menu_enum(item, "node_type", text="Node: "+node_class_dict[item.node_type].bl_rna.name, icon='NODE')
for setting_index, setting in enumerate(item.settings):
row = box.row(align=True)
More information about the Bf-extensions-cvs
mailing list