From 7a9a6bd98e4ba5b75d4348d8cbc8ded3fe6d2704 Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Wed, 11 Nov 2026 14:23:56 -0800 Subject: [PATCH] Guides: a sublayer guide in a hidden or locked group keeps that state When a layer effect moves a sublayer's ruler guides onto the layer, a guide inside a hidden or locked group now stays hidden or locked, as it does for a hidden or locked sublayer. --- crates/effects/src/group.rs | 4 ++-- crates/effects/src/group/tests.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/crates/effects/src/group.rs b/crates/effects/src/group.rs index 73abbffb2..57f2fc861 100644 --- a/crates/effects/src/group.rs +++ b/crates/effects/src/group.rs @@ -726,12 +726,12 @@ fn sublayer_guides(n: &Node) -> bool { /// Move the ruler guides of the sublayers among the members of `n`, and among its groups' /// members, to `out`, in order. A guide taken from a hidden or locked sublayer, or from one inside -/// such a sublayer, is hidden or locked itself. Only containers holding one are copied. +/// such a sublayer or group, is hidden or locked itself. Only containers holding one are copied. fn take_sublayer_guides(n: &mut Node, out: &mut Vec>, hidden: bool, locked: bool) { let Some(ch) = n.children_mut() else { return }; for c in ch.iter_mut().filter(|c| c.holds_ruler_guides() || (!c.is_layer() && sublayer_guides(c))) { let c = Arc::make_mut(c); - let (hidden, locked) = if c.is_layer() { (hidden || !c.visible, locked || c.locked) } else { (hidden, locked) }; + let (hidden, locked) = (hidden || !c.visible, locked || c.locked); if c.is_layer() && let Some(lc) = c.children_mut() { diff --git a/crates/effects/src/group/tests.rs b/crates/effects/src/group/tests.rs index ef242c5dc..16e893ce9 100644 --- a/crates/effects/src/group/tests.rs +++ b/crates/effects/src/group/tests.rs @@ -903,3 +903,29 @@ fn a_sublayers_ruler_guides_survive_its_layers_effects() { } } } + +/// A sublayer's ruler guide inside a hidden or locked group stays hidden or locked when its layer's +/// Pathfinder effect moves it onto the layer, as the group made it. +#[test] +fn a_sublayers_ruler_guide_in_a_hidden_or_locked_group_stays_hidden_or_locked() { + use vectorcraft_doc::LayerColor; + for (hidden, locked) in [(true, false), (false, true), (false, false)] { + let mut sub = Node::layer(NodeId(11), "Sub", LayerColor::Preset(1)); + if let Some(ch) = sub.children_mut() { + *ch = vec![ + sq(2, 5.0, Color::rgb(0.0, 0.0, 1.0)), + Arc::new(Node::new(NodeId(20), NodeKind::RulerGuide { vertical: true, pos: 3.0, artboard: None })), + ]; + } + let mut group = Node::group(NodeId(12), vec![Arc::new(sub)]); + (group.visible, group.locked) = (!hidden, locked); + let mut l = Node::layer(NodeId(10), "Layer 1", LayerColor::Preset(0)); + if let Some(ch) = l.children_mut() { + *ch = vec![sq(1, 0.0, Color::rgb(1.0, 0.0, 0.0)), Arc::new(group)]; + } + l.appearance.effects.push(Effect { id: "pathfinder.add".into(), params: serde_json::json!({}), visible: true }); + let art = evaluate_container(None, &l).unwrap(); + let guides: Vec<_> = art.children().into_iter().flatten().filter(|c| c.is_ruler_guide()).map(|c| (c.id, c.visible, c.locked)).collect(); + assert_eq!(guides, [(NodeId(20), !hidden, locked)], "hidden {hidden}, locked {locked}"); + } +}