You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.3 KiB
85 lines
2.3 KiB
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(); |
|
} |
|
} |
|
}
|
|
|