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();
|
||
|
}
|
||
|
}
|
||
|
}
|