using TNode.BaseViews; using TNode.Models; using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector{ public abstract class InspectorItem:VisualElement,INodeDataBinding{ private NodeData _bindingNodeData; private string _bindingFieldName; protected BaseField Bindable; protected event System.Action OnValueChanged; public string BindingPath{ get => _bindingFieldName; set{ _bindingFieldName = value; if(_bindingFieldName!=null&&_bindingNodeData!=null){ OnValueChanged?.Invoke(); } } } public NodeData BindingNodeData{ get => _bindingNodeData; set{ _bindingNodeData = value; if(_bindingFieldName!=null&&_bindingNodeData!=null){ OnValueChanged?.Invoke(); } } } private T GetValue(){ var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); Debug.Log(fieldInfo); Debug.Log(fieldInfo?.FieldType ); //check field type if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ return (T)fieldInfo.GetValue(BindingNodeData); } else{ Debug.LogError("Wrong Type for current node data"); } return default; } protected T Value => GetValue(); protected void SetValue(T value){ var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); Debug.Log(fieldInfo); Debug.Log(fieldInfo?.FieldType ); if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ fieldInfo.SetValue(_bindingNodeData,value); //if value changed ,notify node inspector's current inspecting node view if (parent.parent is NodeInspector nodeInspector){ nodeInspector.NodeView.OnDataModified(); } } else{ Debug.LogError("Wrong Type for current node data"); } } public InspectorItem(){ OnValueChanged+= OnValueChangedHandler; } public void CreateBindable(BaseField bindable){ Bindable = bindable; this.Add(Bindable); Bindable?.RegisterValueChangedCallback(e => { SetValue(e.newValue); }); } private void OnValueChangedHandler(){ Bindable = this.Q>(); if(Bindable!= null){ Bindable.value = Value; Bindable.label = BindingPath; } } ~InspectorItem(){ OnValueChanged-= OnValueChangedHandler; } } }