From ef92735a951e74ca5741f86915e4a5dcb5d0e28e Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 29 Sep 2025 18:14:41 +0200 Subject: [PATCH] Nodes: support optional labels for group inputs Built-in nodes already used the functionality to hide the input labels in a few situations. However, this functionality was not exposed for node groups before. It required some refactoring to get the semantics of the flag right. The tricky aspect is that "Hide Label" would be an incorrect name, because the label is still shown under various circumstances. Instead, the flag merely indicates that drawing code may skip drawing the label. This adds a new "Optional Label" input for node group inputs. Other names are possible like "Requires Label" which would be the inverse. Overall the implementation is pretty straight forward after 1f489ea31a8eab17a2b37070e5a3d4c6f9a20ad5, 469a70dba9d1d8eb18cdc60147934a15773b0d6f and f79896f5b966482355f27f35bf24c793f9d36c08. Pull Request: https://projects.blender.org/blender/blender/pulls/146939 --- .../blender/blenkernel/intern/node_tree_interface.cc | 1 + source/blender/editors/space_node/drawnode.cc | 3 +++ .../blender/makesdna/DNA_node_tree_interface_types.h | 7 ++++++- .../blender/makesrna/intern/rna_node_tree_interface.cc | 10 ++++++++++ source/blender/nodes/intern/node_common.cc | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/node_tree_interface.cc b/source/blender/blenkernel/intern/node_tree_interface.cc index 998943f528a..0d3a7c186b0 100644 --- a/source/blender/blenkernel/intern/node_tree_interface.cc +++ b/source/blender/blenkernel/intern/node_tree_interface.cc @@ -1156,6 +1156,7 @@ bNodeTreeInterfaceSocket *add_interface_socket_from_node(bNodeTree &ntree, if (!decl->description.empty()) { description = decl->description; } + SET_FLAG_FROM_TEST(flag, decl->optional_label, NODE_INTERFACE_SOCKET_OPTIONAL_LABEL); } iosock = ntree.tree_interface.add_socket(name, description, socket_type, flag, nullptr); diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index 4756296a10a..96398b6ee35 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -1420,6 +1420,9 @@ static void std_node_socket_interface_draw(ID *id, } } + if (interface_socket->flag & NODE_INTERFACE_SOCKET_INPUT) { + col->prop(&ptr, "optional_label", DEFAULT_FLAGS, std::nullopt, ICON_NONE); + } { uiLayout *sub = &col->column(false); sub->active_set(interface_socket->default_input == NODE_DEFAULT_INPUT_VALUE); diff --git a/source/blender/makesdna/DNA_node_tree_interface_types.h b/source/blender/makesdna/DNA_node_tree_interface_types.h index 1edcb6fdd39..3c8ff4cd283 100644 --- a/source/blender/makesdna/DNA_node_tree_interface_types.h +++ b/source/blender/makesdna/DNA_node_tree_interface_types.h @@ -70,8 +70,13 @@ typedef enum NodeTreeInterfaceSocketFlag { NODE_INTERFACE_SOCKET_PANEL_TOGGLE = 1 << 8, /* Menu socket should be drawn expanded instead of as drop-down menu. */ NODE_INTERFACE_SOCKET_MENU_EXPANDED = 1 << 9, + /** + * Indicates that drawing code may decide not to draw the label if that would result in a + * cleaner UI. + */ + NODE_INTERFACE_SOCKET_OPTIONAL_LABEL = 1 << 10, } NodeTreeInterfaceSocketFlag; -ENUM_OPERATORS(NodeTreeInterfaceSocketFlag, NODE_INTERFACE_SOCKET_MENU_EXPANDED); +ENUM_OPERATORS(NodeTreeInterfaceSocketFlag, NODE_INTERFACE_SOCKET_OPTIONAL_LABEL); typedef enum NodeSocketInterfaceStructureType { NODE_INTERFACE_SOCKET_STRUCTURE_TYPE_AUTO = 0, diff --git a/source/blender/makesrna/intern/rna_node_tree_interface.cc b/source/blender/makesrna/intern/rna_node_tree_interface.cc index d4780c08334..2e0dc4fd3cb 100644 --- a/source/blender/makesrna/intern/rna_node_tree_interface.cc +++ b/source/blender/makesrna/intern/rna_node_tree_interface.cc @@ -1205,6 +1205,16 @@ static void rna_def_node_interface_socket(BlenderRNA *brna) prop, "Menu Expanded", "Draw the menu socket as an expanded drop-down menu"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeTreeInterfaceItem_update"); + prop = RNA_def_property(srna, "optional_label", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_INTERFACE_SOCKET_OPTIONAL_LABEL); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, + "Optional Label", + "Indicate that the label of this socket is not necessary to understand its meaning. This " + "may result in the label being skipped in some cases"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeTreeInterfaceItem_update"); + prop = RNA_def_property(srna, "attribute_domain", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, rna_enum_attribute_domain_items); RNA_def_property_enum_funcs( diff --git a/source/blender/nodes/intern/node_common.cc b/source/blender/nodes/intern/node_common.cc index 91f41dbbe8d..3656f8cce3a 100644 --- a/source/blender/nodes/intern/node_common.cc +++ b/source/blender/nodes/intern/node_common.cc @@ -393,6 +393,7 @@ static BaseSocketDeclarationBuilder &build_interface_socket_declaration( decl->hide_value(io_socket.flag & NODE_INTERFACE_SOCKET_HIDE_VALUE); decl->compact(io_socket.flag & NODE_INTERFACE_SOCKET_COMPACT); decl->panel_toggle(io_socket.flag & NODE_INTERFACE_SOCKET_PANEL_TOGGLE); + decl->optional_label(io_socket.flag & NODE_INTERFACE_SOCKET_OPTIONAL_LABEL); decl->default_input_type(NodeDefaultInputType(io_socket.default_input)); if (structure_type) { decl->structure_type(*structure_type);