mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-30 19:18:13 +08: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 https://discord.com/channels/731730685944922173/881073965047636018/1328281947918696458
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user