Fix: Nodes: Various Add/Swap menu entries not in alphabetical order

Shader Nodes
- Split Bundle and Closure nodes in their own subsections.

Geometry Nodes
- Reorder certain nodes.
    - e.g. `Bone Info`, `Is Edge Smooth`, `Gamma`, `Implicit Conversion`
- Create subsection for tool-specific `Geometry > Read` nodes.
    - e.g. `Active Element`, `Selection`
- Create subsection for switch nodes.
- Split the Bundle menu into multiple subsections.

Compositor
- Reorder `Mask to SDF` & `Implicit Conversion`
- Create subsection for switch nodes.
- Make order of `Utilities` submenus consistent with Geometry Nodes.

Pull Request: https://projects.blender.org/blender/blender/pulls/154596
This commit is contained in:
quackarooni 2026-07-10 16:49:07 +02:00 • committed by quackarooni
parent e18832e824
commit fc7cb3f5d0
3 changed files with 25 additions and 18 deletions

View file

@ -160,8 +160,8 @@ class NODE_MT_compositor_node_filter_base(node_add_menu.NodeMenu):
self.node_operator(layout, "CompositorNodeDespeckle")
layout.separator()
self.node_operator(layout, "CompositorNodeDilateErode")
self.node_operator(layout, "CompositorNodeMaskToSDF")
self.node_operator(layout, "CompositorNodeInpaint")
self.node_operator(layout, "CompositorNodeMaskToSDF")
layout.separator()
self.node_operator_with_searchable_enum_socket(
context, layout, "CompositorNodeFilter", "Type", [
@ -290,19 +290,21 @@ class NODE_MT_compositor_node_utilities_base(node_add_menu.NodeMenu):
del context
layout = self.layout
self.draw_menu(layout, path="Utilities/Math")
self.draw_menu(layout, path="Utilities/Text")
self.draw_menu(layout, path="Utilities/Vector")
layout.separator()
self.draw_menu(layout, path="Utilities/Matrix")
self.draw_menu(layout, path="Utilities/Rotation")
self.draw_menu(layout, path="Utilities/Text")
layout.separator()
self.node_operator(layout, "NodeImplicitConversion")
self.node_operator(layout, "CompositorNodeLevels")
self.node_operator(layout, "CompositorNodeNormalize")
layout.separator()
self.node_operator(layout, "NodeImplicitConversion")
self.node_operator(layout, "CompositorNodeSplit")
self.node_operator(layout, "GeometryNodeSwitch")
self.node_operator(layout, "GeometryNodeIndexSwitch")
self.node_operator(layout, "GeometryNodeMenuSwitch")
self.node_operator(layout, "GeometryNodeSwitch")
layout.separator()
self.node_operator(layout, "CompositorNodeSplit")
self.node_operator(
layout, "CompositorNodeSwitchView",
label="Switch Stereo View")

View file

@ -36,10 +36,10 @@ class NODE_MT_gn_color_base(node_add_menu.NodeMenu):
layout = self.layout
self.node_operator(layout, "ShaderNodeBlackbody")
self.node_operator(layout, "ShaderNodeGamma")
self.node_operator(layout, "ShaderNodeValToRGB")
self.node_operator(layout, "ShaderNodeRGBCurve")
self.node_operator(layout, "ShaderNodeGamma")
self.color_mix_node(context, layout, search_weight=-1.0)
self.node_operator(layout, "ShaderNodeRGBCurve")
layout.separator()
self.node_operator(layout, "FunctionNodeCombineColor")
self.node_operator(layout, "FunctionNodeSeparateColor")
@ -254,8 +254,9 @@ class NODE_MT_gn_geometry_read_base(node_add_menu.NodeMenu):
self.node_operator(layout, "GeometryNodeInputPosition", search_weight=1.0)
self.node_operator(layout, "GeometryNodeInputRadius")
if context.space_data.node_tree_sub_type == 'TOOL':
self.node_operator(layout, "GeometryNodeToolSelection")
layout.separator()
self.node_operator(layout, "GeometryNodeToolActiveElement")
self.node_operator(layout, "GeometryNodeToolSelection")
layout.separator()
self.node_operator(layout, "GeometryNodeGetGeometryBundle")
@ -376,6 +377,7 @@ class NODE_MT_gn_input_scene_base(node_add_menu.NodeMenu):
if context.space_data.node_tree_sub_type == 'TOOL':
self.node_operator(layout, "GeometryNodeTool3DCursor")
self.node_operator(layout, "GeometryNodeInputActiveCamera")
self.node_operator(layout, "GeometryNodeBoneInfo")
self.node_operator_with_outputs(
context,
layout,
@ -392,7 +394,6 @@ class NODE_MT_gn_input_scene_base(node_add_menu.NodeMenu):
"Orthographic Scale",
],
)
self.node_operator(layout, "GeometryNodeBoneInfo")
self.node_operator(layout, "GeometryNodeCollectionChildren")
self.node_operator(layout, "GeometryNodeCollectionInfo")
self.node_operator(layout, "GeometryNodeImageInfo")
@ -501,9 +502,9 @@ class NODE_MT_gn_mesh_read_base(node_add_menu.NodeMenu):
self.node_operator(layout, "GeometryNodeInputMeshFaceNeighbors")
if context.space_data.node_tree_sub_type == 'TOOL':
self.node_operator(layout, "GeometryNodeToolFaceSet")
self.node_operator(layout, "GeometryNodeInputEdgeSmooth")
self.node_operator(layout, "GeometryNodeInputMeshFaceIsPlanar")
self.node_operator(layout, "GeometryNodeInputShadeSmooth")
self.node_operator(layout, "GeometryNodeInputEdgeSmooth")
self.node_operator(layout, "GeometryNodeInputMeshIsland")
self.node_operator(layout, "GeometryNodeInputShortestEdgePaths")
self.node_operator(layout, "GeometryNodeInputMeshVertexNeighbors")
@ -674,10 +675,10 @@ class NODE_MT_gn_utilities_text_base(node_add_menu.NodeMenu):
self.node_operator(layout, "FunctionNodeMatchString")
self.node_operator(layout, "FunctionNodeReplaceString")
self.node_operator(layout, "FunctionNodeReverseString")
self.node_operator(layout, "FunctionNodeSliceString")
self.node_operator_with_searchable_enum_socket(
context, layout, "FunctionNodeSetStringCase", "Case", ["Uppercase", "Lowercase"],
)
self.node_operator(layout, "FunctionNodeSliceString")
self.node_operator(layout, "FunctionNodeSplitString")
self.node_operator(layout, "FunctionNodeTrimString")
layout.separator()
@ -738,12 +739,13 @@ class NODE_MT_gn_utilities_base(node_add_menu.NodeMenu):
self.draw_menu(layout, path="Utilities/Rotation")
self.draw_menu(layout, path="Utilities/Sound")
layout.separator()
self.node_operator(layout, "NodeImplicitConversion")
self.for_each_element_zone(layout, label="For Each Element")
self.node_operator(layout, "GeometryNodeIndexSwitch")
self.node_operator(layout, "GeometryNodeMenuSwitch")
self.node_operator(layout, "NodeImplicitConversion")
self.node_operator(layout, "FunctionNodeRandomValue")
self.repeat_zone(layout, label="Repeat")
layout.separator()
self.node_operator(layout, "GeometryNodeIndexSwitch")
self.node_operator(layout, "GeometryNodeMenuSwitch")
self.node_operator(layout, "GeometryNodeSwitch")
layout.separator()
self.draw_assets_for_catalog(layout, self.bl_label)
@ -816,8 +818,8 @@ class NODE_MT_gn_utilities_matrix_base(node_add_menu.NodeMenu):
self.node_operator(layout, "FunctionNodeCombineTransform")
self.node_operator(layout, "FunctionNodeMatrixDeterminant", label="Determinant")
self.node_operator(layout, "FunctionNodeInvertMatrix")
self.node_operator(layout, "FunctionNodeMatrixMultiply")
self.node_operator(layout, "FunctionNodeMatrixSVD")
self.node_operator(layout, "FunctionNodeMatrixMultiply")
self.node_operator(layout, "FunctionNodeProjectPoint")
self.node_operator(layout, "FunctionNodeSeparateMatrix")
self.node_operator(layout, "FunctionNodeSeparateTransform")
@ -835,11 +837,13 @@ class NODE_MT_category_utilities_bundle_base(node_add_menu.NodeMenu):
def draw(self, context):
layout = self.layout
self.node_operator(layout, "NodeCombineBundle")
self.node_operator(layout, "NodeJoinBundle")
self.node_operator(layout, "NodeSeparateBundle")
layout.separator()
self.node_operator(layout, "NodeGetBundleItem")
self.node_operator(layout, "NodeGetNestedBundlePaths")
self.node_operator(layout, "NodeStoreBundleItem")
self.node_operator(layout, "NodeJoinBundle")
layout.separator()
self.typed_bundle(layout, label=n_("Typed Bundle"))
self.draw_assets_for_catalog(layout, self.menu_path)

View file

@ -479,14 +479,15 @@ class NODE_MT_shader_node_utilities_base(node_add_menu.NodeMenu):
self.draw_menu(layout, "Utilities/Math")
self.draw_menu(layout, "Utilities/Vector")
layout.separator()
self.node_operator(layout, "NodeImplicitConversion")
self.repeat_zone(layout, label="Repeat")
layout.separator()
self.node_operator(layout, "NodeImplicitConversion")
self.closure_zone(layout, label="Closure")
self.node_operator(layout, "NodeEvaluateClosure")
layout.separator()
self.node_operator(layout, "NodeCombineBundle")
self.node_operator(layout, "NodeSeparateBundle")
self.node_operator(layout, "NodeJoinBundle")
self.node_operator(layout, "NodeSeparateBundle")
layout.separator()
self.node_operator(layout, "GeometryNodeMenuSwitch")
if cycles_shader_nodes_poll(context):