diff --git a/Source/Editor/GUI/Timeline/Timeline.cs b/Source/Editor/GUI/Timeline/Timeline.cs index 21b936c75..20386de5d 100644 --- a/Source/Editor/GUI/Timeline/Timeline.cs +++ b/Source/Editor/GUI/Timeline/Timeline.cs @@ -309,6 +309,7 @@ namespace FlaxEditor.GUI.Timeline private float _zoom = 1.0f; private bool _isMovingPositionHandle; private bool _canPlayPauseStop = true; + private List _batchedUndoActions; /// /// Gets or sets the current time showing mode. @@ -1986,6 +1987,19 @@ namespace FlaxEditor.GUI.Timeline } } + /// + /// Adds the undo action to be batched (eg. if multiple undo actions is performed in a sequence during single update). + /// + /// The action. + public void AddBatchedUndoAction(IUndoAction action) + { + if (Undo == null || !Undo.Enabled) + return; + if (_batchedUndoActions == null) + _batchedUndoActions = new List(); + _batchedUndoActions.Add(action); + } + internal void ShowContextMenu(Vector2 location) { if (!ContainsFocus) @@ -2038,6 +2052,13 @@ namespace FlaxEditor.GUI.Timeline scroll2.TargetValue = scroll1.Value; else scroll1.TargetValue = scroll2.Value; + + // Batch undo actions + if (_batchedUndoActions != null && _batchedUndoActions.Count != 0) + { + Undo.AddAction(_batchedUndoActions.Count == 1 ? _batchedUndoActions[0] : new MultiUndoAction(_batchedUndoActions)); + _batchedUndoActions.Clear(); + } } /// diff --git a/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs b/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs index 6b7185d65..72f4cd7f3 100644 --- a/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs @@ -520,7 +520,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks { var after = EditTrackAction.CaptureData(this); if (!Utils.ArraysEqual(_curveEditingStartData, after)) - Timeline.Undo.AddAction(new EditTrackAction(Timeline, this, _curveEditingStartData, after)); + Timeline.AddBatchedUndoAction(new EditTrackAction(Timeline, this, _curveEditingStartData, after)); _curveEditingStartData = null; } diff --git a/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs index f1454e1b8..e6fc59355 100644 --- a/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs @@ -271,7 +271,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks { var after = EditTrackAction.CaptureData(this); if (!Utils.ArraysEqual(_curveEditingStartData, after)) - Timeline.Undo.AddAction(new EditTrackAction(Timeline, this, _curveEditingStartData, after)); + Timeline.AddBatchedUndoAction(new EditTrackAction(Timeline, this, _curveEditingStartData, after)); _curveEditingStartData = null; } diff --git a/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs b/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs index 736d8c3c7..fe2b52c9e 100644 --- a/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs @@ -311,7 +311,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks { var after = EditTrackAction.CaptureData(this); if (!Utils.ArraysEqual(_eventsEditingStartData, after)) - Timeline.Undo.AddAction(new EditTrackAction(Timeline, this, _eventsEditingStartData, after)); + Timeline.AddBatchedUndoAction(new EditTrackAction(Timeline, this, _eventsEditingStartData, after)); _eventsEditingStartData = null; } diff --git a/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs index e760f6ea1..930e310a7 100644 --- a/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs @@ -278,7 +278,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks { var after = EditTrackAction.CaptureData(this); if (!Utils.ArraysEqual(_keyframesEditingStartData, after)) - Timeline.Undo.AddAction(new EditTrackAction(Timeline, this, _keyframesEditingStartData, after)); + Timeline.AddBatchedUndoAction(new EditTrackAction(Timeline, this, _keyframesEditingStartData, after)); _keyframesEditingStartData = null; } diff --git a/Source/Editor/GUI/Timeline/Tracks/ScreenFadeTrack.cs b/Source/Editor/GUI/Timeline/Tracks/ScreenFadeTrack.cs index ea9ff6dcf..fee15d39c 100644 --- a/Source/Editor/GUI/Timeline/Tracks/ScreenFadeTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/ScreenFadeTrack.cs @@ -72,7 +72,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks { var after = EditTrackAction.CaptureData(Track); if (!Utils.ArraysEqual(_gradientEditingStartData, after)) - Timeline.Undo.AddAction(new EditTrackAction(Timeline, Track, _gradientEditingStartData, after)); + Timeline.AddBatchedUndoAction(new EditTrackAction(Timeline, Track, _gradientEditingStartData, after)); _gradientEditingStartData = null; }