mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-12-23 10:11:54 +00: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:
parent
d8255ebb72
commit
058aa7121c
2 changed files with 34 additions and 14 deletions
|
|
@ -864,24 +864,50 @@ impl MessageHandler<DocumentMessage, DocumentInputs<'_>> for DocumentMessageHand
|
|||
responses.add(DocumentMessage::StartTransaction);
|
||||
|
||||
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 {
|
||||
// Select all the children of the folder
|
||||
responses.add(NodeGraphMessage::SelectedNodesSet {
|
||||
nodes: folder.children(self.metadata()).map(LayerNodeIdentifier::to_node).collect(),
|
||||
});
|
||||
let selected = folder
|
||||
.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
|
||||
responses.add(PortfolioMessage::Copy { clipboard: Clipboard::Internal });
|
||||
|
||||
// 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 {
|
||||
clipboard: Clipboard::Internal,
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -382,14 +382,8 @@ impl MessageHandler<PortfolioMessage, (&InputPreprocessorMessageHandler, &Prefer
|
|||
}
|
||||
};
|
||||
|
||||
if insert_index == -1 {
|
||||
for entry in self.copy_buffer[clipboard as usize].iter().rev() {
|
||||
paste(entry, responses)
|
||||
}
|
||||
} else {
|
||||
for entry in self.copy_buffer[clipboard as usize].iter() {
|
||||
paste(entry, responses)
|
||||
}
|
||||
for entry in self.copy_buffer[clipboard as usize].iter().rev() {
|
||||
paste(entry, responses)
|
||||
}
|
||||
}
|
||||
PortfolioMessage::PasteSerializedData { data } => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue