Maintain layer order, test still failing 50% of the time

This commit is contained in:
otdavies
2022-01-04 17:41:08 -08:00
parent d68e3b9c4e
commit 1aaf5c0d7d
2 changed files with 13 additions and 9 deletions
+12 -8
View File
@@ -273,25 +273,29 @@ impl DocumentMessageHandler {
self.layer_metadata.iter().filter_map(|(path, data)| data.selected.then(|| path.as_slice())) self.layer_metadata.iter().filter_map(|(path, data)| data.selected.then(|| path.as_slice()))
} }
pub fn selected_layers_without_children(&self) -> Vec<Vec<LayerId>> { pub fn selected_layers_without_children(&self) -> impl Iterator<Item = &[LayerId]> {
let mut sorted_layers = self.selected_layers().collect::<Vec<_>>(); let mut sorted_layers = self.selected_layers().collect::<Vec<_>>();
// Sorting here creates groups of similar UUID paths // Sorting here creates groups of similar UUID paths
sorted_layers.sort(); sorted_layers.sort();
if sorted_layers.is_empty() { let mut current_path: &[u64] = &[];
return vec![]; let mut layers_to_keep = vec![];
// Required since we are returning an iterator, cannot return early
if let Some(first) = sorted_layers.first() {
current_path = first;
layers_to_keep.push(*first);
} }
let mut current_path = sorted_layers.first().unwrap();
let mut keep = vec![current_path.to_vec()];
for path in &sorted_layers { for path in &sorted_layers {
if !path.starts_with(current_path) { if !path.starts_with(current_path) {
keep.push(path.to_vec()); layers_to_keep.push(path);
current_path = path; current_path = path;
} }
} }
keep // We need to maintain layer ordering
self.selected_layers().filter(move |p| layers_to_keep.binary_search(p).is_ok())
} }
pub fn selected_layers_contains(&self, path: &[LayerId]) -> bool { pub fn selected_layers_contains(&self, path: &[LayerId]) -> bool {
@@ -646,7 +650,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
self.backup(responses); self.backup(responses);
for path in self.selected_layers_without_children() { for path in self.selected_layers_without_children() {
responses.push_front(DocumentOperation::DeleteLayer { path }.into()); responses.push_front(DocumentOperation::DeleteLayer { path: path.to_vec() }.into());
} }
responses.push_front(ToolMessage::DocumentIsDirty.into()); responses.push_front(ToolMessage::DocumentIsDirty.into());
@@ -359,7 +359,7 @@ impl MessageHandler<DocumentsMessage, &InputPreprocessor> for DocumentsMessageHa
copy_buffer[clipboard as usize].clear(); copy_buffer[clipboard as usize].clear();
for layer_path in active_document.selected_layers_without_children() { for layer_path in active_document.selected_layers_without_children() {
match (active_document.graphene_document.layer(&layer_path).map(|t| t.clone()), *active_document.layer_metadata(&layer_path)) { match (active_document.graphene_document.layer(layer_path).map(|t| t.clone()), *active_document.layer_metadata(layer_path)) {
(Ok(layer), layer_metadata) => { (Ok(layer), layer_metadata) => {
copy_buffer[clipboard as usize].push(CopyBufferEntry { layer, layer_metadata }); copy_buffer[clipboard as usize].push(CopyBufferEntry { layer, layer_metadata });
} }