Refactor Timeline UI to use track flags
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// The mute flag. Muted tracks are disabled.
|
||||
/// The track flags.
|
||||
/// </summary>
|
||||
public bool Mute;
|
||||
public TrackFlags Flags
|
||||
{
|
||||
get => _flags;
|
||||
set
|
||||
{
|
||||
if (_flags == value)
|
||||
return;
|
||||
_flags = value;
|
||||
_muteCheckbox.Checked = (Flags & TrackFlags.Mute) == 0;
|
||||
Timeline?.MarkAsEdited();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The loop flag. Looped tracks are doing a playback of its data in a loop.
|
||||
/// Controls <see cref="TrackFlags.Mute"/> flag.
|
||||
/// </summary>
|
||||
public bool Loop;
|
||||
public bool Mute
|
||||
{
|
||||
get => (Flags & TrackFlags.Mute) != 0;
|
||||
set => Flags = value ? (Flags | TrackFlags.Mute) : (Flags & ~TrackFlags.Mute);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls <see cref="TrackFlags.Loop"/> flag.
|
||||
/// </summary>
|
||||
public bool Loop
|
||||
{
|
||||
get => (Flags & TrackFlags.Loop) != 0;
|
||||
set => Flags = value ? (Flags | TrackFlags.Loop) : (Flags & ~TrackFlags.Loop);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,10 +1,50 @@
|
||||
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using FlaxEngine;
|
||||
|
||||
namespace FlaxEditor.GUI.Timeline
|
||||
{
|
||||
/// <summary>
|
||||
/// Track flags (defined and used in the engine by timeline-based assets: SceneAnimation, ParticleSystem, Animation).
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum TrackFlags
|
||||
{
|
||||
/// <summary>
|
||||
/// Nothing.
|
||||
/// </summary>
|
||||
None = 0,
|
||||
|
||||
/// <summary>
|
||||
/// The mute flag. Muted tracks are disabled.
|
||||
/// </summary>
|
||||
Mute = 1,
|
||||
|
||||
/// <summary>
|
||||
/// The loop flag. Looped tracks are doing a playback of its data in a loop.
|
||||
/// </summary>
|
||||
Loop = 2,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Track creation options.
|
||||
/// </summary>
|
||||
[HideInEditor]
|
||||
public struct TrackCreateOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// The track archetype.
|
||||
/// </summary>
|
||||
public TrackArchetype Archetype;
|
||||
|
||||
/// <summary>
|
||||
/// The track flags.
|
||||
/// </summary>
|
||||
public TrackFlags Flags;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new track object.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
||||
|
||||
using FlaxEngine;
|
||||
|
||||
namespace FlaxEditor.GUI.Timeline
|
||||
{
|
||||
/// <summary>
|
||||
/// Track creation options.
|
||||
/// </summary>
|
||||
[HideInEditor]
|
||||
public struct TrackCreateOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// The track archetype.
|
||||
/// </summary>
|
||||
public TrackArchetype Archetype;
|
||||
|
||||
/// <summary>
|
||||
/// Create muted track.
|
||||
/// </summary>
|
||||
public bool Mute;
|
||||
|
||||
/// <summary>
|
||||
/// Create looped track.
|
||||
/// </summary>
|
||||
public bool Loop;
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,6 @@ namespace FlaxEditor.GUI.Timeline.Tracks
|
||||
return;
|
||||
Track.Loop = value;
|
||||
Preview.DrawMode = value ? AudioClipPreview.DrawModes.Looped : AudioClipPreview.DrawModes.Single;
|
||||
Timeline?.MarkAsEdited();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -101,21 +101,6 @@ namespace FlaxEditor.GUI.Timeline.Tracks
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the nested animation looping mode.
|
||||
/// </summary>
|
||||
public bool TrackLoop
|
||||
{
|
||||
get => Loop;
|
||||
set
|
||||
{
|
||||
if (Loop == value)
|
||||
return;
|
||||
Loop = value;
|
||||
Timeline?.MarkAsEdited();
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public NestedSceneAnimationTrack(ref TrackCreateOptions options)
|
||||
: base(ref options)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user