|  |  |  |  | using TNode.BaseViews;
 | 
					
						
							|  |  |  |  | using TNode.Models;
 | 
					
						
							|  |  |  |  | using UnityEngine;
 | 
					
						
							|  |  |  |  | using UnityEngine.UIElements;
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace TNode.Editor.Inspector{
 | 
					
						
							|  |  |  |  |     public abstract class InspectorItem<T>:VisualElement,INodeDataBinding<T>{
 | 
					
						
							|  |  |  |  |         private NodeData _bindingNodeData;
 | 
					
						
							|  |  |  |  |         private string _bindingFieldName;
 | 
					
						
							|  |  |  |  |         protected BaseField<T> 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<T> bindable){
 | 
					
						
							|  |  |  |  |             Bindable = bindable;
 | 
					
						
							|  |  |  |  |             this.Add(Bindable);
 | 
					
						
							|  |  |  |  |             Bindable?.RegisterValueChangedCallback(e => {
 | 
					
						
							|  |  |  |  |                 SetValue(e.newValue);
 | 
					
						
							|  |  |  |  |             });
 | 
					
						
							|  |  |  |  |         }
 | 
					
						
							|  |  |  |  |         private void OnValueChangedHandler(){
 | 
					
						
							|  |  |  |  |             Bindable = this.Q<BaseField<T>>();
 | 
					
						
							|  |  |  |  |             if(Bindable!= null){
 | 
					
						
							|  |  |  |  |                 Bindable.value = Value;
 | 
					
						
							|  |  |  |  |                 Bindable.label = BindingPath;
 | 
					
						
							|  |  |  |  |             }
 | 
					
						
							|  |  |  |  |         }
 | 
					
						
							|  |  |  |  |         ~InspectorItem(){
 | 
					
						
							|  |  |  |  |             OnValueChanged-= OnValueChangedHandler;
 | 
					
						
							|  |  |  |  |         }
 | 
					
						
							|  |  |  |  |     }
 | 
					
						
							|  |  |  |  | }
 |