Fix chaining GRS commands so they work smoothly and don't add intermediate undo steps (#2297)

Fix GRS chaining behaviour and generalise Abort to have n≠1 undos

Fixes https://discord.com/channels/731730685944922173/881073965047636018/1328281947918696458
This commit is contained in:
mTvare
2025-03-06 13:16:19 +00:00
committed by GitHub
parent 8f7dd2021d
commit 0c1e96b9c6
3 changed files with 20 additions and 5 deletions
@@ -165,6 +165,9 @@ pub enum DocumentMessage {
EndTransaction, EndTransaction,
CommitTransaction, CommitTransaction,
AbortTransaction, AbortTransaction,
RepeatedAbortTransaction {
undo_count: usize,
},
AddTransaction, AddTransaction,
ToggleLayerExpansion { ToggleLayerExpansion {
id: NodeId, id: NodeId,
@@ -1183,11 +1183,17 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
self.document_redo_history.clear(); self.document_redo_history.clear();
} }
DocumentMessage::AbortTransaction => { DocumentMessage::AbortTransaction => {
responses.add(DocumentMessage::RepeatedAbortTransaction { undo_count: 1 });
}
DocumentMessage::RepeatedAbortTransaction { undo_count } => {
if self.network_interface.transaction_status() == TransactionStatus::Finished { if self.network_interface.transaction_status() == TransactionStatus::Finished {
return; return;
} }
self.undo(ipp, responses); for _ in 0..undo_count {
self.undo(ipp, responses);
}
self.network_interface.finish_transaction(); self.network_interface.finish_transaction();
responses.add(OverlaysMessage::Draw); responses.add(OverlaysMessage::Draw);
} }
@@ -37,12 +37,16 @@ pub struct TransformLayerMessageHandler {
original_transforms: OriginalTransforms, original_transforms: OriginalTransforms,
pivot: ViewportPosition, pivot: ViewportPosition,
local_pivot: DocumentPosition, local_pivot: DocumentPosition,
local_mouse_start: DocumentPosition, local_mouse_start: DocumentPosition,
grab_target: DocumentPosition, grab_target: DocumentPosition,
ptz: PTZ, ptz: PTZ,
initial_transform: DAffine2, initial_transform: DAffine2,
operation_count: usize,
// Pen tool (outgoing handle GRS manipulation) // Pen tool (outgoing handle GRS manipulation)
handle: DVec2, handle: DVec2,
last_point: DVec2, last_point: DVec2,
@@ -191,9 +195,6 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
*selected.pivot = new_pivot; *selected.pivot = new_pivot;
self.local_pivot = document_to_viewport.inverse().transform_point2(*selected.pivot); self.local_pivot = document_to_viewport.inverse().transform_point2(*selected.pivot);
self.grab_target = grab_target;
self.grab_target = document_to_viewport.inverse().transform_point2(grab_target); self.grab_target = document_to_viewport.inverse().transform_point2(grab_target);
} else { } else {
log::warn!("Failed to calculate pivot."); log::warn!("Failed to calculate pivot.");
@@ -341,6 +342,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
selected.responses.add(PenToolMessage::Confirm); selected.responses.add(PenToolMessage::Confirm);
} else { } else {
update_colinear_handles(&selected_layers, document, responses); update_colinear_handles(&selected_layers, document, responses);
self.operation_count = 0;
responses.add(DocumentMessage::EndTransaction); responses.add(DocumentMessage::EndTransaction);
responses.add(ToolMessage::UpdateHints); responses.add(ToolMessage::UpdateHints);
responses.add(NodeGraphMessage::RunDocumentGraph); responses.add(NodeGraphMessage::RunDocumentGraph);
@@ -396,6 +398,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.transform_operation = TransformOperation::Grabbing(Default::default()); self.transform_operation = TransformOperation::Grabbing(Default::default());
self.local = false; self.local = false;
self.layer_bounding_box = selected.bounding_box(); self.layer_bounding_box = selected.bounding_box();
self.operation_count += 1;
selected.original_transforms.clear(); selected.original_transforms.clear();
@@ -449,6 +452,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.local = false; self.local = false;
self.layer_bounding_box = selected.bounding_box(); self.layer_bounding_box = selected.bounding_box();
self.operation_count += 1;
selected.original_transforms.clear(); selected.original_transforms.clear();
@@ -501,6 +505,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.local = false; self.local = false;
self.layer_bounding_box = selected.bounding_box(); self.layer_bounding_box = selected.bounding_box();
self.operation_count += 1;
selected.original_transforms.clear(); selected.original_transforms.clear();
@@ -526,7 +531,8 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.typing.clear(); self.typing.clear();
self.transform_operation = TransformOperation::None; self.transform_operation = TransformOperation::None;
responses.add(DocumentMessage::AbortTransaction); responses.add(DocumentMessage::RepeatedAbortTransaction { undo_count: self.operation_count });
self.operation_count = 0;
responses.add(ToolMessage::UpdateHints); responses.add(ToolMessage::UpdateHints);
} }