diff --git a/Source/Editor/GUI/Timeline/Timeline.cs b/Source/Editor/GUI/Timeline/Timeline.cs index 98037052a..f073da422 100644 --- a/Source/Editor/GUI/Timeline/Timeline.cs +++ b/Source/Editor/GUI/Timeline/Timeline.cs @@ -1820,6 +1820,10 @@ namespace FlaxEditor.GUI.Timeline { menu.AddButton("Edit timeline", () => ShowEditPopup(PropertiesEditObject, ref location, this)); } + if (_tracks.Count > 1) + { + menu.AddButton("Sort tracks", SortTracks).TooltipText = "Sorts sub tracks alphabetically"; + } menu.AddSeparator(); menu.AddButton("Reset zoom", () => Zoom = 1.0f); menu.AddButton("Show whole timeline", ShowWholeTimeline); @@ -1827,6 +1831,44 @@ namespace FlaxEditor.GUI.Timeline menu.Show(this, location); } + private void SortTracks() + { + var rootTracks = new List(); + foreach (var track in _tracks) + { + if (track.ParentTrack == null) + rootTracks.Add(track); + } + + // TODO: undo for tracks sorting + _tracks.Clear(); + rootTracks.Sort(); + foreach (var track in rootTracks) + CollectTracks(track); + + OnTracksOrderChanged(); + MarkAsEdited(); + } + + internal void SortTrack(Track e, Action sort) + { + var rootTracks = new List(); + foreach (var track in _tracks) + { + if (track.ParentTrack == null) + rootTracks.Add(track); + } + + // TODO: undo for tracks sorting + _tracks.Clear(); + sort(); + foreach (var track in rootTracks) + CollectTracks(track); + + OnTracksOrderChanged(); + MarkAsEdited(); + } + /// protected override void PerformLayoutBeforeChildren() { diff --git a/Source/Editor/GUI/Timeline/Track.cs b/Source/Editor/GUI/Timeline/Track.cs index 93ee2e001..f61bd87f3 100644 --- a/Source/Editor/GUI/Timeline/Track.cs +++ b/Source/Editor/GUI/Timeline/Track.cs @@ -1032,6 +1032,10 @@ namespace FlaxEditor.GUI.Timeline menu.AddButton("Expand All", ExpandAll); menu.AddButton("Collapse All", CollapseAll); } + if (SubTracks.Count > 1) + { + menu.AddButton("Sort All", () => _timeline.SortTrack(this, _subTracks.Sort)); + } OnContextMenu(menu); menu.Show(this, location); } @@ -1343,6 +1347,18 @@ namespace FlaxEditor.GUI.Timeline base.OnKeyUp(key); } + /// + public override int Compare(Control other) + { + if (other is Track otherTrack) + { + var name = Title ?? Name; + var otherName = otherTrack.Title ?? otherTrack.Name; + return string.Compare(name, otherName, StringComparison.InvariantCulture); + } + return base.Compare(other); + } + /// public override void OnDestroy() {