diff --git a/release/scripts/modules/nodeitems_utils.py b/release/scripts/modules/nodeitems_utils.py index 7ab5d8b3180..3fbafc3ae9b 100644 --- a/release/scripts/modules/nodeitems_utils.py +++ b/release/scripts/modules/nodeitems_utils.py @@ -26,21 +26,17 @@ class NodeCategory(): def poll(cls, context): return True - @property - def items(self): - if hasattr(self, '_items'): - return self._items - elif hasattr(self, '_itemfunc'): - return self._itemfunc(self) - - def __init__(self, identifier, name, description="", items=[]): + def __init__(self, identifier, name, description="", items=None): self.identifier = identifier self.name = name self.description = description - if callable(items): - self._itemfunc = items + + if items is None: + self.items = lambda context: [] + elif callable(items): + self.items = items else: - self._items = items + self.items = lambda context: items class NodeItem(): def __init__(self, nodetype, label=None, settings={}): @@ -69,7 +65,7 @@ def register_node_categories(identifier, cat_list): layout = self.layout col = layout.column() default_context = bpy.app.translations.contexts.default - for item in self.category.items: + for item in self.category.items(context): op = col.operator("node.add_node", text=item.label, text_ctxt=default_context) op.type = item.nodetype op.use_transform = True diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 4a80acc0c8e..93cd7110486 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -17,7 +17,6 @@ # ##### END GPL LICENSE BLOCK ##### # -import bpy import nodeitems_utils from nodeitems_utils import NodeCategory, NodeItem @@ -47,18 +46,24 @@ class TextureNodeCategory(NodeCategory): return context.space_data.tree_type == 'TextureNodeTree' -def compositor_node_group_items(self): - return [NodeItem('CompositorNodeGroup', group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) - for group in bpy.data.node_groups if group.bl_idname == 'CompositorNodeTree'] +# maps node tree type to group node type +node_tree_group_type = { + 'CompositorNodeTree' : 'CompositorNodeGroup', + 'ShaderNodeTree' : 'ShaderNodeGroup', + 'TextureNodeTree' : 'TextureNodeGroup', + } +# generic node group items generator for shader, compositor and texture node groups +def node_group_items(context): + space = context.space_data + if not space: + return + ntree = space.edit_tree + if not ntree: + return -# Note: node groups not distinguished by old/new shader nodes -def shader_node_group_items(self): - return [NodeItem('ShaderNodeGroup', group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) - for group in bpy.data.node_groups if group.bl_idname == 'ShaderNodeTree'] - -def texture_node_group_items(self): - return [NodeItem('TextureNodeGroup', group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) - for group in bpy.data.node_groups if group.bl_idname == 'TextureNodeTree'] + for group in context.blend_data.node_groups: + if group.bl_idname == ntree.bl_idname: + yield NodeItem(node_tree_group_type[group.bl_idname], group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) # All standard node categories currently used in nodes. @@ -99,7 +104,7 @@ shader_node_categories = [ ]), ShaderOldNodeCategory("SH_SCRIPT", "Script", items=[ ]), - ShaderOldNodeCategory("SH_GROUP", "Group", items=shader_node_group_items), + ShaderOldNodeCategory("SH_GROUP", "Group", items=node_group_items), ShaderOldNodeCategory("SH_LAYOUT", "Layout", items=[ NodeItem("NodeFrame"), ]), @@ -182,7 +187,7 @@ shader_node_categories = [ ShaderNewNodeCategory("SH_NEW_SCRIPT", "Script", items=[ NodeItem("ShaderNodeScript"), ]), - ShaderNewNodeCategory("SH_NEW_GROUP", "Group", items=shader_node_group_items), + ShaderNewNodeCategory("SH_NEW_GROUP", "Group", items=node_group_items), ShaderNewNodeCategory("SH_NEW_LAYOUT", "Layout", items=[ NodeItem("NodeFrame"), ]), @@ -287,7 +292,7 @@ compositor_node_categories = [ NodeItem("CompositorNodeTransform"), NodeItem("CompositorNodeStabilize"), ]), - CompositorNodeCategory("CMP_GROUP", "Group", items=compositor_node_group_items), + CompositorNodeCategory("CMP_GROUP", "Group", items=node_group_items), CompositorNodeCategory("CMP_LAYOUT", "Layout", items = [ NodeItem("NodeFrame"), NodeItem("CompositorNodeSwitch"), @@ -342,7 +347,7 @@ texture_node_categories = [ NodeItem("TextureNodeTranslate"), NodeItem("TextureNodeRotate"), ]), - TextureNodeCategory("TEX_GROUP", "Group", items=texture_node_group_items), + TextureNodeCategory("TEX_GROUP", "Group", items=node_group_items), TextureNodeCategory("TEX_LAYOUT", "Layout", items = [ NodeItem("NodeFrame"), ]),