199 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using UnityEditor.Timeline.Actions;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Playables;
 | |
| using UnityEngine.Timeline;
 | |
| using Object = UnityEngine.Object;
 | |
| 
 | |
| namespace UnityEditor.Timeline
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Provides methods that record the state of a timeline, and its components, prior to modification.
 | |
|     /// </summary>
 | |
|     /// <remarks>
 | |
|     /// The methods in this class are not required when adding or deleting tracks, clips, or markers.
 | |
|     /// Use methods in the UnityEngine.Timeline namespace, such as <see cref="UnityEngine.Timeline.TimelineAsset.CreateTrack"/>
 | |
|     /// or <see cref="UnityEngine.Timeline.TrackAsset.CreateDefaultClip"/>, to apply the appropriate
 | |
|     /// Undo calls when using the Editor.
 | |
|     /// </remarks>
 | |
|     public static class UndoExtensions
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Records changes to all items contained in an action context.
 | |
|         /// </summary>
 | |
|         /// <param name="context">The action context to record into the Undo system.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown 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 changes to timeline asset properties.
 | |
|         /// This method does not record changes to tracks or clips.
 | |
|         /// </summary>
 | |
|         /// <param name="asset">The timeline asset being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown in the Undo menu.</param>
 | |
|         public static void RegisterTimeline(TimelineAsset asset, string undoTitle)
 | |
|         {
 | |
|             using (var undo = new UndoScope(undoTitle))
 | |
|                 undo.AddObject(asset);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Records all timeline changes including changes to tracks, clips, and markers.
 | |
|         /// </summary>
 | |
|         /// <param name="asset">The timeline asset being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown 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 changes to tracks and clips but not to markers nor PlayableAssets attached to clips.
 | |
|         /// </summary>
 | |
|         /// <param name="asset">The timeline track being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown in the Undo menu.</param>
 | |
|         public static void RegisterTrack(TrackAsset asset, string undoTitle)
 | |
|         {
 | |
|             using (var undo = new UndoScope(undoTitle))
 | |
|                 undo.AddObject(asset);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Records changes to tracks. This includes changes
 | |
|         /// to clips on these tracks, but not changes to markers nor PlayableAssets attached to clips.
 | |
|         /// </summary>
 | |
|         /// <param name="tracks">The timeline track being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown 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 changes to a clip.
 | |
|         /// </summary>
 | |
|         /// <param name="clip">The timeline clip being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown in the Undo menu.</param>
 | |
|         /// <param name="includePlayableAsset">Set this value to true to record changes to 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 changes to a PlayableAsset.
 | |
|         /// </summary>
 | |
|         /// <param name="asset">The PlayableAsset being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown in the Undo menu.</param>
 | |
|         public static void RegisterPlayableAsset(PlayableAsset asset, string undoTitle)
 | |
|         {
 | |
|             using (var undo = new UndoScope(undoTitle))
 | |
|                 undo.AddObject(asset);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Records changes to clips.
 | |
|         /// </summary>
 | |
|         /// <param name="clips">The timeline clips being modified.</param>
 | |
|         /// <param name="name">The title of the action that appears in the undo history. For example, this title is shown in the Undo menu.</param>
 | |
|         /// <param name="includePlayableAssets">Set this value to true to also record changes to 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 changes to a timeline marker.
 | |
|         /// </summary>
 | |
|         /// <param name="marker">The timeline marker being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown 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 changes to timeline markers.
 | |
|         /// </summary>
 | |
|         /// <param name="markers">The timeline markers being modified.</param>
 | |
|         /// <param name="undoTitle">The title of the action that appears in the undo history. For example, this title is shown in the Undo menu.</param>
 | |
|         public static void RegisterMarkers(IEnumerable<IMarker> markers, string undoTitle)
 | |
|         {
 | |
|             using (var undo = new UndoScope(undoTitle))
 | |
|                 undo.Add(markers);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// This class provides an object which prevents the creation of undos for all Timeline operations. Undos are restored when the object is disposed.
 | |
|         /// </summary>
 | |
|         /// <remarks>
 | |
|         /// Use this class to procedurally create or modify TimelineAssets when undos are not needed.
 | |
|         /// If multiple DisableTimelineUndoScope instances are created, undos are only restored after all instances are disposed.
 | |
|         ///
 | |
|         /// It is recommended to use this object within a using scope.
 | |
|         /// </remarks>
 | |
|         /// <example>
 | |
|         /// <code>
 | |
|         /// var timelineAsset = new TimelineAsset();
 | |
|         /// using (new DisableTimelineUndoScope())
 | |
|         /// {
 | |
|         ///     //Creates a track without generating an undo
 | |
|         ///     timelineAsset.CreateTrack<ActivationTrack>();
 | |
|         /// }
 | |
|         /// </code>
 | |
|         /// </example>
 | |
|         internal sealed class DisableTimelineUndoScope : IDisposable
 | |
|         {
 | |
|             TimelineUndo.DisableUndoScope m_DisableScope;
 | |
| 
 | |
|             /// <summary>
 | |
|             /// Creates a new DisableTimelineUndoScope object which prevents undos from being created by Timeline operations.
 | |
|             /// </summary>
 | |
|             public DisableTimelineUndoScope()
 | |
|             {
 | |
|                 m_DisableScope = new TimelineUndo.DisableUndoScope();
 | |
|             }
 | |
| 
 | |
|             /// <summary>
 | |
|             /// Disposes the DisableTimelineUndoScope object.
 | |
|             /// </summary>
 | |
|             public void Dispose()
 | |
|             {
 | |
|                 m_DisableScope.Dispose();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |