fix(layer): keep auto-registered layer names verbatim; one sync helper

ensure_layer had started trimming the name, so an entity on " A" got a
table entry "A" it never resolves to. Register the name as given again
and drop the unused return value. The five copies of the dirty-flag check
become sync_registered_layers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hakan SevenandClaude Opus 5.5 committed 2026-10-03 14:59:30 +03:00
1 parent 1b04bda547
commit e3c0d456f2
4 files changed
+20 -32

No files matched your search

+9
View File
@@ -68,6 +68,15 @@ impl OpenCADStudio {
self.sync_ribbon_layers();
}
/// Pick up layers an entity edit registered on the fly (`ensure_layer`).
pub(super) fn sync_registered_layers(&mut self, tab: usize) {
if !std::mem::take(&mut self.tabs[tab].scene.layer_table_dirty) {
return;
}
self.tabs[tab].dirty = true;
self.refresh_layer_panel();
}
pub(super) fn sync_ribbon_layers(&mut self) {
let i = self.active_tab;
// The Start (welcome) tab has no document — leave the layer and
+4 -20
View File
@@ -350,11 +350,7 @@ impl<'a> HostSession<'a> {
return handle;
}
let handle = self.app.tabs[self.tab].scene.add_entity(entity);
if self.app.tabs[self.tab].scene.layer_table_dirty {
self.app.tabs[self.tab].scene.layer_table_dirty = false;
self.app.tabs[self.tab].dirty = true;
self.app.refresh_layer_panel();
}
self.app.sync_registered_layers(self.tab);
self.publish_document_view();
handle
}
@@ -367,11 +363,7 @@ impl<'a> HostSession<'a> {
let _ = self.normalize_scripted_entity(None, entity);
}
let handles = self.app.tabs[self.tab].scene.add_entities(entities);
if self.app.tabs[self.tab].scene.layer_table_dirty {
self.app.tabs[self.tab].scene.layer_table_dirty = false;
self.app.tabs[self.tab].dirty = true;
self.app.refresh_layer_panel();
}
self.app.sync_registered_layers(self.tab);
self.publish_document_view();
handles
}
@@ -391,11 +383,7 @@ impl<'a> HostSession<'a> {
EntityType::AttributeEntity(attribute) => self.replace_nested_attribute(attribute),
entity => self.app.tabs[self.tab].scene.update_entity(entity),
};
if self.app.tabs[self.tab].scene.layer_table_dirty {
self.app.tabs[self.tab].scene.layer_table_dirty = false;
self.app.tabs[self.tab].dirty = true;
self.app.refresh_layer_panel();
}
self.app.sync_registered_layers(self.tab);
if ok {
self.publish_document_view();
}
@@ -454,11 +442,7 @@ impl<'a> HostSession<'a> {
};
assert!(updated);
}
if self.app.tabs[self.tab].scene.layer_table_dirty {
self.app.tabs[self.tab].scene.layer_table_dirty = false;
self.app.tabs[self.tab].dirty = true;
self.app.refresh_layer_panel();
}
self.app.sync_registered_layers(self.tab);
self.set_dirty();
self.publish_document_view();
Ok(())
+1 -5
View File
@@ -3491,11 +3491,7 @@ handles={handles_ms:.1} panel={:.1} ribbon={ribbon_ms:.1} tail={:.1} selected={}
if tracks_dimension_chain {
self.tabs[i].scene.last_created_dimension = new_handle;
}
if self.tabs[i].scene.layer_table_dirty {
self.tabs[i].scene.layer_table_dirty = false;
self.tabs[i].dirty = true;
self.refresh_layer_panel();
}
self.sync_registered_layers(i);
new_handle
}
}
+6 -7
View File
@@ -143,17 +143,16 @@ impl Scene {
/// layer 0. Auto-registering keeps it on its own layer (#252). Names are
/// registered verbatim so the writer's (case-insensitive) lookup matches;
/// the always-present default layer "0" and empty names are no-ops.
pub fn ensure_layer(&mut self, name: &str) -> bool {
let trimmed = name.trim();
if trimmed.is_empty() || trimmed == "0" || self.document.layers.contains(trimmed) {
return false;
/// Flags `layer_table_dirty` so the app refreshes its layer lists.
pub fn ensure_layer(&mut self, name: &str) {
if name.trim().is_empty() || self.document.layers.contains(name) {
return;
}
let mut layer = codec::tables::Layer::new(trimmed);
let mut layer = codec::tables::Layer::new(name);
layer.handle = self.document.allocate_handle();
let _ = self.document.layers.add(layer);
self.invalidate_layer_dependencies(&[trimmed.to_string()]);
self.invalidate_layer_dependencies(&[name.to_string()]);
self.layer_table_dirty = true;
true
}
pub(crate) fn ensure_app_id(&mut self, name: &str) {