Skip to content

Commit d1bf2e0

Browse files
0HyperCubeKeavonTrueDoctor
authored
Do not transform layers when transforming a parent folder (#481)
* Modify all message enum data to use named struct values, not tuples (#479) * Massively reorganize and clean up the whole Rust codebase * Modify all message enum data to use named struct values, not tuples * Do not transform layers when transforming parent * Reduce complexity to O(nlogn) * Add TODO comment about performance Co-authored-by: Keavon Chambers <[email protected]> Co-authored-by: Dennis <[email protected]>
1 parent dbc1991 commit d1bf2e0

File tree

4 files changed

+9
-6
lines changed

4 files changed

+9
-6
lines changed

editor/src/document/document_message_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ impl DocumentMessageHandler {
181181
}
182182

183183
pub fn selected_layers_without_children(&self) -> Vec<&[LayerId]> {
184-
let unique_layers = self.graphene_document.shallowest_unique_layers(self.selected_layers());
184+
let unique_layers = GrapheneDocument::shallowest_unique_layers(self.selected_layers());
185185

186186
// We need to maintain layer ordering
187187
self.sort_layers(unique_layers.iter().copied())

editor/src/document/transformation.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ impl<'a> Selected<'a> {
241241
let pivot = DAffine2::from_translation(*self.pivot);
242242
let transformation = pivot * delta * pivot.inverse();
243243

244-
for layer_path in &self.selected {
244+
// 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
245+
for layer_path in Document::shallowest_unique_layers(self.selected.iter().map(|path| path.as_slice())) {
245246
let parent_folder_path = &layer_path[..layer_path.len() - 1];
246247
let original_layer_transforms = *self.original_transforms.get(layer_path).unwrap();
247248

editor/src/viewport_tools/tools/select.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::misc::{HintData, HintGroup, HintInfo, KeysGroup};
1010
use crate::viewport_tools::snapping::SnapHandler;
1111
use crate::viewport_tools::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
1212

13+
use graphene::document::Document;
1314
use graphene::intersection::Quad;
1415
use graphene::layers::style::{self, Fill, Stroke};
1516
use graphene::Operation;
@@ -225,10 +226,11 @@ impl Fsm for SelectToolFsmState {
225226
let mouse_delta = mouse_position - data.drag_current;
226227

227228
let closest_move = data.snap_handler.snap_layers(document, &data.layers_dragging, mouse_delta);
228-
for path in data.layers_dragging.iter() {
229+
// 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
230+
for path in Document::shallowest_unique_layers(data.layers_dragging.iter().map(|path| path.as_slice())) {
229231
responses.push_front(
230232
Operation::TransformLayerInViewport {
231-
path: path.clone(),
233+
path: path.to_vec(),
232234
transform: DAffine2::from_translation(mouse_delta + closest_move).to_cols_array(),
233235
}
234236
.into(),

graphene/src/document.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ impl Document {
114114

115115
// Return returns all folders that are not contained in any other of the given folders
116116
pub fn shallowest_folders<'a>(&'a self, layers: impl Iterator<Item = &'a [LayerId]>) -> Vec<&[LayerId]> {
117-
self.shallowest_unique_layers(self.folders(layers))
117+
Self::shallowest_unique_layers(self.folders(layers))
118118
}
119119

120120
// Return returns all layers that are not contained in any other of the given folders
121-
pub fn shallowest_unique_layers<'a>(&'a self, layers: impl Iterator<Item = &'a [LayerId]>) -> Vec<&[LayerId]> {
121+
pub fn shallowest_unique_layers<'a>(layers: impl Iterator<Item = &'a [LayerId]>) -> Vec<&'a [LayerId]> {
122122
let mut sorted_layers: Vec<_> = layers.collect();
123123
sorted_layers.sort();
124124
// Sorting here creates groups of similar UUID paths

0 commit comments

Comments
 (0)