using System; using System.Collections.Generic; using TNodeCore.Models; using UnityEngine; namespace TNodeCore.Editor.Serialization{ [Obsolete] 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:DataWrapper{ } /// /// Scriptable object wrapper enable property drawer for t-node /// instance create automatically when using get function,generic node data is not support yet because of unity serialization system. /// TODO : support generic node data /// // public class NodeDataWrapper:ScriptableObject{ // [SerializeReference] // public NodeData data; // private static readonly Dictionary Cache = new (); // public event Action OnValueChanged; // /// // /// Create a new wrapper or get a infoCached wrapper for the given data // /// // /// node data,an implemented type is acceptable // /// // public static NodeDataWrapper Get(NodeData data){ // if (data.GetType().IsGenericType){ // return CreateInstance(); // } // if(Cache.ContainsKey(data)){ // return Cache[data]; // } // var wrapper = 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; // // } // /// // /// Use this to get the wrapped data directly. // /// // /// // /// // public static implicit operator NodeDataWrapper(NodeData unWrapper){ // if (unWrapper == null) // return null; // return Get(unWrapper); // } // } }