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 1328281947
This commit is contained in:
mTvare 2025-03-06 18:46:19 +05:30 committed by GitHub
parent 8f7dd2021d
commit 0c1e96b9c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 5 deletions

View file

@ -165,6 +165,9 @@ pub enum DocumentMessage {
EndTransaction,
CommitTransaction,
AbortTransaction,
RepeatedAbortTransaction {
undo_count: usize,
},
AddTransaction,
ToggleLayerExpansion {
id: NodeId,

View file

@ -1183,11 +1183,17 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
self.document_redo_history.clear();
}
DocumentMessage::AbortTransaction => {
responses.add(DocumentMessage::RepeatedAbortTransaction { undo_count: 1 });
}
DocumentMessage::RepeatedAbortTransaction { undo_count } => {
if self.network_interface.transaction_status() == TransactionStatus::Finished {
return;
}
self.undo(ipp, responses);
for _ in 0..undo_count {
self.undo(ipp, responses);
}
self.network_interface.finish_transaction();
responses.add(OverlaysMessage::Draw);
}

View file

@ -37,12 +37,16 @@ pub struct TransformLayerMessageHandler {
original_transforms: OriginalTransforms,
pivot: ViewportPosition,
local_pivot: DocumentPosition,
local_mouse_start: DocumentPosition,
grab_target: DocumentPosition,
ptz: PTZ,
initial_transform: DAffine2,
operation_count: usize,
// Pen tool (outgoing handle GRS manipulation)
handle: DVec2,
last_point: DVec2,
@ -191,9 +195,6 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
*selected.pivot = new_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);
} else {
log::warn!("Failed to calculate pivot.");
@ -341,6 +342,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
selected.responses.add(PenToolMessage::Confirm);
} else {
update_colinear_handles(&selected_layers, document, responses);
self.operation_count = 0;
responses.add(DocumentMessage::EndTransaction);
responses.add(ToolMessage::UpdateHints);
responses.add(NodeGraphMessage::RunDocumentGraph);
@ -396,6 +398,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.transform_operation = TransformOperation::Grabbing(Default::default());
self.local = false;
self.layer_bounding_box = selected.bounding_box();
self.operation_count += 1;
selected.original_transforms.clear();
@ -449,6 +452,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.local = false;
self.layer_bounding_box = selected.bounding_box();
self.operation_count += 1;
selected.original_transforms.clear();
@ -501,6 +505,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.local = false;
self.layer_bounding_box = selected.bounding_box();
self.operation_count += 1;
selected.original_transforms.clear();
@ -526,7 +531,8 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
self.typing.clear();
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);
}