mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-26 18:56:55 -06:00
Fix #340: new layers and sublayers share one "Layer N" numbering
A new sublayer was named "Layer {node_count}", counting every object, so
an empty document's first sublayer was "Layer 1" like its parent and a
document with five objects got "Layer 6". Top-level layers counted only
top-level names and could repeat a sublayer's. Document::next_layer_name
now counts every layer, sublayers included, and skips any layer's name;
layer.newSublayer uses it too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
committed by
bflatastic
co-authored by
Claude Opus 5.5
parent
3cd2fddeda
commit
6d1d94bf11
+10
-2
@@ -810,11 +810,19 @@ impl Document {
|
||||
self.layers.push(Arc::new(Node::layer(id, &name, LayerColor::Preset((n % LAYER_COLORS.len()) as u8))));
|
||||
id
|
||||
}
|
||||
/// The default name of a new layer or sublayer, "Layer N". Layers and sublayers share the
|
||||
/// numbering: it starts after the number of layers there are and skips any layer's name.
|
||||
pub fn next_layer_name(&self) -> String {
|
||||
let mut i = self.layers.len() + 1;
|
||||
let mut names = Vec::new();
|
||||
self.walk(|n| {
|
||||
if n.is_layer() {
|
||||
names.push(n.name.as_deref().unwrap_or_default());
|
||||
}
|
||||
});
|
||||
let mut i = names.len() + 1;
|
||||
loop {
|
||||
let name = format!("Layer {i}");
|
||||
if !self.layers.iter().any(|l| l.name.as_deref() == Some(&name)) {
|
||||
if !names.contains(&name.as_str()) {
|
||||
return name;
|
||||
}
|
||||
i += 1;
|
||||
|
||||
@@ -570,3 +570,20 @@ fn a_panicking_command_rolls_back_instead_of_crashing() {
|
||||
assert!(s.doc().unwrap().doc.node(b).is_some());
|
||||
assert_eq!(s.journal.last().map(|j| j.0.as_str()), Some("shape.rectangle"));
|
||||
}
|
||||
|
||||
/// New layers and sublayers share one "Layer N" numbering, whatever art the document holds, and
|
||||
/// never repeat a name.
|
||||
#[test]
|
||||
fn new_layers_and_sublayers_are_numbered_together() {
|
||||
let name = |s: &Session, id: &Value| s.doc().unwrap().doc.node(NodeId(id["id"].as_u64().unwrap())).unwrap().display_name().to_string();
|
||||
let mut s = session();
|
||||
let sub = s.execute("layer.newSublayer", &json!({})).unwrap();
|
||||
assert_eq!(name(&s, &sub), "Layer 2", "not its parent's name");
|
||||
for x in [0.0, 60.0, 120.0, 180.0, 240.0] {
|
||||
rect(&mut s, x, 0.0, 50.0, 50.0);
|
||||
}
|
||||
let layer = s.execute("layer.new", &json!({})).unwrap();
|
||||
assert_eq!(name(&s, &layer), "Layer 3", "after the sublayer, not a repeat of it");
|
||||
let sub = s.execute("layer.newSublayer", &json!({})).unwrap();
|
||||
assert_eq!(name(&s, &sub), "Layer 4", "the art doesn't count");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user