forked from bartvdbraak/blender
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:
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
|
||||
|
Loading…
Reference in New Issue
Block a user