A game about forced loneliness, made by TACStudios
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}