From e009883bfed11e1ac9cbfec17ac63e5182b68b31 Mon Sep 17 00:00:00 2001 From: Kulratan Thapar Date: Thu, 5 Feb 2026 05:49:46 +0000 Subject: [PATCH 1/4] Navigation-Shortcut --- .../document/node_graph/node_properties.rs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index b3ed309d3f..04a979bf86 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -79,6 +79,23 @@ pub fn add_blank_assist(widgets: &mut Vec) { ]); } +pub fn jump_to_source_button(input: &NodeInput) -> WidgetInstance { + match input { + NodeInput::Node { node_id: source_id, .. } => { + let source_id = *source_id; + TextButton::new("Jump") + .tooltip_description("Jump to the source node connected to this input.") + .on_update(move |_| NodeGraphMessage::SelectedNodesSet { nodes: vec![source_id] }.into()) + .widget_instance() + } + _ => TextButton::new("Jump") + .disabled(true) + .tooltip_description("No node connected.") + .on_update(|_| Message::NoOp) + .widget_instance(), + } +} + pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec { let ParameterWidgetsInfo { document_node, @@ -106,6 +123,17 @@ pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec Date: Mon, 16 Feb 2026 20:53:25 +0000 Subject: [PATCH 2/4] Fix as rec --- .../document/node_graph/node_properties.rs | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 04a979bf86..0e926d9343 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -4,7 +4,7 @@ use super::document_node_definitions::{NODE_OVERRIDES, NodePropertiesContext}; use super::utility_types::FrontendGraphDataType; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeNetworkInterface}; use crate::messages::portfolio::utility_types::{FontCatalogStyle, PersistentData}; use crate::messages::prelude::*; use choice::enum_choice; @@ -79,20 +79,17 @@ pub fn add_blank_assist(widgets: &mut Vec) { ]); } -pub fn jump_to_source_button(input: &NodeInput) -> WidgetInstance { +pub fn jump_to_source_widget(input: &NodeInput, network_interface: &NodeNetworkInterface, selection_network_path: &[NodeId]) -> WidgetInstance { match input { NodeInput::Node { node_id: source_id, .. } => { let source_id = *source_id; - TextButton::new("Jump") + let node_name = network_interface.implementation_name(&source_id, selection_network_path); + TextButton::new(format!("Select Source: {}", node_name)) .tooltip_description("Jump to the source node connected to this input.") .on_update(move |_| NodeGraphMessage::SelectedNodesSet { nodes: vec![source_id] }.into()) .widget_instance() } - _ => TextButton::new("Jump") - .disabled(true) - .tooltip_description("No node connected.") - .on_update(|_| Message::NoOp) - .widget_instance(), + _ => TextLabel::new("Input Not Connected").tooltip_description("No node connected.").widget_instance(), } } @@ -106,6 +103,8 @@ pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec Vec { + let is_exposed = default_info + .document_node + .and_then(|node| node.inputs.get(default_info.index)) + .map(|input| input.is_exposed()) + .unwrap_or(false); + let mut widgets = start_widgets(default_info); - widgets.extend_from_slice(&[ - Separator::new(SeparatorStyle::Unrelated).widget_instance(), - TextLabel::new("-") - .tooltip_label(format!("Data Type: {concrete_type}")) - .tooltip_description("This data can only be supplied through the node graph because no widget exists for its type.") - .widget_instance(), - ]); + + if !is_exposed { + widgets.extend_from_slice(&[ + Separator::new(SeparatorStyle::Unrelated).widget_instance(), + TextLabel::new("-") + .tooltip_label(format!("Data Type: {concrete_type}")) + .tooltip_description("This data can only be supplied through the node graph because no widget exists for its type.") + .widget_instance(), + ]); + } return Err(vec![widgets.into()]); } } @@ -2172,6 +2180,8 @@ pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> pub struct ParameterWidgetsInfo<'a> { persistent_data: &'a PersistentData, + network_interface: &'a NodeNetworkInterface, + selection_network_path: &'a [NodeId], document_node: Option<&'a DocumentNode>, node_id: NodeId, index: usize, @@ -2193,6 +2203,8 @@ impl<'a> ParameterWidgetsInfo<'a> { ParameterWidgetsInfo { persistent_data: context.persistent_data, + network_interface: context.network_interface, + selection_network_path: context.selection_network_path, document_node, node_id, index, From 281533e9bab97eeaadc2f57e7721716b1b8e4b02 Mon Sep 17 00:00:00 2001 From: Kulratan Thapar Date: Mon, 16 Feb 2026 21:01:05 +0000 Subject: [PATCH 3/4] cleanup --- .../portfolio/document/node_graph/node_properties.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 0e926d9343..0936067f63 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -260,11 +260,7 @@ pub(crate) fn property_from_type( // OTHER // ===== _ => { - let is_exposed = default_info - .document_node - .and_then(|node| node.inputs.get(default_info.index)) - .map(|input| input.is_exposed()) - .unwrap_or(false); + let is_exposed = default_info.is_exposed(); let mut widgets = start_widgets(default_info); @@ -2215,6 +2211,10 @@ impl<'a> ParameterWidgetsInfo<'a> { exposable: true, } } + + pub fn is_exposed(&self) -> bool { + self.document_node.and_then(|node| node.inputs.get(self.index)).map(|input| input.is_exposed()).unwrap_or(false) + } } pub mod choice { From a7fe7557bef2ff7f51e7877bf5c6a8c6fab0c3ee Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Wed, 18 Feb 2026 01:47:03 -0800 Subject: [PATCH 4/4] Update labels --- .../document/node_graph/node_properties.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 0936067f63..eb08935e7c 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -84,12 +84,21 @@ pub fn jump_to_source_widget(input: &NodeInput, network_interface: &NodeNetworkI NodeInput::Node { node_id: source_id, .. } => { let source_id = *source_id; let node_name = network_interface.implementation_name(&source_id, selection_network_path); - TextButton::new(format!("Select Source: {}", node_name)) - .tooltip_description("Jump to the source node connected to this input.") + TextButton::new(format!("From Graph ({})", node_name)) + .tooltip_description("Click to select the node producing this parameter's data.") .on_update(move |_| NodeGraphMessage::SelectedNodesSet { nodes: vec![source_id] }.into()) .widget_instance() } - _ => TextLabel::new("Input Not Connected").tooltip_description("No node connected.").widget_instance(), + _ => TextLabel::new("From Graph (Disconnected)") + .tooltip_description( + " + This parameter is exposed as an input in the node graph, but not currently receiving data from any node.\n\ + \n\ + In the graph, drag a wire out from a compatible output connector of another node, and feed it into the input connector of this exposed node parameter. Alternatively, un-expose this parameter by clicking the triangle directly to the left of here. + " + .trim(), + ) + .widget_instance(), } }