diff --git a/core/document/src/document.rs b/core/document/src/document.rs index 260a0fc8..d268203d 100644 --- a/core/document/src/document.rs +++ b/core/document/src/document.rs @@ -140,6 +140,24 @@ impl Document { Ok(root) } + /// Returns a reference to the layer or folder at the path. Does not return an error for root + pub fn document_layer(&mut self, path: &[LayerId]) -> Result<&Layer, DocumentError> { + if path.is_empty() { + return Ok(&self.root); + } + let (path, id) = split_path(path)?; + self.document_folder(path)?.as_folder()?.layer(id).ok_or(DocumentError::LayerNotFound) + } + + /// Returns a mutable reference to the layer or folder at the path. Does not return an error for root + pub fn document_layer_mut(&mut self, path: &[LayerId]) -> Result<&mut Layer, DocumentError> { + if path.is_empty() { + return Ok(&mut self.root); + } + let (path, id) = split_path(path)?; + self.document_folder_mut(path)?.as_folder_mut()?.layer_mut(id).ok_or(DocumentError::LayerNotFound) + } + /// Returns a reference to the layer struct at the specified `path`. pub fn layer(&self, path: &[LayerId]) -> Result<&Layer, DocumentError> { let (path, id) = split_path(path)?; @@ -291,10 +309,11 @@ impl Document { None } Operation::TransformLayer { path, transform } => { - let transform = self.root.transform * DAffine2::from_cols_array(&transform); - let layer = self.document_folder_mut(path).unwrap(); + let layer = self.document_layer_mut(path).unwrap(); + let transform = DAffine2::from_cols_array(&transform) * layer.transform; layer.transform = transform; layer.cache_dirty = true; + self.root.cache_dirty = true; Some(vec![DocumentResponse::DocumentChanged]) } Operation::DiscardWorkingFolder => {