fix: prevent interaction with hidden layers

This commit is contained in:
gianlucafiore committed 2026-10-07 19:22:44 -03:00
1 parent 1bf584a1c1
commit 7b7aa0d429
1 file changed
+47 -3
+47 -3
View File
@@ -9652,12 +9652,28 @@ impl Scene {
} }
} }
} }
let block = self.interaction_block_handle();
let frozen: Option<HashSet<Handle>> = self
.interaction_viewport_frozen_layers()
.map(|layers| layers.iter().copied().collect());
let annotation_scale_handle = self.displayed_annotation_scale_handle();
let all_visible = self.annotation_all_visible();
let changed_live: Vec<Handle> = changes let changed_live: Vec<Handle> = changes
.iter() .iter()
.filter_map(|(handle, kind)| { .filter_map(|(handle, kind)| {
(!matches!(kind, ChangeKind::Removed) if matches!(kind, ChangeKind::Removed) {
&& !self.entity_temporarily_hidden(*handle) return None;
&& self.document.get_entity(*handle).is_some()) }
let entity = self.document.get_entity(*handle)?;
self.resident_entity_visible(
entity,
block,
frozen.as_ref(),
annotation_scale_handle,
all_visible,
)
.then_some(*handle) .then_some(*handle)
}) })
.collect(); .collect();
@@ -11957,6 +11973,34 @@ vis_index={:.1} visible_probe={:.1}",
/// block users re-expand, since their definitions bake the children's /// block users re-expand, since their definitions bake the children's
/// visibility. Nothing is recoloured. /// visibility. Nothing is recoloured.
pub fn invalidate_layer_visibility(&mut self, names: &[String]) { pub fn invalidate_layer_visibility(&mut self, names: &[String]) {
// Turning a layer off or freezing it removes its entities from the
// interactive scene as well as from rendering. Drop any entities that
// were already selected before the visibility change, otherwise a
// subsequent MOVE/ERASE/etc. could still modify invisible geometry.
let block = self.interaction_block_handle();
let frozen: Option<HashSet<Handle>> = self
.interaction_viewport_frozen_layers()
.map(|layers| layers.iter().copied().collect());
let annotation_scale_handle = self.displayed_annotation_scale_handle();
let all_visible = self.annotation_all_visible();
let visible_selection: Vec<Handle> = self
.selected_handles_in_order()
.into_iter()
.filter(|handle| {
self.document.get_entity(*handle).is_some_and(|entity| {
self.resident_entity_visible(
entity,
block,
frozen.as_ref(),
annotation_scale_handle,
all_visible,
)
})
})
.collect();
self.replace_selection_exact(&visible_selection);
let targets = self.dependency_targets(DependencyKind::Layer, names); let targets = self.dependency_targets(DependencyKind::Layer, names);
if targets.render_handles.is_empty() { if targets.render_handles.is_empty() {
return; return;