Reverse layer panel entries (#489)

* Reverse layer panel entries

* Ctrl + Bracket moves layers in correct direction

* Fix dragging layers in tree

* Fix reverse in wrong place

* Remove log

* Fix sorting of message enum variants

* Fix hotkeys

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
0HyperCube 2022-01-16 22:56:47 +00:00 committed by Keavon Chambers
parent 3038d72226
commit 443f3d3b00
3 changed files with 17 additions and 5 deletions

View file

@ -68,6 +68,7 @@ pub enum DocumentMessage {
MoveSelectedLayersTo {
folder_path: Vec<LayerId>,
insert_index: isize,
reverse_index: bool,
},
NudgeSelectedLayers {
delta_x: f64,

View file

@ -202,7 +202,7 @@ impl DocumentMessageHandler {
fn serialize_structure(&self, folder: &Folder, structure: &mut Vec<u64>, data: &mut Vec<LayerId>, path: &mut Vec<LayerId>) {
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<isize, DocumentError> {
fn update_insert_index<'a>(&self, layers: &[&'a [LayerId]], path: &[LayerId], insert_index: isize, reverse_index: bool) -> Result<isize, DocumentError> {
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<DocumentMessage, &InputPreprocessorMessageHandler> 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::<Vec<_>>();
// Prevent trying to insert into self
@ -694,7 +700,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> 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<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
DocumentMessage::MoveSelectedLayersTo {
folder_path: folder_path.to_vec(),
insert_index,
reverse_index: false,
}
.into(),
);

View file

@ -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<LayerId>, 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);
}