diff --git a/node-graph/libraries/rendering/src/renderer.rs b/node-graph/libraries/rendering/src/renderer.rs index cb1f6030ad..7e538acc75 100644 --- a/node-graph/libraries/rendering/src/renderer.rs +++ b/node-graph/libraries/rendering/src/renderer.rs @@ -553,7 +553,7 @@ impl Render for Graphic { Graphic::Color(list) => list.render_svg(render, render_params), Graphic::Gradient(list) => list.render_svg(render, render_params), Graphic::Text(list) => list.render_svg(render, render_params), - Graphic::Group(_) => (), + Graphic::Group(group) => graphic_types::graphic::group_to_legacy_list(group).render_svg(render, render_params), } } @@ -566,14 +566,16 @@ impl Render for Graphic { Graphic::Color(list) => list.render_to_vello(scene, transform, context, render_params), Graphic::Gradient(list) => list.render_to_vello(scene, transform, context, render_params), Graphic::Text(list) => list.render_to_vello(scene, transform, context, render_params), - Graphic::Group(_) => (), + Graphic::Group(group) => graphic_types::graphic::group_to_legacy_list(group).render_to_vello(scene, transform, context, render_params), } } fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, element_id: Option) { if let Some(element_id) = element_id { match self { - Graphic::Group(_) => {} + Graphic::Group(_) => { + metadata.upstream_footprints.insert(element_id, footprint); + } Graphic::Graphic(_) => { metadata.upstream_footprints.insert(element_id, footprint); } @@ -640,7 +642,7 @@ impl Render for Graphic { Graphic::Color(list) => list.collect_metadata(metadata, footprint, element_id), Graphic::Gradient(list) => list.collect_metadata(metadata, footprint, element_id), Graphic::Text(list) => list.collect_metadata(metadata, footprint, element_id), - Graphic::Group(_) => (), + Graphic::Group(group) => graphic_types::graphic::group_to_legacy_list(group).collect_metadata(metadata, footprint, element_id), } } @@ -653,7 +655,7 @@ impl Render for Graphic { Graphic::Color(list) => list.add_upstream_click_targets(click_targets), Graphic::Gradient(list) => list.add_upstream_click_targets(click_targets), Graphic::Text(list) => list.add_upstream_click_targets(click_targets), - Graphic::Group(_) => (), + Graphic::Group(group) => graphic_types::graphic::group_to_legacy_list(group).add_upstream_click_targets(click_targets), } } @@ -666,7 +668,7 @@ impl Render for Graphic { Graphic::Color(list) => list.add_upstream_outline_targets(outlines), Graphic::Gradient(list) => list.add_upstream_outline_targets(outlines), Graphic::Text(list) => list.add_upstream_outline_targets(outlines), - Graphic::Group(_) => (), + Graphic::Group(group) => graphic_types::graphic::group_to_legacy_list(group).add_upstream_outline_targets(outlines), } } diff --git a/node-graph/nodes/graphic/src/record.rs b/node-graph/nodes/graphic/src/record.rs index c7c5ba069e..3218e829e1 100644 --- a/node-graph/nodes/graphic/src/record.rs +++ b/node-graph/nodes/graphic/src/record.rs @@ -631,6 +631,37 @@ mod tests { } } + #[test] + fn a_group_converts_to_its_legacy_list() { + let arena = Arena::new(1 << 16).unwrap(); + let generations = []; + let scope = scope_fixture(&generations, &arena); + let ctx = ContextImpl::root(&scope); + + let layout = graphic_layout(); + let rows = vec![(text("a"), translation(1.)), (text("b"), translation(2.))]; + let node = install( + WrapNode::new(RecordSource::new(GraphicSource { layout: layout.clone(), rows, }, &layout, &layout), &layout), + wrap_layout_meta(), + &[Some(&layout)], + ); + let out = Node::::layout(&node).clone(); + let head = ctx.index_head(); + let GPoll::Final(value) = node.eval(&ctx.promoted(&head, 0)) else { + panic!("expected a final record"); + }; + let Graphic::Group(group) = (unsafe { record::borrow_element::(out.rec(&value)) }) else { + panic!("expected a group element"); + }; + + let legacy = graphic_types::graphic::group_to_legacy_list(group); + assert_eq!(legacy.len(), 2); + for (index, (label, x)) in [("a", 1.), ("b", 2.)].into_iter().enumerate() { + assert_eq!(text_of(legacy.element(index).unwrap()), label, "item {index}"); + assert_eq!(legacy.attribute_cloned_or_default::(ATTR_TRANSFORM, index).translation.x, x, "item {index}"); + } + } + #[test] fn flatten_reverses_wrap() { let arena = Arena::new(1 << 16).unwrap();