fix(layers): carry layer name instead of row index in Message::Layer*

Closes the view-to-dispatch resort race: the nine Layer* variants plus ColorPickTarget::Layer now carry the layer name and resolve to the current panel row at dispatch time via layer_panel_index; unknown names no-op. View sites (layer panel, ribbon dropdown) and the CLI/plugin path send names, so the CLI position lookup and the ribbon enumerate are deleted. Panel-internal selection state stays index-based. Tests: layer_toggle_visible_targets_layer_by_name_after_resort pins name targeting across a re-sort; layer_toggle_visible_unknown_name_is_noop pins the graceful no-op. Full suite: 1974 passed / 0 failed / 25 ignored.
This commit is contained in:
Karim Jerbi committed 2026-10-05 22:46:01 +01:00
1 parent c5f8eb2921
commit 5f016e1192
7 files changed
+186 -52

No files matched your search

+15 -11
View File
@@ -1226,20 +1226,24 @@ impl OpenCADStudio {
"undo" => Message::Undo,
"redo" => Message::Redo,
"layer_visible" | "layer_locked" | "layer_frozen" | "layer_current" => {
let layer = string(req, "layer")?;
// The Layer* messages index the panel's (sortable) row list.
let index = self.tabs[self.active_tab]
let layer = string(req, "layer")?.to_string();
// The Layer* messages carry the layer name and resolve it to
// the current panel row at dispatch time (#22) — no index
// lookup here, so panel sort order cannot mistarget the CLI.
if !self.tabs[self.active_tab]
.scene
.document
.layers
.layers
.iter()
.position(|l| l.name == layer)
.ok_or_else(|| failure("unknown_layer", "Layer does not exist"))?;
.contains(&layer)
{
return Err(failure("unknown_layer", "Layer does not exist"));
}
match name {
"layer_visible" => Message::LayerToggleVisible(index),
"layer_locked" => Message::LayerToggleLock(index),
"layer_frozen" => Message::LayerToggleFreeze(index),
"layer_visible" => Message::LayerToggleVisible(layer),
"layer_locked" => Message::LayerToggleLock(layer),
"layer_frozen" => Message::LayerToggleFreeze(layer),
_ => {
let select = self.update(Message::LayerSelect(index));
let select = self.update(Message::LayerSelect(layer));
let current = self.update(Message::LayerSetCurrent);
return Ok(Task::batch([select, current]));
}