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.

This commit is contained in:
Lukas Toenne 2012-08-10 07:22:36 +00:00
parent 1eb611ea55
commit b465039ee7

@ -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