From 96e52c18ebf953b76b7da693f076363fd04aa355 Mon Sep 17 00:00:00 2001 From: Mohamed Osama <67656249+moOsama76@users.noreply.github.com> Date: Thu, 29 Feb 2024 01:01:23 +0200 Subject: [PATCH] Fix external consistency of grouping layers so they don't jump to the top of the hierarchy (#1627) * Calculate insert_index when grouping multiple layers * no message * Fix wrong commits * no message * restore frontend/package-lock.json * Fix formatting matches * Code review to make it idiomatic * remove wrong line --------- Co-authored-by: Keavon Chambers --- .../document/document_message_handler.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index d483e45b..9823f8f2 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -468,12 +468,25 @@ impl MessageHandler> for DocumentMessageHand responses.add(OverlaysMessage::Draw); } GroupSelectedLayers => { - // TODO: Add code that changes the insert index of the new folder based on the selected layer let parent = self .metadata() .deepest_common_ancestor(self.selected_nodes.selected_layers(self.metadata()), true) .unwrap_or(LayerNodeIdentifier::ROOT); + let calculated_insert_index = parent.children(&self.metadata()).enumerate().find_map(|(index, direct_child)| { + if self.selected_nodes.selected_layers(self.metadata()).any(|selected| selected == direct_child) { + return Some(index as isize); + } + + for descendant in direct_child.decendants(&self.metadata()) { + if self.selected_nodes.selected_layers(self.metadata()).any(|selected| selected == descendant) { + return Some(index as isize); + } + } + + None + }); + let folder_id = NodeId(generate_uuid()); responses.add(PortfolioMessage::Copy { clipboard: Clipboard::Internal }); @@ -483,14 +496,13 @@ impl MessageHandler> for DocumentMessageHand id: folder_id, nodes: HashMap::new(), parent, - insert_index: -1, + insert_index: calculated_insert_index.unwrap_or(-1), }); responses.add(PortfolioMessage::PasteIntoFolder { clipboard: Clipboard::Internal, parent: LayerNodeIdentifier::new_unchecked(folder_id), insert_index: -1, }); - responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![folder_id] }); } ImaginateGenerate => responses.add(PortfolioMessage::SubmitGraphRender { document_id }),