From 68a6065f2bac03e0af2fbadfed9b367216a8a417 Mon Sep 17 00:00:00 2001 From: 0HyperCube <78500760+0HyperCube@users.noreply.github.com> Date: Mon, 17 Jun 2024 11:56:31 +0100 Subject: [PATCH] Arrange layers in top level (#1786) --- .../portfolio/document/document_message_handler.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index e62ecdf4..249ed325 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -559,11 +559,15 @@ impl MessageHandler> for DocumentMessag return; } // Artboards can only have `ROOT_PARENT` as the parent. - if selected_layers.iter().any(|&layer| self.metadata.is_artboard(layer)) && parent != LayerNodeIdentifier::ROOT_PARENT { + let any_artboards = selected_layers.iter().any(|&layer| self.metadata.is_artboard(layer)); + if any_artboards && parent != LayerNodeIdentifier::ROOT_PARENT { return; } - // Disallow inserting layers between artboards. Since only artboards can output to Output node, the layer parent cannot be the output. - if !selected_layers.iter().any(|&layer| self.metadata.is_artboard(layer)) && parent == LayerNodeIdentifier::ROOT_PARENT { + + // Non-artboards cannot be put at the top level if artboards also exist there + let selected_any_non_artboards = selected_layers.iter().any(|&layer| !self.metadata.is_artboard(layer)); + let top_level_artboards = LayerNodeIdentifier::ROOT_PARENT.children(self.metadata()).any(|layer| self.metadata.is_artboard(layer)); + if selected_any_non_artboards && parent == LayerNodeIdentifier::ROOT_PARENT && top_level_artboards { return; } let mut insert_index = if insert_index < 0 { 0 } else { insert_index as usize }; @@ -2122,9 +2126,7 @@ impl DocumentMessageHandler { let Some(pivot_layer) = first_or_last_selected_layer else { return; }; - let Some(parent) = pivot_layer.parent(self.metadata()) else { - return; - }; + let parent = pivot_layer.parent(self.metadata()).unwrap_or(LayerNodeIdentifier::ROOT_PARENT); let sibling_layer_paths: Vec<_> = parent.children(self.metadata()).collect(); let Some(pivot_index) = sibling_layer_paths.iter().position(|path| *path == pivot_layer) else {