Initial Commit

This commit is contained in:
Sebastian Cabrera 2021-08-02 05:44:37 -04:00
parent 53eb92e9af
commit 270ab7d11f
15341 changed files with 700234 additions and 0 deletions

View file

@ -0,0 +1,41 @@
using System;
namespace UnityEditor.Timeline.Actions
{
/// <summary>
/// Use this attribute on action classes (<see cref="TimelineAction"/>,
/// <see cref="ClipAction"/>,
/// <see cref="MarkerAction"/> and
/// <see cref="TrackAction"/>)
/// to have the default undo behaviour applied.
///
/// By default, applying this attribute will record all objects passed to the Execute method with the Undo system,
/// using the name of Action it is applied to.
///
/// <example>
/// Simple track Action example (with context menu and shortcut support).
/// <code source="../../DocCodeExamples/TimelineAttributesExamples.cs" region="declare-applyDefaultUndoAttr" title="ApplyDefaultUndoAttr"/>
/// </example>
/// </summary>
/// <seealso cref="TimelineAction"/>
/// <seealso cref="TrackAction"/>
/// <seealso cref="ClipAction"/>
/// <seealso cref="MarkerAction"/>
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class ApplyDefaultUndoAttribute : Attribute
{
/// <summary>
/// The title of the action to appear in the undo history. If not specified, the name is taken from the DisplayName attribute,
/// or derived from the name of the class this attribute is applied to.
/// </summary>
public string UndoTitle;
/// <summary>Use this attribute on action classes to have the default undo behaviour applied.
/// </summary>
/// <param name="undoTitle">The title of the action to appear in the undo history.</param>
public ApplyDefaultUndoAttribute(string undoTitle = null)
{
UndoTitle = undoTitle;
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b46a1ab31b3043b88cc57df2167383ac
timeCreated: 1590517869

View file

@ -0,0 +1,160 @@
using System.Collections.Generic;
using UnityEditor.Timeline.Actions;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
using Object = UnityEngine.Object;
namespace UnityEditor.Timeline
{
/// <summary>
/// Use this class to record the state of a timeline or its components prior to modification.
/// </summary>
/// <remarks>
/// These methods do not need to be used when adding or deleting tracks, clips or markers.
/// Methods in the UnityEngine.Timeline namespace, such as <see cref="UnityEngine.Timeline.TimelineAsset.CreateTrack"/>
/// or <see cref="UnityEngine.Timeline.TrackAsset.CreateDefaultClip"/> will apply the appropriate
/// Undo calls when called in Editor.
/// </remarks>
public static class UndoExtensions
{
/// <summary>
/// Records all items contained in an action context. Use this method to record all objects
/// inside the context.
/// </summary>
/// <param name="context">The action context to record into the Undo system.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterContext(ActionContext context, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
{
undo.Add(context.tracks);
undo.Add(context.clips, true);
undo.Add(context.markers);
}
}
/// <summary>
/// Records any changes done on the timeline after being called. This only applies
/// to the timeline asset properties itself, and not any of the tracks or clips on the timeline
/// </summary>
/// <param name="asset">The timeline asset being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterTimeline(TimelineAsset asset, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
undo.AddObject(asset);
}
/// <summary>
/// Records any changes done on the timeline after being called, including any changes
/// to any clips, tracks and markers that occur on the timeline.
/// </summary>
/// <param name="asset">The timeline asset being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterCompleteTimeline(TimelineAsset asset, string undoTitle)
{
if (asset == null)
return;
using (var undo = new UndoScope(undoTitle))
{
undo.AddObject(asset);
undo.Add(asset.flattenedTracks);
foreach (var t in asset.flattenedTracks)
{
undo.Add(t.GetClips(), true);
undo.Add(t.GetMarkers());
}
}
}
/// <summary>
/// Records any changes done on the track after being called, including any changes
/// to clips on the track, but not on markers or PlayableAssets attached to the clips.
/// </summary>
/// <param name="asset">The timeline track being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterTrack(TrackAsset asset, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
undo.AddObject(asset);
}
/// <summary>
/// Records any changes done on the tracks after being called, including any changes
/// to clips on the tracks, but not on markers or PlayableAssets attached to the clips.
/// </summary>
/// <param name="tracks">The timeline track being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterTracks(IEnumerable<TrackAsset> tracks, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
undo.Add(tracks);
}
/// <summary>
/// Records any changes done on the clip after being called.
/// </summary>
/// <param name="clip">The timeline clip being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
/// <param name="includePlayableAsset">Set this value to true to also record changes on the attached playable asset.</param>
public static void RegisterClip(TimelineClip clip, string undoTitle, bool includePlayableAsset = true)
{
using (var undo = new UndoScope(undoTitle))
{
undo.AddClip(clip, includePlayableAsset);
}
}
/// <summary>
/// Records any changes done on the PlayableAsset after being called.
/// </summary>
/// <param name="asset">The timeline track being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterPlayableAsset(PlayableAsset asset, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
undo.AddObject(asset);
}
/// <summary>
/// Records any changes done on the clips after being called.
/// </summary>
/// <param name="clips">The timeline clips being modified.</param>
/// <param name="name">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
/// <param name="includePlayableAssets">Set this value to true to also record changes on the attached playable assets.</param>
public static void RegisterClips(IEnumerable<TimelineClip> clips, string name, bool includePlayableAssets = true)
{
using (var undo = new UndoScope(name))
undo.Add(clips, includePlayableAssets);
}
/// <summary>
/// Records any changes done on the Timeline Marker after being called.
/// </summary>
/// <param name="marker">The timeline clip being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterMarker(IMarker marker, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
{
if (marker is Object o)
undo.AddObject(o);
else if (marker != null)
undo.AddObject(marker.parent);
}
}
/// <summary>
/// Records any changes done on the Timeline Markers after being called.
/// </summary>
/// <param name="markers">The timeline clip being modified.</param>
/// <param name="undoTitle">The title of the action to appear in the undo history (i.e. visible in the undo menu).</param>
public static void RegisterMarkers(IEnumerable<IMarker> markers, string undoTitle)
{
using (var undo = new UndoScope(undoTitle))
undo.Add(markers);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3484c53050e20474bb37d3808245721a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Timeline;
using Object = UnityEngine.Object;
namespace UnityEditor.Timeline
{
/// <summary>
/// Disposable scope object used to collect multiple items for Undo.
/// Automatically filters out duplicates
/// </summary>
struct UndoScope : IDisposable
{
private static readonly HashSet<UnityEngine.Object> s_ObjectsToUndo = new HashSet<Object>();
private string m_Name;
public UndoScope(string name)
{
m_Name = name;
}
public void Dispose()
{
ApplyUndo(m_Name);
}
public void AddObject(UnityEngine.Object asset)
{
if (asset != null)
s_ObjectsToUndo.Add(asset);
}
public void AddClip(TimelineClip clip, bool includeAsset)
{
if (clip != null && clip.GetParentTrack() != null)
s_ObjectsToUndo.Add(clip.GetParentTrack());
if (includeAsset && clip != null && clip.asset != null)
s_ObjectsToUndo.Add(clip.asset);
}
public void Add(IEnumerable<TrackAsset> tracks)
{
if (tracks == null)
return;
foreach (var track in tracks)
AddObject(track);
}
public void Add(IEnumerable<TimelineClip> clips, bool includeAssets)
{
if (clips == null)
return;
foreach (var clip in clips)
{
AddClip(clip, includeAssets);
}
}
public void Add(IEnumerable<IMarker> markers)
{
if (markers == null)
return;
foreach (var marker in markers)
{
if (marker is Object o)
AddObject(o);
else if (marker != null)
AddObject(marker.parent);
}
}
private static void ApplyUndo(string name)
{
if (s_ObjectsToUndo.Count == 1)
TimelineUndo.PushUndo(s_ObjectsToUndo.First(), name);
else if (s_ObjectsToUndo.Count > 1)
TimelineUndo.PushUndo(s_ObjectsToUndo.ToArray(), name);
s_ObjectsToUndo.Clear();
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ef85e74dfd3749279eff9e7fbfbaf3f8
timeCreated: 1590436732