diff --git a/editor/src/document/document_message_handler.rs b/editor/src/document/document_message_handler.rs index b36f2fb773..65830015d4 100644 --- a/editor/src/document/document_message_handler.rs +++ b/editor/src/document/document_message_handler.rs @@ -181,7 +181,7 @@ impl DocumentMessageHandler { } pub fn selected_layers_without_children(&self) -> Vec<&[LayerId]> { - let unique_layers = self.graphene_document.shallowest_unique_layers(self.selected_layers()); + let unique_layers = GrapheneDocument::shallowest_unique_layers(self.selected_layers()); // We need to maintain layer ordering self.sort_layers(unique_layers.iter().copied()) diff --git a/editor/src/document/transformation.rs b/editor/src/document/transformation.rs index 1593b03f30..1bdb3c8bb1 100644 --- a/editor/src/document/transformation.rs +++ b/editor/src/document/transformation.rs @@ -241,7 +241,8 @@ impl<'a> Selected<'a> { let pivot = DAffine2::from_translation(*self.pivot); let transformation = pivot * delta * pivot.inverse(); - for layer_path in &self.selected { + // TODO: Cache the result of `shallowest_unique_layers` to avoid this heavy computation every frame of movement, see https://github.com/GraphiteEditor/Graphite/pull/481 + for layer_path in Document::shallowest_unique_layers(self.selected.iter().map(|path| path.as_slice())) { let parent_folder_path = &layer_path[..layer_path.len() - 1]; let original_layer_transforms = *self.original_transforms.get(layer_path).unwrap(); diff --git a/editor/src/viewport_tools/tools/select.rs b/editor/src/viewport_tools/tools/select.rs index 7f0d40e27d..4598f1b4ea 100644 --- a/editor/src/viewport_tools/tools/select.rs +++ b/editor/src/viewport_tools/tools/select.rs @@ -10,6 +10,7 @@ use crate::misc::{HintData, HintGroup, HintInfo, KeysGroup}; use crate::viewport_tools::snapping::SnapHandler; use crate::viewport_tools::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; +use graphene::document::Document; use graphene::intersection::Quad; use graphene::layers::style::{self, Fill, Stroke}; use graphene::Operation; @@ -225,10 +226,11 @@ impl Fsm for SelectToolFsmState { let mouse_delta = mouse_position - data.drag_current; let closest_move = data.snap_handler.snap_layers(document, &data.layers_dragging, mouse_delta); - for path in data.layers_dragging.iter() { + // TODO: Cache the result of `shallowest_unique_layers` to avoid this heavy computation every frame of movement, see https://github.com/GraphiteEditor/Graphite/pull/481 + for path in Document::shallowest_unique_layers(data.layers_dragging.iter().map(|path| path.as_slice())) { responses.push_front( Operation::TransformLayerInViewport { - path: path.clone(), + path: path.to_vec(), transform: DAffine2::from_translation(mouse_delta + closest_move).to_cols_array(), } .into(), diff --git a/graphene/src/document.rs b/graphene/src/document.rs index b224305c3f..604d0bca3d 100644 --- a/graphene/src/document.rs +++ b/graphene/src/document.rs @@ -114,11 +114,11 @@ impl Document { // Return returns all folders that are not contained in any other of the given folders pub fn shallowest_folders<'a>(&'a self, layers: impl Iterator) -> Vec<&[LayerId]> { - self.shallowest_unique_layers(self.folders(layers)) + Self::shallowest_unique_layers(self.folders(layers)) } // Return returns all layers that are not contained in any other of the given folders - pub fn shallowest_unique_layers<'a>(&'a self, layers: impl Iterator) -> Vec<&[LayerId]> { + pub fn shallowest_unique_layers<'a>(layers: impl Iterator) -> Vec<&'a [LayerId]> { let mut sorted_layers: Vec<_> = layers.collect(); sorted_layers.sort(); // Sorting here creates groups of similar UUID paths