diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py index 0927f13f5d7..f9ecc1b9802 100644 --- a/release/scripts/startup/bl_operators/node.py +++ b/release/scripts/startup/bl_operators/node.py @@ -20,11 +20,7 @@ import bpy from bpy.types import Operator -from bpy.props import (EnumProperty, - FloatVectorProperty, - StringProperty, - CollectionProperty - ) +from bpy.props import EnumProperty # XXX These node item lists should actually be generated by a callback at operator execution time (see node_type_items below), # using the active node tree from the context. Due to a difficult bug in bpy this is not possible (item list memory gets freed too early), @@ -33,51 +29,66 @@ from bpy.props import (EnumProperty, # In the custom_nodes branch, the static per-tree-type node items are replaced by a single independent type list anyway (with a poll function # to limit node types to the respective trees). So this workaround is only temporary. +# lazy init node_type_items_dict = {} -node_type_items_dict['SHADER'] = [(item.identifier, item.name, item.description, item.value) for item in bpy.types.ShaderNode.bl_rna.properties['type'].enum_items] -node_type_items_dict['COMPOSITING'] = [(item.identifier, item.name, item.description, item.value) for item in bpy.types.CompositorNode.bl_rna.properties['type'].enum_items] -node_type_items_dict['TEXTURE'] = [(item.identifier, item.name, item.description, item.value) for item in bpy.types.TextureNode.bl_rna.properties['type'].enum_items] # Returns the enum item list for the edited tree in the context -def node_type_items(self, context): +def node_type_items_cb(self, context): snode = context.space_data if not snode: return [] tree = snode.edit_tree if not tree: return [] - + + 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], + }) + # 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] else: return [] -class NODE_OT_add_search(bpy.types.Operator): + +class NODE_OT_add_search(Operator): '''Add a node to the active tree''' bl_idname = "node.add_search" bl_label = "Search and Add Node" bl_options = {'REGISTER', 'UNDO'} # XXX this should be called 'node_type' but the operator search property is hardcoded to 'type' by a hack in bpy_operator_wrap.c ... - type = EnumProperty(items=node_type_items, name="Node Type", description="Node type") + type = EnumProperty( + name="Node Type", + description="Node type", + items=node_type_items_cb, + ) + + _node_type_items_dict = None def create_node(self, context): space = context.space_data tree = space.edit_tree - + node = tree.nodes.new(type=self.type) for n in tree.nodes: - if n==node: + if n == node: node.select = True tree.nodes.active = node else: node.select = False node.location = space.cursor_location return node - + @classmethod def poll(cls, context): space = context.space_data @@ -94,7 +105,6 @@ class NODE_OT_add_search(bpy.types.Operator): # convert mouse position to the View2D for later node placement space.cursor_location = v2d.region_to_view(event.mouse_region_x, event.mouse_region_y) - + context.window_manager.invoke_search_popup(self) return {'CANCELLED'} -