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
co-authored by Keavon Chambers
parent 3038d72226
commit 443f3d3b00
3 changed files with 17 additions and 5 deletions
+1
View File
@@ -68,6 +68,7 @@ pub enum DocumentMessage {
MoveSelectedLayersTo { MoveSelectedLayersTo {
folder_path: Vec<LayerId>, folder_path: Vec<LayerId>,
insert_index: isize, insert_index: isize,
reverse_index: bool,
}, },
NudgeSelectedLayers { NudgeSelectedLayers {
delta_x: f64, delta_x: f64,
@@ -202,7 +202,7 @@ impl DocumentMessageHandler {
fn serialize_structure(&self, folder: &Folder, structure: &mut Vec<u64>, data: &mut Vec<LayerId>, path: &mut Vec<LayerId>) { fn serialize_structure(&self, folder: &Folder, structure: &mut Vec<u64>, data: &mut Vec<LayerId>, path: &mut Vec<LayerId>) {
let mut space = 0; 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); data.push(*id);
space += 1; space += 1;
match layer.data { 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![]); self.serialize_structure(self.graphene_document.root.as_folder().unwrap(), &mut structure, &mut data, &mut vec![]);
structure[0] = structure.len() as u64 - 1; structure[0] = structure.len() as u64 - 1;
structure.extend(data); structure.extend(data);
structure 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). /// 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. /// 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 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)] }; 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) 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()); 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<_>>(); let selected_layers = self.selected_layers().collect::<Vec<_>>();
// Prevent trying to insert into self // Prevent trying to insert into self
@@ -694,7 +700,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
return; 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(PortfolioMessage::Copy { clipboard: Clipboard::System }.into());
responses.push_back(DocumentMessage::DeleteSelectedLayers.into()); responses.push_back(DocumentMessage::DeleteSelectedLayers.into());
@@ -817,6 +823,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
DocumentMessage::MoveSelectedLayersTo { DocumentMessage::MoveSelectedLayersTo {
folder_path: folder_path.to_vec(), folder_path: folder_path.to_vec(),
insert_index, insert_index,
reverse_index: false,
} }
.into(), .into(),
); );
+5 -1
View File
@@ -389,7 +389,11 @@ impl JsEditorHandle {
/// Move a layer to be next to the specified neighbor /// Move a layer to be next to the specified neighbor
pub fn move_layer_in_tree(&self, folder_path: Vec<LayerId>, insert_index: isize) { 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); self.dispatch(message);
} }