forked from 1b-agent/opencadstudio-upstream
fix(layers): sync header CLAYER when making a layer current (#93)
Making a layer current via the layer manager (LayerSetCurrent) or
LAYMCUR updated only the per-tab active_layer, not the document
header's current_layer_name/handle. The no-selection ribbon refresh
reads the header layer, so after the change an Esc (deselect ->
refresh_properties) snapped the active-layer dropdown back to the
stale header value ("0") even though new entities still used the
correct active layer. Mirror the change into the header in both paths,
matching the ribbon dropdown's own set-current path.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
5848569368
commit
8d6e21ef5f
2 files changed
+28
No files matched your search
@@ -232,9 +232,23 @@ impl OpenCADStudio {
|
||||
self.tabs[i].active_cmd = Some(Box::new(cmd));
|
||||
} else {
|
||||
let layer = entities[0].1.common().layer.clone();
|
||||
// Keep the document header (CLAYER) in sync, not just the
|
||||
// per-tab default, so a later no-selection ribbon refresh
|
||||
// (e.g. after Esc) doesn't snap back to the stale header
|
||||
// layer. See #93.
|
||||
let handle = self.tabs[i]
|
||||
.scene
|
||||
.document
|
||||
.layers
|
||||
.get(&layer)
|
||||
.map(|l| l.handle)
|
||||
.unwrap_or(acadrust::types::Handle::NULL);
|
||||
self.tabs[i].scene.document.header.current_layer_name = layer.clone();
|
||||
self.tabs[i].scene.document.header.current_layer_handle = handle;
|
||||
self.tabs[i].active_layer = layer.clone();
|
||||
self.ribbon.active_layer = layer.clone();
|
||||
self.tabs[i].layers.current_layer = layer.clone();
|
||||
self.tabs[i].dirty = true;
|
||||
self.command_line
|
||||
.push_info(&format!("Current layer set to \"{layer}\"."));
|
||||
self.refresh_layer_panel();
|
||||
|
||||
@@ -1826,8 +1826,22 @@ impl OpenCADStudio {
|
||||
if let Some(idx) = self.tabs[i].layers.selected {
|
||||
if let Some(layer) = self.tabs[i].layers.layers.get(idx) {
|
||||
let name = layer.name.clone();
|
||||
// Mirror the change into the document header (CLAYER) too,
|
||||
// not just the per-tab default. Otherwise the no-selection
|
||||
// ribbon refresh (e.g. after Esc) re-reads the stale header
|
||||
// layer and the dropdown snaps back to it. See #93.
|
||||
let handle = self.tabs[i]
|
||||
.scene
|
||||
.document
|
||||
.layers
|
||||
.get(&name)
|
||||
.map(|l| l.handle)
|
||||
.unwrap_or(acadrust::types::Handle::NULL);
|
||||
self.tabs[i].scene.document.header.current_layer_name = name.clone();
|
||||
self.tabs[i].scene.document.header.current_layer_handle = handle;
|
||||
self.tabs[i].active_layer = name.clone();
|
||||
self.tabs[i].layers.current_layer = name.clone();
|
||||
self.tabs[i].dirty = true;
|
||||
self.ribbon.active_layer = name;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user