From 4b130b4319acd952e4030a43a853f87cdd595a45 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Sat, 22 Aug 2026 11:48:27 +0000 Subject: [PATCH] Map element-typed wires to their list forms' defaults and widgets --- .../portfolio/document/node_graph/node_properties.rs | 4 ++++ node-graph/graph-craft/src/document/value.rs | 9 +++++++++ 2 files changed, 13 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 ecf9adf933..be62ab3e70 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -252,6 +252,10 @@ pub(crate) fn property_from_type( Some(x) if x == TypeId::of::>() => color_widget(default_info, ColorInput::default().allow_none(true)), Some(x) if x == TypeId::of::>() => color_widget(default_info, ColorInput::default().allow_none(false)), Some(x) if x == TypeId::of::>() => brush_strokes_widget(default_info).into(), + // Leveled wires type by their element; each element keeps its list form's widget. + Some(x) if x == TypeId::of::() => color_widget(default_info, ColorInput::default().allow_none(true)), + Some(x) if x == TypeId::of::() => color_widget(default_info, ColorInput::default().allow_none(false)), + Some(x) if x == TypeId::of::() => brush_strokes_widget(default_info).into(), // ============ // STRUCT TYPES // ============ diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 6b6b59de8a..c63822646a 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -453,6 +453,15 @@ macro_rules! tagged_value { $( if name == std::any::type_name::<$ty>() { return Some(TaggedValue::$identifier(Default::default())) } )* if name == std::any::type_name::>() { return Some(TaggedValue::F64Array(Vec::new())) } if name == std::any::type_name::>() { return Some(TaggedValue::BrushStrokes(Vec::new())) } + // Leveled wires type by their element; each element name maps to the + // same tagged default as its legacy list form. + if name == std::any::type_name::() { return Some(TaggedValue::Color(Some(Color::default()))) } + if name == std::any::type_name::() { return Some(TaggedValue::Gradient(GradientStops::default())) } + if name == std::any::type_name::() { return Some(TaggedValue::BrushStrokes(Vec::new())) } + if name == std::any::type_name::() { return Some(TaggedValue::TypeDefault(core_types::descriptor!(List))) } + if name == std::any::type_name::() { return Some(TaggedValue::TypeDefault(core_types::descriptor!(List))) } + if name == std::any::type_name::>() { return Some(TaggedValue::TypeDefault(core_types::descriptor!(List>))) } + if name == std::any::type_name::() { return Some(TaggedValue::TypeDefault(core_types::descriptor!(List))) } // Types whose `TaggedValue` variant has been removed. They route through `TypeDefault` instead, with `to_dynany`/`to_any` constructing the actual default at execution time. macro_rules! check { ($type_default:ty) => {