Skip to content

Commit 59c9a5f

Browse files
committed
Fix selection ordering
1 parent d057f14 commit 59c9a5f

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

core/editor/src/document/document_message_handler.rs

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
369369
CopySelectedLayers => {
370370
let paths = self.selected_layers_sorted();
371371
self.copy_buffer.clear();
372-
for path in paths {
372+
for path in paths.iter().rev() {
373373
match self.active_document().document.layer(&path).map(|t| t.clone()) {
374374
Ok(layer) => {
375375
self.copy_buffer.push(layer);
@@ -590,18 +590,41 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
590590
}
591591
ReorderSelectedLayers(relative_positon) => {
592592
let all_layer_paths = self.all_layers_sorted();
593-
let non_selected_layers = self.non_selected_layers_sorted();
594-
if let Some(insert_path) = all_layer_paths
595-
.iter()
596-
.position(|path| self.layerdata(&path).selected)
597-
.map(|pos| non_selected_layers.get((pos as i64 + relative_positon as i64).clamp(0, all_layer_paths.len() as i64 - 1) as usize))
598-
.flatten()
599-
{
600-
log::debug!("inserting at {:?}", insert_path);
601-
let (id, path) = insert_path.split_last().expect("Can't move the root folder");
602-
if let Some(folder) = self.active_document().document.document_layer(path).ok().map(|layer| layer.as_folder().ok()).flatten() {
603-
let insert_index = folder.position_of_layer(*id).unwrap() as isize;
604-
responses.push_back(DocumentMessage::MoveSelectedLayersTo { path: path.to_vec(), insert_index }.into())
593+
let selected_layers = self.selected_layers_sorted();
594+
let pivot = match relative_positon.signum() {
595+
-1 => selected_layers.first(),
596+
1 => selected_layers.last(),
597+
_ => unreachable!(),
598+
}
599+
.expect("called move layers with an empty selection");
600+
if let Some(pos) = all_layer_paths.iter().position(|path| path == pivot) {
601+
log::debug!("pos {:?}", pos);
602+
let max = all_layer_paths.len() as i64 - selected_layers.len() as i64;
603+
log::debug!("max {:?}", max);
604+
log::debug!("relative_positon {:?}", relative_positon);
605+
log::debug!("all_layer_paths: {:?}", all_layer_paths);
606+
let insert_pos = (pos as i64 + relative_positon as i64).clamp(0, max) as usize;
607+
log::debug!("inser_pos {:?}", insert_pos);
608+
let insert = all_layer_paths.get(insert_pos);
609+
if let Some(insert_path) = insert {
610+
log::debug!("inserting at {:?}", insert_path);
611+
let (id, path) = insert_path.split_last().expect("Can't move the root folder");
612+
if let Some(folder) = self.active_document().document.document_layer(path).ok().map(|layer| layer.as_folder().ok()).flatten() {
613+
// TODO: Ignore existing thingsin folder
614+
//
615+
let selected: Vec<_> = selected_layers
616+
.iter()
617+
.filter(|layer| layer.starts_with(path) && layer.len() == path.len() + 1)
618+
.map(|x| x.last().unwrap())
619+
.collect();
620+
log::debug!("selected {:?}", selected);
621+
let non_selected: Vec<_> = folder.layer_ids.iter().filter(|id| selected.iter().all(|x| x != id)).collect();
622+
log::debug!("non selected {:?}", non_selected);
623+
let offset = if relative_positon < 0 { 0 } else { 1 } as usize;
624+
let fallback = offset * (non_selected.len() - 1);
625+
let insert_index = non_selected.iter().position(|x| *x == id).unwrap_or(fallback) as isize + offset as isize;
626+
responses.push_back(DocumentMessage::MoveSelectedLayersTo { path: path.to_vec(), insert_index }.into())
627+
}
605628
}
606629
}
607630
}

core/editor/src/tool/tools/line.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ impl Fsm for LineToolFsmState {
9393
// TODO - introduce comparison threshold when operating with canvas coordinates (https://github.com/GraphiteEditor/Graphite/issues/100)
9494
if data.drag_start != data.drag_current {
9595
responses.push_back(make_operation(data, tool_data, transform));
96+
responses.push_back(DocumentMessage::DeselectAllLayers.into());
9697
responses.push_back(Operation::CommitTransaction.into());
9798
}
9899

@@ -143,7 +144,6 @@ fn update_state(
143144
*(state(data)) = value;
144145

145146
responses.push_back(Operation::ClearWorkingFolder.into());
146-
responses.push_back(DocumentMessage::DeselectAllLayers.into());
147147
responses.push_back(make_operation(data, tool_data, transform));
148148

149149
new_state

0 commit comments

Comments
 (0)