112 lines
2.6 KiB
C#
112 lines
2.6 KiB
C#
|
|
using System;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
namespace UnityEditor.U2D.Sprites
|
||
|
|
{
|
||
|
|
[Serializable]
|
||
|
|
abstract class UndoObject : ScriptableObject
|
||
|
|
{
|
||
|
|
static bool s_Undoing = false;
|
||
|
|
IUndoSystem m_UndoSystem;
|
||
|
|
|
||
|
|
public static void BeginUndo()
|
||
|
|
{
|
||
|
|
s_Undoing = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void EndUndo()
|
||
|
|
{
|
||
|
|
s_Undoing = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool undoing => s_Undoing;
|
||
|
|
|
||
|
|
public static T Create<T, T1>(T1 data, IUndoSystem undoSystem) where T : UndoObject<T1> where T1:struct, IEquatable<T1>
|
||
|
|
{
|
||
|
|
var undoObject = CreateInstance<T>();
|
||
|
|
undoObject.hideFlags = HideFlags.HideAndDontSave;
|
||
|
|
undoObject.Init(data);
|
||
|
|
undoObject.m_UndoSystem = undoSystem;
|
||
|
|
return undoObject;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void Dispose(UndoObject undoObject)
|
||
|
|
{
|
||
|
|
if (undoObject != null)
|
||
|
|
{
|
||
|
|
undoObject?.Dispose();
|
||
|
|
if(!EditorUtility.IsPersistent(undoObject))
|
||
|
|
DestroyImmediate(undoObject);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
protected IUndoSystem undoSystem => m_UndoSystem;
|
||
|
|
public abstract void Dispose();
|
||
|
|
}
|
||
|
|
|
||
|
|
[Serializable]
|
||
|
|
class UndoObject<T> : UndoObject, ISerializationCallbackReceiver where T: IEquatable<T>
|
||
|
|
{
|
||
|
|
|
||
|
|
[SerializeField]
|
||
|
|
int m_Version = 0;
|
||
|
|
int m_CurrentVersion = 0;
|
||
|
|
|
||
|
|
[SerializeField]
|
||
|
|
T m_Data;
|
||
|
|
|
||
|
|
public void Init(T data)
|
||
|
|
{
|
||
|
|
m_Data = data;
|
||
|
|
}
|
||
|
|
|
||
|
|
public void SetData(T data, string actionName)
|
||
|
|
{
|
||
|
|
if (!data.Equals(m_Data))
|
||
|
|
{
|
||
|
|
if (!undoing)
|
||
|
|
{
|
||
|
|
undoSystem.RegisterCompleteObjectUndo(this, actionName);
|
||
|
|
m_Data = data;
|
||
|
|
m_CurrentVersion++;
|
||
|
|
m_Version = m_CurrentVersion;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
SetData(data);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public T data => m_Data;
|
||
|
|
|
||
|
|
public void SetData(T data)
|
||
|
|
{
|
||
|
|
m_Data = data;
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool VersionChanged(bool resetVersion)
|
||
|
|
{
|
||
|
|
bool returnValue = m_CurrentVersion != m_Version;
|
||
|
|
if (resetVersion)
|
||
|
|
m_CurrentVersion = m_Version;
|
||
|
|
return returnValue;
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void Dispose()
|
||
|
|
{
|
||
|
|
undoSystem.ClearUndo(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void OnBeforeSerialize()
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
public void OnAfterDeserialize()
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|