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.
109 lines
3.2 KiB
109 lines
3.2 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Diagnostics; |
|
using UnityEngine.Playables; |
|
|
|
#if UNITY_EDITOR |
|
using UnityEditor; |
|
#endif |
|
|
|
namespace UnityEngine.Timeline |
|
{ |
|
static class TimelineUndo |
|
{ |
|
public static void PushDestroyUndo(TimelineAsset timeline, Object thingToDirty, Object objectToDestroy) |
|
{ |
|
#if UNITY_EDITOR |
|
if (objectToDestroy == null || !DisableUndoGuard.enableUndo) |
|
return; |
|
|
|
if (thingToDirty != null) |
|
EditorUtility.SetDirty(thingToDirty); |
|
|
|
if (timeline != null) |
|
EditorUtility.SetDirty(timeline); |
|
|
|
Undo.DestroyObjectImmediate(objectToDestroy); |
|
#else |
|
if (objectToDestroy != null) |
|
Object.Destroy(objectToDestroy); |
|
#endif |
|
} |
|
|
|
[Conditional("UNITY_EDITOR")] |
|
public static void PushUndo(Object[] thingsToDirty, string operation) |
|
{ |
|
#if UNITY_EDITOR |
|
if (thingsToDirty == null || !DisableUndoGuard.enableUndo) |
|
return; |
|
|
|
for (var i = 0; i < thingsToDirty.Length; i++) |
|
{ |
|
if (thingsToDirty[i] is TrackAsset track) |
|
track.MarkDirty(); |
|
EditorUtility.SetDirty(thingsToDirty[i]); |
|
} |
|
Undo.RegisterCompleteObjectUndo(thingsToDirty, UndoName(operation)); |
|
#endif |
|
} |
|
|
|
[Conditional("UNITY_EDITOR")] |
|
public static void PushUndo(Object thingToDirty, string operation) |
|
{ |
|
#if UNITY_EDITOR |
|
if (thingToDirty != null && DisableUndoGuard.enableUndo) |
|
{ |
|
var track = thingToDirty as TrackAsset; |
|
if (track != null) |
|
track.MarkDirty(); |
|
|
|
EditorUtility.SetDirty(thingToDirty); |
|
Undo.RegisterCompleteObjectUndo(thingToDirty, UndoName(operation)); |
|
} |
|
#endif |
|
} |
|
|
|
[Conditional("UNITY_EDITOR")] |
|
public static void RegisterCreatedObjectUndo(Object thingCreated, string operation) |
|
{ |
|
#if UNITY_EDITOR |
|
if (DisableUndoGuard.enableUndo) |
|
{ |
|
Undo.RegisterCreatedObjectUndo(thingCreated, UndoName(operation)); |
|
} |
|
#endif |
|
} |
|
|
|
private static string UndoName(string name) => "Timeline " + name; |
|
|
|
#if UNITY_EDITOR |
|
internal struct DisableUndoGuard : IDisposable |
|
{ |
|
internal static bool enableUndo = true; |
|
static readonly Stack<bool> m_UndoStateStack = new Stack<bool>(); |
|
bool m_Disposed; |
|
public DisableUndoGuard(bool disable) |
|
{ |
|
m_Disposed = false; |
|
m_UndoStateStack.Push(enableUndo); |
|
enableUndo = !disable; |
|
} |
|
|
|
public void Dispose() |
|
{ |
|
if (!m_Disposed) |
|
{ |
|
if (m_UndoStateStack.Count == 0) |
|
{ |
|
Debug.LogError("UnMatched DisableUndoGuard calls"); |
|
enableUndo = true; |
|
return; |
|
} |
|
enableUndo = m_UndoStateStack.Pop(); |
|
m_Disposed = true; |
|
} |
|
} |
|
} |
|
#endif |
|
} |
|
}
|
|
|