A game about forced loneliness, made by TACStudios
at master 142 lines 4.0 kB view raw
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5 6namespace UnityEditor.U2D.Animation 7{ 8 internal class Cache : BaseObject, ICacheUndo 9 { 10 public static T Create<T>() where T : Cache 11 { 12 var cache = CreateInstance<T>(); 13 cache.hideFlags = HideFlags.DontSave; 14 cache.name = cache.GetType().ToString(); 15 return cache; 16 } 17 18 public static void Destroy(Cache cache) 19 { 20 cache.Destroy(); 21 DestroyImmediate(cache); 22 } 23 24 [SerializeField] 25 private List<CacheObject> m_CacheObjects = new List<CacheObject>(); 26 [SerializeField] 27 private List<CacheObject> m_RemovedCacheObjects = new List<CacheObject>(); 28 private string m_UndoOperationName = null; 29 private IUndo m_DefaultUndo = new UnityEngineUndo(); 30 private IUndo m_UndoOverride = null; 31 32 protected IUndo undo 33 { 34 get 35 { 36 if (undoOverride != null) 37 return undoOverride; 38 39 return m_DefaultUndo; 40 } 41 } 42 43 public IUndo undoOverride 44 { 45 get { return m_UndoOverride; } 46 set { m_UndoOverride = value; } 47 } 48 49 public bool isUndoOperationSet 50 { 51 get { return string.IsNullOrEmpty(m_UndoOperationName) == false; } 52 } 53 54 public void IncrementCurrentGroup() 55 { 56 undo.IncrementCurrentGroup(); 57 } 58 59 public virtual void BeginUndoOperation(string operationName) 60 { 61 if (isUndoOperationSet == false) 62 { 63 Debug.Assert(!m_CacheObjects.Contains(null)); 64 65 m_UndoOperationName = operationName; 66 undo.RegisterCompleteObjectUndo(this, m_UndoOperationName); 67 undo.RegisterCompleteObjectUndo(m_CacheObjects.ToArray(), m_UndoOperationName); 68 undo.RegisterCompleteObjectUndo(m_RemovedCacheObjects.ToArray(), m_UndoOperationName); 69 } 70 } 71 72 public void EndUndoOperation() 73 { 74 m_UndoOperationName = null; 75 } 76 77 public bool IsRemoved(CacheObject cacheObject) 78 { 79 return m_RemovedCacheObjects.Contains(cacheObject); 80 } 81 82 public T CreateCache<T>() where T : CacheObject 83 { 84 var cacheObject = FindRemovedCacheObject<T>(); 85 86 if (cacheObject != null) 87 { 88 m_RemovedCacheObjects.Remove(cacheObject); 89 cacheObject.OnEnable(); 90 } 91 else 92 { 93 cacheObject = CacheObject.Create<T>(this); 94 } 95 96 m_CacheObjects.Add(cacheObject); 97 98 cacheObject.OnCreate(); 99 100 return cacheObject; 101 } 102 103 private T FindRemovedCacheObject<T>() where T : CacheObject 104 { 105 return m_RemovedCacheObjects.FirstOrDefault((o) => o.GetType().Equals(typeof(T))) as T; 106 } 107 108 public void Destroy(CacheObject cacheObject) 109 { 110 Debug.Assert(cacheObject != null); 111 Debug.Assert(cacheObject.owner == this); 112 Debug.Assert(m_CacheObjects.Contains(cacheObject)); 113 114 m_CacheObjects.Remove(cacheObject); 115 m_RemovedCacheObjects.Add(cacheObject); 116 117 cacheObject.OnDestroy(); 118 } 119 120 public void Destroy() 121 { 122 Debug.Assert(!m_CacheObjects.Contains(null)); 123 124 EndUndoOperation(); 125 126 undo.ClearUndo(this); 127 128 var cacheObjects = m_CacheObjects.ToArray(); 129 130 foreach (var cacheObject in cacheObjects) 131 DestroyImmediate(cacheObject); 132 133 cacheObjects = m_RemovedCacheObjects.ToArray(); 134 135 foreach (var cacheObject in cacheObjects) 136 DestroyImmediate(cacheObject); 137 138 m_CacheObjects.Clear(); 139 m_RemovedCacheObjects.Clear(); 140 } 141 } 142}