diff --git a/editor/src/document/document_message.rs b/editor/src/document/document_message.rs index bfc370ed..4532129e 100644 --- a/editor/src/document/document_message.rs +++ b/editor/src/document/document_message.rs @@ -68,6 +68,7 @@ pub enum DocumentMessage { MoveSelectedLayersTo { folder_path: Vec, insert_index: isize, + reverse_index: bool, }, NudgeSelectedLayers { delta_x: f64, diff --git a/editor/src/document/document_message_handler.rs b/editor/src/document/document_message_handler.rs index 932a903b..fa9c17b8 100644 --- a/editor/src/document/document_message_handler.rs +++ b/editor/src/document/document_message_handler.rs @@ -202,7 +202,7 @@ impl DocumentMessageHandler { fn serialize_structure(&self, folder: &Folder, structure: &mut Vec, data: &mut Vec, path: &mut Vec) { let mut space = 0; - for (id, layer) in folder.layer_ids.iter().zip(folder.layers()) { + for (id, layer) in folder.layer_ids.iter().zip(folder.layers()).rev() { data.push(*id); space += 1; match layer.data { @@ -258,6 +258,7 @@ impl DocumentMessageHandler { self.serialize_structure(self.graphene_document.root.as_folder().unwrap(), &mut structure, &mut data, &mut vec![]); structure[0] = structure.len() as u64 - 1; structure.extend(data); + structure } @@ -422,8 +423,9 @@ impl DocumentMessageHandler { /// When working with an insert index, deleting the layers may cause the insert index to point to a different location (if the layer being deleted was located before the insert index). /// /// This function updates the insert index so that it points to the same place after the specified `layers` are deleted. - fn update_insert_index<'a>(&self, layers: &[&'a [LayerId]], path: &[LayerId], insert_index: isize) -> Result { + fn update_insert_index<'a>(&self, layers: &[&'a [LayerId]], path: &[LayerId], insert_index: isize, reverse_index: bool) -> Result { let folder = self.graphene_document.folder(path)?; + let insert_index = if reverse_index { folder.layer_ids.len() as isize - insert_index } else { insert_index }; let layer_ids_above = if insert_index < 0 { &folder.layer_ids } else { &folder.layer_ids[..(insert_index as usize)] }; Ok(insert_index - layer_ids_above.iter().filter(|layer_id| layers.iter().any(|x| *x == [path, &[**layer_id]].concat())).count() as isize) @@ -686,7 +688,11 @@ impl MessageHandler for Docum responses.push_back(FrontendMessage::UpdateDocumentLayer { data: layer_entry }.into()); } } - MoveSelectedLayersTo { folder_path, insert_index } => { + MoveSelectedLayersTo { + folder_path, + insert_index, + reverse_index, + } => { let selected_layers = self.selected_layers().collect::>(); // Prevent trying to insert into self @@ -694,7 +700,7 @@ impl MessageHandler for Docum return; } - let insert_index = self.update_insert_index(&selected_layers, &folder_path, insert_index).unwrap(); + let insert_index = self.update_insert_index(&selected_layers, &folder_path, insert_index, reverse_index).unwrap(); responses.push_back(PortfolioMessage::Copy { clipboard: Clipboard::System }.into()); responses.push_back(DocumentMessage::DeleteSelectedLayers.into()); @@ -817,6 +823,7 @@ impl MessageHandler for Docum DocumentMessage::MoveSelectedLayersTo { folder_path: folder_path.to_vec(), insert_index, + reverse_index: false, } .into(), ); diff --git a/frontend/wasm/src/api.rs b/frontend/wasm/src/api.rs index 56ad15c2..7ed30d15 100644 --- a/frontend/wasm/src/api.rs +++ b/frontend/wasm/src/api.rs @@ -389,7 +389,11 @@ impl JsEditorHandle { /// Move a layer to be next to the specified neighbor pub fn move_layer_in_tree(&self, folder_path: Vec, insert_index: isize) { - let message = DocumentMessage::MoveSelectedLayersTo { folder_path, insert_index }; + let message = DocumentMessage::MoveSelectedLayersTo { + folder_path, + insert_index, + reverse_index: true, + }; self.dispatch(message); }