Skip to content

Commit ac32ba6

Browse files
committed
Fix more selection issues
1 parent c7ec9be commit ac32ba6

File tree

1 file changed

+40
-31
lines changed

1 file changed

+40
-31
lines changed

core/editor/src/document/document_message_handler.rs

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
380380
log::debug!("copy_buffer: {:?}", self.copy_buffer);
381381
}
382382
PasteLayers { path, insert_index } => {
383-
for layer in self.copy_buffer.iter() {
383+
let paste = |layer: &Layer, responses: &mut VecDeque<_>| {
384384
log::trace!("pasting into folder {:?} as index: {}", path, insert_index);
385385
responses.push_back(
386386
DocumentOperation::PasteLayer {
@@ -390,6 +390,15 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
390390
}
391391
.into(),
392392
)
393+
};
394+
if insert_index == -1 {
395+
for layer in self.copy_buffer.iter() {
396+
paste(layer, responses)
397+
}
398+
} else {
399+
for layer in self.copy_buffer.iter().rev() {
400+
paste(layer, responses)
401+
}
393402
}
394403
}
395404
SelectLayers(paths) => {
@@ -592,39 +601,39 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
592601
ReorderSelectedLayers(relative_positon) => {
593602
let all_layer_paths = self.all_layers_sorted();
594603
let selected_layers = self.selected_layers_sorted();
595-
let pivot = match relative_positon.signum() {
604+
if let Some(pivot) = match relative_positon.signum() {
596605
-1 => selected_layers.first(),
597606
1 => selected_layers.last(),
598607
_ => unreachable!(),
599-
}
600-
.expect("called move layers with an empty selection");
601-
if let Some(pos) = all_layer_paths.iter().position(|path| path == pivot) {
602-
log::debug!("pos {:?}", pos);
603-
let max = all_layer_paths.len() as i64 - selected_layers.len() as i64;
604-
log::debug!("max {:?}", max);
605-
log::debug!("relative_positon {:?}", relative_positon);
606-
log::debug!("all_layer_paths: {:?}", all_layer_paths);
607-
let insert_pos = (pos as i64 + relative_positon as i64).clamp(0, max) as usize;
608-
log::debug!("inser_pos {:?}", insert_pos);
609-
let insert = all_layer_paths.get(insert_pos);
610-
if let Some(insert_path) = insert {
611-
log::debug!("inserting at {:?}", insert_path);
612-
let (id, path) = insert_path.split_last().expect("Can't move the root folder");
613-
if let Some(folder) = self.active_document().document.document_layer(path).ok().map(|layer| layer.as_folder().ok()).flatten() {
614-
// TODO: Ignore existing thingsin folder
615-
//
616-
let selected: Vec<_> = selected_layers
617-
.iter()
618-
.filter(|layer| layer.starts_with(path) && layer.len() == path.len() + 1)
619-
.map(|x| x.last().unwrap())
620-
.collect();
621-
log::debug!("selected {:?}", selected);
622-
let non_selected: Vec<_> = folder.layer_ids.iter().filter(|id| selected.iter().all(|x| x != id)).collect();
623-
log::debug!("non selected {:?}", non_selected);
624-
let offset = if relative_positon < 0 { 0 } else { 1 } as usize;
625-
let fallback = offset * (non_selected.len() - 1);
626-
let insert_index = non_selected.iter().position(|x| *x == id).unwrap_or(fallback) as isize + offset as isize;
627-
responses.push_back(DocumentMessage::MoveSelectedLayersTo { path: path.to_vec(), insert_index }.into())
608+
} {
609+
if let Some(pos) = all_layer_paths.iter().position(|path| path == pivot) {
610+
log::debug!("pos {:?}", pos);
611+
let max = all_layer_paths.len() as i64 - selected_layers.len() as i64;
612+
log::debug!("max {:?}", max);
613+
log::debug!("relative_positon {:?}", relative_positon);
614+
log::debug!("all_layer_paths: {:?}", all_layer_paths);
615+
let insert_pos = (pos as i64 + relative_positon as i64).clamp(0, max) as usize;
616+
log::debug!("inser_pos {:?}", insert_pos);
617+
let insert = all_layer_paths.get(insert_pos);
618+
if let Some(insert_path) = insert {
619+
log::debug!("inserting at {:?}", insert_path);
620+
let (id, path) = insert_path.split_last().expect("Can't move the root folder");
621+
if let Some(folder) = self.active_document().document.document_layer(path).ok().map(|layer| layer.as_folder().ok()).flatten() {
622+
// TODO: Ignore existing thingsin folder
623+
//
624+
let selected: Vec<_> = selected_layers
625+
.iter()
626+
.filter(|layer| layer.starts_with(path) && layer.len() == path.len() + 1)
627+
.map(|x| x.last().unwrap())
628+
.collect();
629+
log::debug!("selected {:?}", selected);
630+
let non_selected: Vec<_> = folder.layer_ids.iter().filter(|id| selected.iter().all(|x| x != id)).collect();
631+
log::debug!("non selected {:?}", non_selected);
632+
let offset = if relative_positon < 0 || non_selected.is_empty() { 0 } else { selected.len() };
633+
let fallback = offset * (non_selected.len().clamp(1, usize::MAX) - 1);
634+
let insert_index = non_selected.iter().position(|x| *x == id).unwrap_or(fallback) as isize + offset as isize;
635+
responses.push_back(DocumentMessage::MoveSelectedLayersTo { path: path.to_vec(), insert_index }.into())
636+
}
628637
}
629638
}
630639
}

0 commit comments

Comments
 (0)