Skip to content

Commit 0c1e96b

Browse files
authored
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
1 parent 8f7dd20 commit 0c1e96b

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

editor/src/messages/portfolio/document/document_message.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ pub enum DocumentMessage {
165165
EndTransaction,
166166
CommitTransaction,
167167
AbortTransaction,
168+
RepeatedAbortTransaction {
169+
undo_count: usize,
170+
},
168171
AddTransaction,
169172
ToggleLayerExpansion {
170173
id: NodeId,

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1183,11 +1183,17 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
11831183
self.document_redo_history.clear();
11841184
}
11851185
DocumentMessage::AbortTransaction => {
1186+
responses.add(DocumentMessage::RepeatedAbortTransaction { undo_count: 1 });
1187+
}
1188+
DocumentMessage::RepeatedAbortTransaction { undo_count } => {
11861189
if self.network_interface.transaction_status() == TransactionStatus::Finished {
11871190
return;
11881191
}
11891192

1190-
self.undo(ipp, responses);
1193+
for _ in 0..undo_count {
1194+
self.undo(ipp, responses);
1195+
}
1196+
11911197
self.network_interface.finish_transaction();
11921198
responses.add(OverlaysMessage::Draw);
11931199
}

editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,16 @@ pub struct TransformLayerMessageHandler {
3737

3838
original_transforms: OriginalTransforms,
3939
pivot: ViewportPosition,
40+
4041
local_pivot: DocumentPosition,
4142
local_mouse_start: DocumentPosition,
4243
grab_target: DocumentPosition,
44+
4345
ptz: PTZ,
4446
initial_transform: DAffine2,
4547

48+
operation_count: usize,
49+
4650
// Pen tool (outgoing handle GRS manipulation)
4751
handle: DVec2,
4852
last_point: DVec2,
@@ -191,9 +195,6 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
191195
*selected.pivot = new_pivot;
192196

193197
self.local_pivot = document_to_viewport.inverse().transform_point2(*selected.pivot);
194-
195-
self.grab_target = grab_target;
196-
197198
self.grab_target = document_to_viewport.inverse().transform_point2(grab_target);
198199
} else {
199200
log::warn!("Failed to calculate pivot.");
@@ -341,6 +342,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
341342
selected.responses.add(PenToolMessage::Confirm);
342343
} else {
343344
update_colinear_handles(&selected_layers, document, responses);
345+
self.operation_count = 0;
344346
responses.add(DocumentMessage::EndTransaction);
345347
responses.add(ToolMessage::UpdateHints);
346348
responses.add(NodeGraphMessage::RunDocumentGraph);
@@ -396,6 +398,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
396398
self.transform_operation = TransformOperation::Grabbing(Default::default());
397399
self.local = false;
398400
self.layer_bounding_box = selected.bounding_box();
401+
self.operation_count += 1;
399402

400403
selected.original_transforms.clear();
401404

@@ -449,6 +452,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
449452

450453
self.local = false;
451454
self.layer_bounding_box = selected.bounding_box();
455+
self.operation_count += 1;
452456

453457
selected.original_transforms.clear();
454458

@@ -501,6 +505,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
501505

502506
self.local = false;
503507
self.layer_bounding_box = selected.bounding_box();
508+
self.operation_count += 1;
504509

505510
selected.original_transforms.clear();
506511

@@ -526,7 +531,8 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
526531
self.typing.clear();
527532
self.transform_operation = TransformOperation::None;
528533

529-
responses.add(DocumentMessage::AbortTransaction);
534+
responses.add(DocumentMessage::RepeatedAbortTransaction { undo_count: self.operation_count });
535+
self.operation_count = 0;
530536
responses.add(ToolMessage::UpdateHints);
531537
}
532538

0 commit comments

Comments
 (0)