#if UNITY_EDITOR using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors { [Serializable] internal abstract class WrapperBase : ScriptableObject { public abstract object Data { get; } public abstract bool IsExpanded { get; set; } public abstract SerializedObject SO { get; } public abstract SerializedProperty Property { get; } public abstract void Release(); } [Serializable] internal abstract class WrapperBase : WrapperBase where TSelf : WrapperBase { private SerializedObject _so; private SerializedProperty _property; private bool _isDestroyed = false; private bool _isReleased = false; private static Stack _wrappers = new Stack(); public override bool IsExpanded { get { return Property.isExpanded; } set { Property.isExpanded = value; } } public override SerializedObject SO { get { return _so; } } public override SerializedProperty Property { get { return _property; } } public static TSelf Take() { TSelf result; if (_wrappers.Count <= 0) { result = CreateInstance(); result._so = new SerializedObject(result); result._property = result._so.FindProperty("data"); } else { result = _wrappers.Pop(); if (result._isDestroyed) { result = Take(); } } result._isReleased = false; return result; } public static void Release(TSelf wrapper) { if (wrapper._isReleased) { throw new Exception(); } wrapper._isReleased = true; _wrappers.Push(wrapper); } private void OnDestroy() { _isDestroyed = true; } public override void Release() { Release((TSelf)this); } } } #endif