forked from 1b-agent/opencadstudio-upstream
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:
1 parent
c5f8eb2921
commit
5f016e1192
7 files changed
+186
-52
No files matched your search
+15
-11
@@ -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]));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user