From 4471260c00f9a4d5ace4a579409ad30a915c032a Mon Sep 17 00:00:00 2001 From: Karim Jerbi Date: Wed, 7 Oct 2026 23:43:32 +0100 Subject: [PATCH] fix(layers): push undo for transparency edits LayerTransparencyEdit applied without begin/commit_layer_undo, so the edit was permanent while every sibling arm is undoable. Mirrors the color arm inside the non-empty guard. Test: layer_transparency_edit_pushes_undo asserts the entry plus undo-restores (RED first). Full suite: 1991 passed / 0 failed / 25 ignored. --- src/app/update/command.rs | 31 +++++++++++++++++++++++++++++++ src/app/update/mod.rs | 30 ++++++++++++++++-------------- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/app/update/command.rs b/src/app/update/command.rs index 3a2b0e6d6..b4d3a51f7 100644 --- a/src/app/update/command.rs +++ b/src/app/update/command.rs @@ -4656,6 +4656,37 @@ mod layer_name_target_tests { .collect(); assert_eq!(before, after, "unknown name must change nothing"); } + + #[test] + fn layer_transparency_edit_pushes_undo() { + // #43: every sibling layer arm pushes an undo entry; transparency must too. + let mut app = OpenCADStudio::new_for_test(); + app.automation_op(r#"{"op":"new"}"#); + let i = app.active_tab; + app.finish_pending_history(i); + let before = app.tabs[i].history.undo_stack.len(); + let _ = app.update(Message::LayerTransparencyEdit("0".to_string(), "50".to_string())); + assert_eq!( + app.tabs[i].history.undo_stack.len(), + before + 1, + "transparency edit must push an undo entry like its siblings" + ); + let panel = app.tabs[i] + .layers + .layers + .iter() + .find(|l| l.name == "0") + .expect("layer 0 in panel"); + assert_eq!(panel.transparency, 50); + app.undo_active_tab(); + let panel = app.tabs[i] + .layers + .layers + .iter() + .find(|l| l.name == "0") + .expect("layer 0 in panel"); + assert_eq!(panel.transparency, 0, "undo must restore transparency"); + } } #[cfg(test)] diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 656af6fad..595eaf685 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -3717,23 +3717,25 @@ impl OpenCADStudio { // Apply the edited transparency to every selected layer (#236). if let Some(v) = val { let targets = self.layer_row_action_targets(i, idx); - for name in &targets { - if let Some(layer) = self.tabs[i].scene.document.layers.get_mut(name) { - layer.transparency = - codec::types::Transparency::from_percent(v as f64 / 100.0); - } - if let Some(pl) = self.tabs[i] - .layers - .layers - .iter_mut() - .find(|l| &l.name == name) - { - pl.transparency = v; - } - } if !targets.is_empty() { + let undo = self.begin_layer_undo(i, "LAYER TRANSPARENCY", &targets); + for name in &targets { + if let Some(layer) = self.tabs[i].scene.document.layers.get_mut(name) { + layer.transparency = + codec::types::Transparency::from_percent(v as f64 / 100.0); + } + if let Some(pl) = self.tabs[i] + .layers + .layers + .iter_mut() + .find(|l| &l.name == name) + { + pl.transparency = v; + } + } self.tabs[i].scene.invalidate_layer_dependencies(&targets); self.tabs[i].dirty = true; + self.commit_layer_undo(i, undo); } } Task::none()