86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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(); | ||
|  |         } | ||
|  |     } | ||
|  | } |