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;