File size: 7,573 Bytes
18a519f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | 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);
}
}
}
|