From eced65551c5b6c445cfe947ea084eb142ca2157e Mon Sep 17 00:00:00 2001 From: Kulratan Thapar Date: Thu, 5 Feb 2026 05:49:46 +0000 Subject: [PATCH 1/3] 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 bd5cc08dba..71d18bd9e8 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -78,6 +78,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, @@ -105,6 +122,17 @@ pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec Date: Mon, 16 Feb 2026 20:53:25 +0000 Subject: [PATCH 2/3] 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 71d18bd9e8..c2c00806b6 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; @@ -78,20 +78,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(), } } @@ -105,6 +102,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()]); } } @@ -2169,6 +2177,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, @@ -2190,6 +2200,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 bb1f3946d85f80ffea139d7e1f138d339daa9288 Mon Sep 17 00:00:00 2001 From: Kulratan Thapar Date: Mon, 16 Feb 2026 21:01:05 +0000 Subject: [PATCH 3/3] 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 c2c00806b6..2731d90dd6 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -257,11 +257,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); @@ -2212,6 +2208,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 {