From 337b8bad13cb7920bc9551bf872c651c45f77bd0 Mon Sep 17 00:00:00 2001 From: Ayush Chauhan <56398566+bakayu@users.noreply.github.com> Date: Sat, 21 Dec 2024 03:26:33 +0530 Subject: [PATCH] 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. --- .../utility_types/network_interface.rs | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index b75eaa2b..5427a27f 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -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. 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); + let Some(network_metadata) = self.network_metadata_mut(network_path) else { log::error!("Could not get nested network_metadata in selected_nodes"); return None; }; - let last_selection_state = network_metadata.persistent_metadata.selection_undo_history.back().cloned().unwrap_or_default(); - - 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(); + // 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(SelectedNodes::default()); } + + // 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() }