From 65b35a4b8adebe264618976d7ec5dc9df99b12d5 Mon Sep 17 00:00:00 2001 From: Saas Date: Wed, 18 Mar 2026 21:40:22 +0100 Subject: [PATCH 1/3] auto scroll to new track when adding track to timeline --- Source/Editor/GUI/Timeline/Timeline.cs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Source/Editor/GUI/Timeline/Timeline.cs b/Source/Editor/GUI/Timeline/Timeline.cs index 15e7eb953..0cd0cdc04 100644 --- a/Source/Editor/GUI/Timeline/Timeline.cs +++ b/Source/Editor/GUI/Timeline/Timeline.cs @@ -229,6 +229,7 @@ namespace FlaxEditor.GUI.Timeline private List _mediaMoveStartTracks; private byte[][] _mediaMoveStartData; private float _zoom = 1.0f; + private float _tracksVScrollTarget = 0f; private bool _isMovingPositionHandle; private bool _canPlayPause = true, _canStop = true; private List _batchedUndoActions; @@ -898,6 +899,8 @@ namespace FlaxEditor.GUI.Timeline }; UpdatePositionHandle(); PlaybackState = PlaybackStates.Disabled; + + _tracksVScrollTarget = _tracksPanelArea.VScrollBar.TargetValue; } private void UpdatePositionHandle() @@ -1305,6 +1308,10 @@ namespace FlaxEditor.GUI.Timeline MarkAsEdited(); if (withUndo) Undo?.AddAction(new AddRemoveTrackAction(this, track, true)); + + // Scroll to track + _tracksPanelArea.ScrollViewTo(track); + _tracksVScrollTarget = _tracksPanelArea.VScrollBar.TargetValue; } /// @@ -2033,12 +2040,18 @@ namespace FlaxEditor.GUI.Timeline base.Update(deltaTime); // Synchronize scroll vertical bars for tracks and media panels to keep the view in sync - var scroll1 = _tracksPanelArea.VScrollBar; - var scroll2 = _backgroundArea.VScrollBar; - if (scroll1.IsThumbClicked || _tracksPanelArea.IsMouseOver) - scroll2.TargetValue = scroll1.Value; + var tracksVScroll = _tracksPanelArea.VScrollBar; + var backgroundVScroll = _backgroundArea.VScrollBar; + bool forceBackgroundToTracksScroll = !Mathf.WithinEpsilon(_tracksVScrollTarget - tracksVScroll.Value, 0f, 5f); + if (tracksVScroll.IsThumbClicked || _tracksPanelArea.IsMouseOver || forceBackgroundToTracksScroll) + { + backgroundVScroll.TargetValue = tracksVScroll.Value; + } else - scroll1.TargetValue = scroll2.Value; + { + _tracksVScrollTarget = 0f; + tracksVScroll.TargetValue = backgroundVScroll.Value; + } // Batch undo actions if (_batchedUndoActions != null && _batchedUndoActions.Count != 0) From a831e15bf7ba6310e124a00592bd7192013631a8 Mon Sep 17 00:00:00 2001 From: Saas Date: Thu, 19 Mar 2026 20:47:34 +0100 Subject: [PATCH 2/3] fix rare bug where tracks pannel wouldn't scroll all the way through --- Source/Editor/GUI/Timeline/Timeline.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Source/Editor/GUI/Timeline/Timeline.cs b/Source/Editor/GUI/Timeline/Timeline.cs index 0cd0cdc04..516c30544 100644 --- a/Source/Editor/GUI/Timeline/Timeline.cs +++ b/Source/Editor/GUI/Timeline/Timeline.cs @@ -229,7 +229,7 @@ namespace FlaxEditor.GUI.Timeline private List _mediaMoveStartTracks; private byte[][] _mediaMoveStartData; private float _zoom = 1.0f; - private float _tracksVScrollTarget = 0f; + private float _tracksVScrollTarget; private bool _isMovingPositionHandle; private bool _canPlayPause = true, _canStop = true; private List _batchedUndoActions; @@ -899,8 +899,6 @@ namespace FlaxEditor.GUI.Timeline }; UpdatePositionHandle(); PlaybackState = PlaybackStates.Disabled; - - _tracksVScrollTarget = _tracksPanelArea.VScrollBar.TargetValue; } private void UpdatePositionHandle() @@ -2042,14 +2040,20 @@ namespace FlaxEditor.GUI.Timeline // Synchronize scroll vertical bars for tracks and media panels to keep the view in sync var tracksVScroll = _tracksPanelArea.VScrollBar; var backgroundVScroll = _backgroundArea.VScrollBar; - bool forceBackgroundToTracksScroll = !Mathf.WithinEpsilon(_tracksVScrollTarget - tracksVScroll.Value, 0f, 5f); - if (tracksVScroll.IsThumbClicked || _tracksPanelArea.IsMouseOver || forceBackgroundToTracksScroll) + bool forceBackgroundToTracksScroll = _tracksVScrollTarget > 0; + if (forceBackgroundToTracksScroll) + { + backgroundVScroll.TargetValue = tracksVScroll.Value; + + if (Mathf.Abs(tracksVScroll.Value - _tracksVScrollTarget) < 0.5f) + _tracksVScrollTarget = 0f; + } + else if (tracksVScroll.IsThumbClicked || _tracksPanelArea.IsMouseOver) { backgroundVScroll.TargetValue = tracksVScroll.Value; } else { - _tracksVScrollTarget = 0f; tracksVScroll.TargetValue = backgroundVScroll.Value; } From 3e670f5e80d9a98b095b48ab2ecd25ee74dfd0e9 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 28 May 2026 10:07:16 +0200 Subject: [PATCH 3/3] Remove not needed line #4013 --- Source/Editor/GUI/Timeline/Timeline.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Editor/GUI/Timeline/Timeline.cs b/Source/Editor/GUI/Timeline/Timeline.cs index 3ca83f903..861bd7e44 100644 --- a/Source/Editor/GUI/Timeline/Timeline.cs +++ b/Source/Editor/GUI/Timeline/Timeline.cs @@ -1302,7 +1302,6 @@ namespace FlaxEditor.GUI.Timeline if (track.ParentTrack != null) OnTracksOrderChanged(); track.OnSpawned(); - _tracksPanelArea.ScrollViewTo(track); MarkAsEdited(); if (withUndo) Undo?.AddAction(new AddRemoveTrackAction(this, track, true));