diff --git a/document-legacy/src/document.rs b/document-legacy/src/document.rs index bb4f45a6..37a9adbe 100644 --- a/document-legacy/src/document.rs +++ b/document-legacy/src/document.rs @@ -718,7 +718,11 @@ impl Document { let layer = self.layer(&path)?.clone(); let (folder_path, _) = split_path(path.as_slice()).unwrap_or((&[], 0)); let folder = self.folder_mut(folder_path)?; - if let Some(new_layer_id) = folder.add_layer(layer, None, -1) { + + let selected_id = path.last().copied().unwrap_or_default(); + let insert_index = folder.layer_ids.iter().position(|&id| id == selected_id).unwrap_or(0) as isize + 1; + + if let Some(new_layer_id) = folder.add_layer(layer, None, insert_index) { let new_path = [folder_path, &[new_layer_id]].concat(); self.mark_as_dirty(folder_path)?; Some( diff --git a/document-legacy/src/layers/folder_layer.rs b/document-legacy/src/layers/folder_layer.rs index d68fbc62..c870f50f 100644 --- a/document-legacy/src/layers/folder_layer.rs +++ b/document-legacy/src/layers/folder_layer.rs @@ -70,31 +70,31 @@ impl FolderLayer { pub fn add_layer(&mut self, layer: Layer, id: Option, insert_index: isize) -> Option { let mut insert_index = insert_index as i128; + // Bounds check for the insert index if insert_index < 0 { insert_index = self.layers.len() as i128 + insert_index + 1; } - - if insert_index <= self.layers.len() as i128 && insert_index >= 0 { - if let Some(id) = id { - self.next_assignment_id = id; - } - if self.layer_ids.contains(&self.next_assignment_id) { - return None; - } - - let id = self.next_assignment_id; - self.layers.insert(insert_index as usize, layer); - self.layer_ids.insert(insert_index as usize, id); - - // Linear probing for collision avoidance - while self.layer_ids.contains(&self.next_assignment_id) { - self.next_assignment_id += 1; - } - - Some(id) - } else { - None + if insert_index > self.layers.len() as i128 || insert_index < 0 { + return None; } + + if let Some(id) = id { + self.next_assignment_id = id; + } + if self.layer_ids.contains(&self.next_assignment_id) { + return None; + } + + let id = self.next_assignment_id; + self.layers.insert(insert_index as usize, layer); + self.layer_ids.insert(insert_index as usize, id); + + // Linear probing for collision avoidance + while self.layer_ids.contains(&self.next_assignment_id) { + self.next_assignment_id += 1; + } + + Some(id) } /// Remove a layer with a given ID from the folder.