From d714166c6917417bf2ea1384017c722492005497 Mon Sep 17 00:00:00 2001 From: milan-sedivy <59771021+milan-sedivy@users.noreply.github.com> Date: Mon, 11 Mar 2024 03:39:33 +0200 Subject: [PATCH] Don't save undo/redo history when aborting transactions (#1660) * Create a forgetable undo/redo function used by AbortTransaction * Rework and fix new undo/redo functions * Add space before comments --------- Co-authored-by: Keavon Chambers --- .../document/document_message_handler.rs | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index a2fd87c7..a73c9725 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -386,8 +386,8 @@ impl MessageHandler> for DocumentMessageHand responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![] }); self.layer_range_selection_reference = None; } - DocumentHistoryBackward => self.undo(responses), - DocumentHistoryForward => self.redo(responses), + DocumentHistoryBackward => self.undo_with_history(responses), + DocumentHistoryForward => self.redo_with_history(responses), DocumentStructureChanged => { self.update_layers_panel_options_bar_widgets(responses); @@ -1073,30 +1073,40 @@ impl DocumentMessageHandler { std::mem::replace(&mut self.network, network) } - pub fn undo(&mut self, responses: &mut VecDeque) { - // Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents - responses.add(PortfolioMessage::UpdateOpenDocumentsList); + pub fn undo_with_history(&mut self, responses: &mut VecDeque) { + let Some(previous_network) = self.undo(responses) else { return }; - let Some(network) = self.document_undo_history.pop_back() else { return }; - - responses.add(BroadcastEvent::SelectionChanged); - - let previous_network = std::mem::replace(&mut self.network, network); self.document_redo_history.push_back(previous_network); if self.document_redo_history.len() > crate::consts::MAX_UNDO_HISTORY_LEN { self.document_redo_history.pop_front(); } } - - pub fn redo(&mut self, responses: &mut VecDeque) { + pub fn undo(&mut self, responses: &mut VecDeque) -> Option { // Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents responses.add(PortfolioMessage::UpdateOpenDocumentsList); - - let Some(network) = self.document_redo_history.pop_back() else { return }; + // If there is no history return and don't broadcast SelectionChanged + let Some(network) = self.document_undo_history.pop_back() else { return None }; responses.add(BroadcastEvent::SelectionChanged); let previous_network = std::mem::replace(&mut self.network, network); + Some(previous_network) + } + pub fn redo(&mut self, responses: &mut VecDeque) -> Option { + // Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents + responses.add(PortfolioMessage::UpdateOpenDocumentsList); + // If there is no history return and don't broadcast SelectionChanged + let Some(network) = self.document_redo_history.pop_back() else { return None }; + + responses.add(BroadcastEvent::SelectionChanged); + + let previous_network = std::mem::replace(&mut self.network, network); + Some(previous_network) + } + pub fn redo_with_history(&mut self, responses: &mut VecDeque) { + // Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents + let Some(previous_network) = self.redo(responses) else { return }; + self.document_undo_history.push_back(previous_network); if self.document_undo_history.len() > crate::consts::MAX_UNDO_HISTORY_LEN { self.document_undo_history.pop_front();