Review: one Selection::deselect_uneditable for the hide and lock commands; ROADMAP (#1107)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bflatastic
2026-10-11 11:33:05 +07:00
co-authored by Claude Opus 5.5
parent 975dea056c
commit d10962ac45
5 changed files with 14 additions and 21 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+9
View File
@@ -138,6 +138,15 @@ impl Selection {
// Guides on a hidden or locked layer can't stay selected.
self.guides.retain(|i| doc.guides.get(*i).is_some_and(|g| doc.guide_editable(g)));
}
/// Deselect the objects that are hidden or locked, themselves or through a group or layer
/// around them (and so the key object when it is one): hidden or locked art can't stay
/// selected.
pub fn deselect_uneditable(&mut self, doc: &Document) {
let out: Vec<NodeId> = self.objects.iter().copied().filter(|o| !doc.is_editable(*o)).collect();
for o in out {
self.remove(o);
}
}
/// Target `id` (see [`Selection::target`]): a layer gets its visible, unlocked art selected
/// (the art of its sublayers too), anything else is selected itself.
pub fn set_target(&mut self, doc: &Document, id: NodeId) {
+1 -5
View File
@@ -551,11 +551,7 @@ fn set_props(s: &mut Session, p: &Value) -> Result<Value> {
for id in &ids {
apply_options(d.node_mut(*id).ok_or(EngineError::NoNode(*id))?, p);
}
// Hidden or locked content can't stay selected.
let hidden: Vec<NodeId> = sel.objects.iter().copied().filter(|o| !d.is_editable(*o)).collect();
for h in hidden {
sel.remove(h);
}
sel.deselect_uneditable(d);
Ok(())
})?;
ok()
+1 -5
View File
@@ -188,11 +188,7 @@ fn set_flag(s: &mut Session, ids: Vec<NodeId>, flag: Flag, v: bool, label: &str)
flag.set(n, v);
}
}
// Hidden or locked art can't stay selected.
let out: Vec<NodeId> = sel.objects.iter().copied().filter(|o| !d.is_editable(*o)).collect();
for o in out {
sel.remove(o);
}
sel.deselect_uneditable(d);
Ok(())
})?;
}
+2 -10
View File
@@ -876,12 +876,7 @@ fn set_props(s: &mut Session, p: &Value) -> Result<Value> {
if ids.iter().all(|id| d.node(*id).is_some_and(has_values)) {
// Hidden or locked objects can't stay selected.
if hides {
s.select(|d, sel| {
let hidden: Vec<NodeId> = sel.objects.iter().copied().filter(|o| !d.is_editable(*o)).collect();
for h in hidden {
sel.remove(h);
}
})?;
s.select(|d, sel| sel.deselect_uneditable(d))?;
}
return ok();
}
@@ -933,10 +928,7 @@ fn set_props(s: &mut Session, p: &Value) -> Result<Value> {
}
// Hidden or locked objects can't stay selected.
if hides {
let hidden: Vec<NodeId> = sel.objects.iter().copied().filter(|o| !d.is_editable(*o)).collect();
for h in hidden {
sel.remove(h);
}
sel.deselect_uneditable(d);
}
Ok(())
})?;