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:
Mohamed Osama 2024-03-16 20:44:30 +02:00 committed by GitHub
parent d8255ebb72
commit 058aa7121c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 14 deletions

View file

@ -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);
}

View file

@ -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 } => {