From e811b65e82c2565682ed18042cb3b4e7239a9825 Mon Sep 17 00:00:00 2001 From: paaspaas00 <151774837+paaspaas00@users.noreply.github.com> Date: Wed, 21 Oct 2026 12:38:29 +0200 Subject: [PATCH] Clear Fitting Options skips locked frames Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/cmd/object.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/crates/engine/src/cmd/object.rs b/crates/engine/src/cmd/object.rs index f709b6dec..2fa9f4117 100644 --- a/crates/engine/src/cmd/object.rs +++ b/crates/engine/src/cmd/object.rs @@ -2900,6 +2900,10 @@ fn clear_fitting_options(s: &mut Session, p: &Value) -> Result { s.edit(|d, _| { let mut n = 0; for id in &ids { + // Locked frames (or frames on a locked layer) keep their options, as with Fit. + if !d.item(*id).is_some_and(|it| unlocked(d, it)) { + continue; + } let Some(it) = d.item_mut(*id) else { continue }; let Content::Graphic(g) = &mut it.content else { continue }; g.auto_fit = designcraft_doc::Fitting::None; @@ -4313,6 +4317,10 @@ mod fitting_tests { assert_eq!(g.xf, before.xf, "the picture stays where it is"); s.execute("edit.undo", &json!({})).unwrap(); assert_eq!(graphic(&s).crop, [10.0; 4], "one undo step"); + s.execute("object.lock", &json!({"ids": [f]})).unwrap(); + let r = s.execute("object.clearFittingOptions", &json!({"ids": [f]})).unwrap(); + assert_eq!(r["changed"], 0); + assert_eq!(graphic(&s).crop, [10.0; 4], "a locked frame keeps its options"); } }