mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-04 13:30:48 +00:00
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:
parent
8f7dd2021d
commit
0c1e96b9c6
3 changed files with 20 additions and 5 deletions
|
@ -165,6 +165,9 @@ pub enum DocumentMessage {
|
|||
EndTransaction,
|
||||
CommitTransaction,
|
||||
AbortTransaction,
|
||||
RepeatedAbortTransaction {
|
||||
undo_count: usize,
|
||||
},
|
||||
AddTransaction,
|
||||
ToggleLayerExpansion {
|
||||
id: NodeId,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue