mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-04 05:18:19 +00:00
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:
parent
3038d72226
commit
443f3d3b00
3 changed files with 17 additions and 5 deletions
|
@ -68,6 +68,7 @@ pub enum DocumentMessage {
|
|||
MoveSelectedLayersTo {
|
||||
folder_path: Vec<LayerId>,
|
||||
insert_index: isize,
|
||||
reverse_index: bool,
|
||||
},
|
||||
NudgeSelectedLayers {
|
||||
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>) {
|
||||
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(),
|
||||
);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue