From bb674b43f947202a472c437ad03d8f9dfd16ff50 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 7 Dec 2021 23:27:58 +0100 Subject: [PATCH] Refactor Timeline UI to use track flags --- Source/Editor/GUI/Timeline/Timeline.Data.cs | 17 +++---- Source/Editor/GUI/Timeline/Timeline.cs | 4 +- Source/Editor/GUI/Timeline/Track.cs | 45 +++++++++++++------ Source/Editor/GUI/Timeline/TrackArchetype.cs | 40 +++++++++++++++++ .../Editor/GUI/Timeline/TrackCreateOptions.cs | 28 ------------ .../Editor/GUI/Timeline/Tracks/AudioTrack.cs | 1 - .../Tracks/NestedSceneAnimationTrack.cs | 15 ------- .../GUI/Timeline/Undo/AddRemoveTrackAction.cs | 3 +- .../GUI/Timeline/Undo/EditTrackAction.cs | 6 +-- Source/Engine/UI/GUI/ContainerControl.cs | 2 +- 10 files changed, 81 insertions(+), 80 deletions(-) delete mode 100644 Source/Editor/GUI/Timeline/TrackCreateOptions.cs diff --git a/Source/Editor/GUI/Timeline/Timeline.Data.cs b/Source/Editor/GUI/Timeline/Timeline.Data.cs index f5f9bc50b..e796a0812 100644 --- a/Source/Editor/GUI/Timeline/Timeline.Data.cs +++ b/Source/Editor/GUI/Timeline/Timeline.Data.cs @@ -85,8 +85,9 @@ namespace FlaxEditor.GUI.Timeline var options = new TrackCreateOptions { Archetype = TrackArchetypes[j], - Mute = mute, }; + if (mute) + options.Flags |= TrackFlags.Mute; track = TrackArchetypes[j].Create(options); break; } @@ -119,10 +120,8 @@ namespace FlaxEditor.GUI.Timeline for (int i = 0; i < tracksCount; i++) { var type = stream.ReadByte(); - var flag = stream.ReadByte(); + var flag = (TrackFlags)stream.ReadByte(); Track track = null; - var mute = (flag & 1) == 1; - var loop = (flag & 2) == 2; for (int j = 0; j < TrackArchetypes.Count; j++) { if (TrackArchetypes[j].TypeId == type) @@ -130,8 +129,7 @@ namespace FlaxEditor.GUI.Timeline var options = new TrackCreateOptions { Archetype = TrackArchetypes[j], - Mute = mute, - Loop = loop, + Flags = flag, }; track = TrackArchetypes[j].Create(options); break; @@ -209,12 +207,7 @@ namespace FlaxEditor.GUI.Timeline var track = Tracks[i]; stream.Write((byte)track.Archetype.TypeId); - byte flag = 0; - if (track.Mute) - flag |= 1; - if (track.Loop) - flag |= 2; - stream.Write(flag); + stream.Write((byte)track.Flags); stream.Write(_tracks.IndexOf(track.ParentTrack)); stream.Write(track.SubTracks.Count); Utilities.Utils.WriteStr(stream, track.Name, -13); diff --git a/Source/Editor/GUI/Timeline/Timeline.cs b/Source/Editor/GUI/Timeline/Timeline.cs index 9b799f289..0067d8010 100644 --- a/Source/Editor/GUI/Timeline/Timeline.cs +++ b/Source/Editor/GUI/Timeline/Timeline.cs @@ -1240,7 +1240,6 @@ namespace FlaxEditor.GUI.Timeline var options = new TrackCreateOptions { Archetype = archetype, - Mute = false, }; return archetype.Create(options); } @@ -1577,8 +1576,7 @@ namespace FlaxEditor.GUI.Timeline var options = new TrackCreateOptions { Archetype = track.Archetype, - Loop = track.Loop, - Mute = track.Mute, + Flags = track.Flags, }; var clone = options.Archetype.Create(options); clone.Name = track.CanRename ? GetValidTrackName(track.Name) : track.Name; diff --git a/Source/Editor/GUI/Timeline/Track.cs b/Source/Editor/GUI/Timeline/Track.cs index 07c543b35..6541444b2 100644 --- a/Source/Editor/GUI/Timeline/Track.cs +++ b/Source/Editor/GUI/Timeline/Track.cs @@ -41,6 +41,7 @@ namespace FlaxEditor.GUI.Timeline private Timeline _timeline; private int _trackIndexCached = -1; + private TrackFlags _flags; private Track _parentTrack; internal float _xOffset; private Margin _margin = new Margin(2.0f); @@ -162,14 +163,38 @@ namespace FlaxEditor.GUI.Timeline public Color Color = Color.White; /// - /// The mute flag. Muted tracks are disabled. + /// The track flags. /// - public bool Mute; + public TrackFlags Flags + { + get => _flags; + set + { + if (_flags == value) + return; + _flags = value; + _muteCheckbox.Checked = (Flags & TrackFlags.Mute) == 0; + Timeline?.MarkAsEdited(); + } + } /// - /// The loop flag. Looped tracks are doing a playback of its data in a loop. + /// Controls flag. /// - public bool Loop; + public bool Mute + { + get => (Flags & TrackFlags.Mute) != 0; + set => Flags = value ? (Flags | TrackFlags.Mute) : (Flags & ~TrackFlags.Mute); + } + + /// + /// Controls flag. + /// + public bool Loop + { + get => (Flags & TrackFlags.Loop) != 0; + set => Flags = value ? (Flags | TrackFlags.Loop) : (Flags & ~TrackFlags.Loop); + } /// /// The minimum amount of media items for this track. @@ -245,8 +270,7 @@ namespace FlaxEditor.GUI.Timeline Archetype = options.Archetype; Name = options.Archetype.Name; Icon = options.Archetype.Icon; - Mute = options.Mute; - Loop = options.Loop; + _flags = options.Flags; // Mute checkbox const float buttonSize = 14; @@ -254,7 +278,7 @@ namespace FlaxEditor.GUI.Timeline { TooltipText = "Mute track", AutoFocus = true, - Checked = !Mute, + Checked = (Flags & TrackFlags.Mute) == 0, AnchorPreset = AnchorPresets.MiddleRight, Offsets = new Margin(-buttonSize - 2, buttonSize, buttonSize * -0.5f, buttonSize), IsScrollable = false, @@ -263,19 +287,12 @@ namespace FlaxEditor.GUI.Timeline _muteCheckbox.StateChanged += OnMuteButtonStateChanged; } - internal void SetMute(bool mute) - { - Mute = mute; - _muteCheckbox.Checked = !mute; - } - private void OnMuteButtonStateChanged(CheckBox checkBox) { if (Mute == !checkBox.Checked) return; using (new TrackUndoBlock(this)) Mute = !checkBox.Checked; - Timeline.MarkAsEdited(); } /// diff --git a/Source/Editor/GUI/Timeline/TrackArchetype.cs b/Source/Editor/GUI/Timeline/TrackArchetype.cs index ca855d75a..8833f2c1f 100644 --- a/Source/Editor/GUI/Timeline/TrackArchetype.cs +++ b/Source/Editor/GUI/Timeline/TrackArchetype.cs @@ -1,10 +1,50 @@ // Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +using System; using System.IO; using FlaxEngine; namespace FlaxEditor.GUI.Timeline { + /// + /// Track flags (defined and used in the engine by timeline-based assets: SceneAnimation, ParticleSystem, Animation). + /// + [Flags] + public enum TrackFlags + { + /// + /// Nothing. + /// + None = 0, + + /// + /// The mute flag. Muted tracks are disabled. + /// + Mute = 1, + + /// + /// The loop flag. Looped tracks are doing a playback of its data in a loop. + /// + Loop = 2, + } + + /// + /// Track creation options. + /// + [HideInEditor] + public struct TrackCreateOptions + { + /// + /// The track archetype. + /// + public TrackArchetype Archetype; + + /// + /// The track flags. + /// + public TrackFlags Flags; + } + /// /// Create a new track object. /// diff --git a/Source/Editor/GUI/Timeline/TrackCreateOptions.cs b/Source/Editor/GUI/Timeline/TrackCreateOptions.cs deleted file mode 100644 index 2d370d6ba..000000000 --- a/Source/Editor/GUI/Timeline/TrackCreateOptions.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. - -using FlaxEngine; - -namespace FlaxEditor.GUI.Timeline -{ - /// - /// Track creation options. - /// - [HideInEditor] - public struct TrackCreateOptions - { - /// - /// The track archetype. - /// - public TrackArchetype Archetype; - - /// - /// Create muted track. - /// - public bool Mute; - - /// - /// Create looped track. - /// - public bool Loop; - } -} diff --git a/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs b/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs index be7fcfa40..f64673cac 100644 --- a/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/AudioTrack.cs @@ -30,7 +30,6 @@ namespace FlaxEditor.GUI.Timeline.Tracks return; Track.Loop = value; Preview.DrawMode = value ? AudioClipPreview.DrawModes.Looped : AudioClipPreview.DrawModes.Single; - Timeline?.MarkAsEdited(); } } diff --git a/Source/Editor/GUI/Timeline/Tracks/NestedSceneAnimationTrack.cs b/Source/Editor/GUI/Timeline/Tracks/NestedSceneAnimationTrack.cs index 916d738c2..df833545b 100644 --- a/Source/Editor/GUI/Timeline/Tracks/NestedSceneAnimationTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/NestedSceneAnimationTrack.cs @@ -101,21 +101,6 @@ namespace FlaxEditor.GUI.Timeline.Tracks } } - /// - /// Gets or sets the nested animation looping mode. - /// - public bool TrackLoop - { - get => Loop; - set - { - if (Loop == value) - return; - Loop = value; - Timeline?.MarkAsEdited(); - } - } - /// public NestedSceneAnimationTrack(ref TrackCreateOptions options) : base(ref options) diff --git a/Source/Editor/GUI/Timeline/Undo/AddRemoveTrackAction.cs b/Source/Editor/GUI/Timeline/Undo/AddRemoveTrackAction.cs index 05414d076..14884fbad 100644 --- a/Source/Editor/GUI/Timeline/Undo/AddRemoveTrackAction.cs +++ b/Source/Editor/GUI/Timeline/Undo/AddRemoveTrackAction.cs @@ -24,8 +24,7 @@ namespace FlaxEditor.GUI.Timeline.Undo _options = new TrackCreateOptions { Archetype = track.Archetype, - Loop = track.Loop, - Mute = track.Mute, + Flags = track.Flags, }; _color = track.Color; _name = track.Name; diff --git a/Source/Editor/GUI/Timeline/Undo/EditTrackAction.cs b/Source/Editor/GUI/Timeline/Undo/EditTrackAction.cs index 26f4e2b9f..a7267cab0 100644 --- a/Source/Editor/GUI/Timeline/Undo/EditTrackAction.cs +++ b/Source/Editor/GUI/Timeline/Undo/EditTrackAction.cs @@ -26,8 +26,7 @@ namespace FlaxEditor.GUI.Timeline.Undo using (var stream = new BinaryWriter(memory)) { stream.Write(track.Color); - stream.Write(track.Mute); - stream.Write(track.Loop); + stream.Write((byte)track.Flags); track.Archetype.Save(track, stream); return memory.ToArray(); } @@ -40,8 +39,7 @@ namespace FlaxEditor.GUI.Timeline.Undo using (var stream = new BinaryReader(memory)) { track.Color = stream.ReadColor(); - track.SetMute(stream.ReadBoolean()); - track.Loop = stream.ReadBoolean(); + track.Flags = (TrackFlags)stream.ReadByte(); track.Archetype.Load(Timeline.FormatVersion, track, stream); } _timeline.ArrangeTracks(); diff --git a/Source/Engine/UI/GUI/ContainerControl.cs b/Source/Engine/UI/GUI/ContainerControl.cs index 9d27851dc..3a7ba6e80 100644 --- a/Source/Engine/UI/GUI/ContainerControl.cs +++ b/Source/Engine/UI/GUI/ContainerControl.cs @@ -88,7 +88,7 @@ namespace FlaxEngine.GUI /// /// True if automatic updates for control layout are locked (useful when creating a lot of GUI control to prevent lags). /// - [HideInEditor, NoSerialize] + [HideInEditor, NoSerialize, NoAnimate] public bool IsLayoutLocked { get => _isLayoutLocked;