mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-30 16:08:12 +08:00
Maintain layer order, test still failing 50% of the time
This commit is contained in:
@@ -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 });
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user