Improve issues with selection history (#2138)

* Selection history when creating a new layer

* fixed selection history

* cleaned up the code, removed duplicate network_metadata calls

* re: fixed selection history
Added a default value for selection_undo_history to make sure its never actually empty.
This commit is contained in:
Ayush Chauhan 2024-12-21 03:26:33 +05:30 committed by GitHub
parent ed119ad3d7
commit 337b8bad13
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 23 additions and 7 deletions

View File

@ -1584,20 +1584,36 @@ impl NodeNetworkInterface {
/// Mutably get the selected nodes for the network at the network_path. Every time they are mutated, the transient metadata for the top of the stack gets unloaded. /// Mutably get the selected nodes for the network at the network_path. Every time they are mutated, the transient metadata for the top of the stack gets unloaded.
pub fn selected_nodes_mut(&mut self, network_path: &[NodeId]) -> Option<&mut SelectedNodes> { pub fn selected_nodes_mut(&mut self, network_path: &[NodeId]) -> Option<&mut SelectedNodes> {
let (last_selection_state, prev_state, is_selection_empty) = {
let network_metadata = self.network_metadata(network_path)?;
let history = &network_metadata.persistent_metadata.selection_undo_history;
let current = history.back().cloned().unwrap_or_default();
let previous = history.iter().rev().nth(1).cloned();
let empty = current.selected_layers_except_artboards(self).next().is_none();
(current, previous, empty)
};
self.unload_stack_dependents(network_path); self.unload_stack_dependents(network_path);
let Some(network_metadata) = self.network_metadata_mut(network_path) else { let Some(network_metadata) = self.network_metadata_mut(network_path) else {
log::error!("Could not get nested network_metadata in selected_nodes"); log::error!("Could not get nested network_metadata in selected_nodes");
return None; return None;
}; };
let last_selection_state = network_metadata.persistent_metadata.selection_undo_history.back().cloned().unwrap_or_default(); // Initialize default value if selection_undo_history is empty
if network_metadata.persistent_metadata.selection_undo_history.is_empty() {
network_metadata.persistent_metadata.selection_undo_history.push_back(last_selection_state); network_metadata.persistent_metadata.selection_undo_history.push_back(SelectedNodes::default());
network_metadata.persistent_metadata.selection_redo_history.clear();
if network_metadata.persistent_metadata.selection_undo_history.len() > crate::consts::MAX_UNDO_HISTORY_LEN {
network_metadata.persistent_metadata.selection_undo_history.pop_front();
} }
// Update history only if selection is non-empty/does not contain only artboards
if !is_selection_empty && prev_state.as_ref() != Some(&last_selection_state) {
network_metadata.persistent_metadata.selection_undo_history.push_back(last_selection_state);
network_metadata.persistent_metadata.selection_redo_history.clear();
if network_metadata.persistent_metadata.selection_undo_history.len() > crate::consts::MAX_UNDO_HISTORY_LEN {
network_metadata.persistent_metadata.selection_undo_history.pop_front();
}
}
network_metadata.persistent_metadata.selection_undo_history.back_mut() network_metadata.persistent_metadata.selection_undo_history.back_mut()
} }