From b465039ee725ae9c1f656a4b3b8c1d00aa7e0281 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Fri, 10 Aug 2012 07:22:36 +0000 Subject: [PATCH] Extended the search operator for nodes to also support node groups. The basic node group type is not included in the node items list, instead all existing node groups are added to the items list in the callback. A prefix is used to distinguish base node types from node groups. --- release/scripts/startup/bl_operators/node.py | 42 ++++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py index f9ecc1b9802..2f7fc359864 100644 --- a/release/scripts/startup/bl_operators/node.py +++ b/release/scripts/startup/bl_operators/node.py @@ -32,6 +32,24 @@ from bpy.props import EnumProperty # lazy init node_type_items_dict = {} +# Prefixes used to distinguish base node types and node groups +node_type_prefix = 'NODE_' +node_group_prefix = 'GROUP_' + +# Generate a list of enum items for a given node class +# Copy existing type enum, adding a prefix to distinguish from node groups +# Skip the base node group type, node groups will be added below for all existing group trees +def node_type_items(node_class): + return [(node_type_prefix + item.identifier, item.name, item.description) + for item in node_class.bl_rna.properties['type'].enum_items if item.identifier != 'GROUP'] + +# Generate items for node group types +# Filter by the given tree_type +# Node group trees don't have a description property yet (could add this as a custom property though) +def node_group_items(tree_type): + return [(node_group_prefix + group.name, group.name, '') + for group in bpy.data.node_groups if group.type == tree_type] + # Returns the enum item list for the edited tree in the context def node_type_items_cb(self, context): snode = context.space_data @@ -41,21 +59,19 @@ def node_type_items_cb(self, context): if not tree: return [] + # Lists of basic node types for each if not node_type_items_dict: node_type_items_dict.update({ - 'SHADER': [(item.identifier, item.name, item.description, item.value) - for item in bpy.types.ShaderNode.bl_rna.properties['type'].enum_items], - 'COMPOSITING': [(item.identifier, item.name, item.description, item.value) - for item in bpy.types.CompositorNode.bl_rna.properties['type'].enum_items], - 'TEXTURE': [(item.identifier, item.name, item.description, item.value) - for item in bpy.types.TextureNode.bl_rna.properties['type'].enum_items], + 'SHADER': node_type_items(bpy.types.ShaderNode), + 'COMPOSITING': node_type_items(bpy.types.CompositorNode), + 'TEXTURE': node_type_items(bpy.types.TextureNode), }) # XXX Does not work correctly, see comment above #return [(item.identifier, item.name, item.description, item.value) for item in tree.nodes.bl_rna.functions['new'].parameters['type'].enum_items] if tree.type in node_type_items_dict: - return node_type_items_dict[tree.type] + return node_type_items_dict[tree.type] + node_group_items(tree.type) else: return [] @@ -79,7 +95,17 @@ class NODE_OT_add_search(Operator): space = context.space_data tree = space.edit_tree - node = tree.nodes.new(type=self.type) + # Enum item identifier has an additional prefix to distinguish base node types from node groups + item = self.type + if (item.startswith(node_type_prefix)): + # item means base node type + node = tree.nodes.new(type=item[len(node_type_prefix):]) + elif (item.startswith(node_group_prefix)): + # item means node group type + node = tree.nodes.new(type='GROUP', group=bpy.data.node_groups[item[len(node_group_prefix):]]) + else: + return None + for n in tree.nodes: if n == node: node.select = True