using System; using System.Collections.Generic; using TNode.Models; using UnityEngine; namespace TNode.Editor{ /// /// Scriptable object wrapper enable property drawer for t-node /// public class NodeDataWrapper : ScriptableObject where T : NodeData{ public T Data; private static readonly Dictionary> Cache = new (); public event Action> OnValueChanged; public static NodeDataWrapper Get(T data){ if(Cache.ContainsKey(data)){ return Cache[data]; } var wrapper = ScriptableObject.CreateInstance>(); Cache.Add(data,wrapper); return wrapper; } public NodeDataWrapper(T data){ this.Data = data; } public void SetValue(string path, object value){ var fieldInfo = Data.GetType().GetField(path); fieldInfo.SetValue(Data,value); OnValueChanged?.Invoke(this); } public object GetValue(string path){ var fieldInfo = Data.GetType().GetField(path); return fieldInfo.GetValue(Data); } public static implicit operator T(NodeDataWrapper wrapper){ if (wrapper == null) return null; return wrapper.Data; } public static implicit operator NodeDataWrapper(T unWrapper){ if (unWrapper == null) return null; return Get(unWrapper); } } public class NodeDataWrapper:ScriptableObject{ [SerializeReference] public NodeData Data; private static readonly Dictionary Cache = new (); public event Action OnValueChanged; public static NodeDataWrapper Get(NodeData data){ if (data.GetType().IsGenericType){ return ScriptableObject.CreateInstance(); } if(Cache.ContainsKey(data)){ return Cache[data]; } var wrapper = ScriptableObject.CreateInstance(); wrapper.Data = data; Cache.Add(data,wrapper); return wrapper; } public void SetValue(string path, object value){ var fieldInfo = Data.GetType().GetField(path); fieldInfo.SetValue(Data,value); OnValueChanged?.Invoke(this); } public object GetValue(string path){ var fieldInfo = Data.GetType().GetField(path); return fieldInfo.GetValue(Data); } public static implicit operator NodeData(NodeDataWrapper wrapper){ if (wrapper == null) return null; return wrapper.Data; } public static implicit operator NodeDataWrapper(NodeData unWrapper){ if (unWrapper == null) return null; return Get(unWrapper); } } }