mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-01 17:58:12 +08:00
Fix ungrouping bugs to preserve layer ordering and prevent incorrect layer deletion (#1672)
* Ungroup layer external consistency and fix bug * no message * no message * no message * no message * fix-bug * Code review: make code more idiomatic * Fix layres reversed when ungroup with index != -1 --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
co-authored by
Keavon Chambers
parent
d8255ebb72
commit
058aa7121c
@@ -864,24 +864,50 @@ impl MessageHandler<DocumentMessage, DocumentInputs<'_>> for DocumentMessageHand
|
|||||||
responses.add(DocumentMessage::StartTransaction);
|
responses.add(DocumentMessage::StartTransaction);
|
||||||
|
|
||||||
let folder_paths = self.metadata().folders_sorted_by_most_nested(self.selected_nodes.selected_layers(self.metadata()));
|
let folder_paths = self.metadata().folders_sorted_by_most_nested(self.selected_nodes.selected_layers(self.metadata()));
|
||||||
|
let mut ungrouped_folders = HashSet::new();
|
||||||
|
|
||||||
for folder in folder_paths {
|
for folder in folder_paths {
|
||||||
// Select all the children of the folder
|
// Select all the children of the folder
|
||||||
responses.add(NodeGraphMessage::SelectedNodesSet {
|
let selected = folder
|
||||||
nodes: folder.children(self.metadata()).map(LayerNodeIdentifier::to_node).collect(),
|
.descendants(self.metadata())
|
||||||
});
|
.filter_map(|descendant| {
|
||||||
|
if ungrouped_folders.contains(&descendant.to_node()) {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
|
||||||
|
let parent = descendant.parent(self.metadata()).expect("No parent");
|
||||||
|
if parent != folder && !ungrouped_folders.contains(&parent.to_node()) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(descendant.to_node())
|
||||||
|
})
|
||||||
|
.collect::<Vec<NodeId>>();
|
||||||
|
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: selected });
|
||||||
|
|
||||||
// Copy them
|
// Copy them
|
||||||
responses.add(PortfolioMessage::Copy { clipboard: Clipboard::Internal });
|
responses.add(PortfolioMessage::Copy { clipboard: Clipboard::Internal });
|
||||||
|
|
||||||
// Paste them into the folder above
|
// Paste them into the folder above
|
||||||
|
let insert_index = folder
|
||||||
|
.parent(self.metadata())
|
||||||
|
.unwrap_or(LayerNodeIdentifier::ROOT)
|
||||||
|
.children(self.metadata())
|
||||||
|
.enumerate()
|
||||||
|
.find_map(|(index, item)| (item == folder).then_some(index as isize))
|
||||||
|
.unwrap_or(-1);
|
||||||
responses.add(PortfolioMessage::PasteIntoFolder {
|
responses.add(PortfolioMessage::PasteIntoFolder {
|
||||||
clipboard: Clipboard::Internal,
|
clipboard: Clipboard::Internal,
|
||||||
parent: folder.parent(self.metadata()).unwrap_or(LayerNodeIdentifier::ROOT),
|
parent: folder.parent(self.metadata()).unwrap_or(LayerNodeIdentifier::ROOT),
|
||||||
insert_index: -1,
|
insert_index,
|
||||||
});
|
});
|
||||||
// Delete the parent folder
|
|
||||||
responses.add(GraphOperationMessage::DeleteLayer { id: folder.to_node() });
|
// Mark the folder for deletion
|
||||||
|
ungrouped_folders.insert(folder.to_node());
|
||||||
|
}
|
||||||
|
|
||||||
|
for id in ungrouped_folders {
|
||||||
|
responses.add(GraphOperationMessage::DeleteLayer { id });
|
||||||
}
|
}
|
||||||
responses.add(DocumentMessage::CommitTransaction);
|
responses.add(DocumentMessage::CommitTransaction);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -382,14 +382,8 @@ impl MessageHandler<PortfolioMessage, (&InputPreprocessorMessageHandler, &Prefer
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if insert_index == -1 {
|
for entry in self.copy_buffer[clipboard as usize].iter().rev() {
|
||||||
for entry in self.copy_buffer[clipboard as usize].iter().rev() {
|
paste(entry, responses)
|
||||||
paste(entry, responses)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for entry in self.copy_buffer[clipboard as usize].iter() {
|
|
||||||
paste(entry, responses)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PortfolioMessage::PasteSerializedData { data } => {
|
PortfolioMessage::PasteSerializedData { data } => {
|
||||||
|
|||||||
Reference in New Issue
Block a user