diff --git a/src/app/layers.rs b/src/app/layers.rs index 7b64c3b26..07e7d8b66 100644 --- a/src/app/layers.rs +++ b/src/app/layers.rs @@ -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 diff --git a/src/app/plugin_host.rs b/src/app/plugin_host.rs index 9f548eb26..6b1d737de 100644 --- a/src/app/plugin_host.rs +++ b/src/app/plugin_host.rs @@ -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(()) diff --git a/src/app/properties.rs b/src/app/properties.rs index 8161a2a1b..aefb4131b 100644 --- a/src/app/properties.rs +++ b/src/app/properties.rs @@ -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 } } diff --git a/src/scene/entity.rs b/src/scene/entity.rs index de7700ca8..9c22246bb 100644 --- a/src/scene/entity.rs +++ b/src/scene/entity.rs @@ -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) {