|
|
@ -1,4 +1,5 @@ |
|
|
|
using TNode.BaseViews; |
|
|
|
using System; |
|
|
|
|
|
|
|
using TNode.BaseViews; |
|
|
|
using TNode.Models; |
|
|
|
using TNode.Models; |
|
|
|
using UnityEngine; |
|
|
|
using UnityEngine; |
|
|
|
using UnityEngine.UIElements; |
|
|
|
using UnityEngine.UIElements; |
|
|
@ -8,14 +9,14 @@ namespace TNode.Editor.Inspector{ |
|
|
|
private NodeData _bindingNodeData; |
|
|
|
private NodeData _bindingNodeData; |
|
|
|
private string _bindingFieldName; |
|
|
|
private string _bindingFieldName; |
|
|
|
protected BaseField<T> Bindable; |
|
|
|
protected BaseField<T> Bindable; |
|
|
|
protected event System.Action OnValueChanged; |
|
|
|
protected event System.Action OnDataChanged; |
|
|
|
|
|
|
|
|
|
|
|
public string BindingPath{ |
|
|
|
public string BindingPath{ |
|
|
|
get => _bindingFieldName; |
|
|
|
get => _bindingFieldName; |
|
|
|
set{ |
|
|
|
set{ |
|
|
|
_bindingFieldName = value; |
|
|
|
_bindingFieldName = value; |
|
|
|
if(_bindingFieldName!=null&&_bindingNodeData!=null){ |
|
|
|
if(_bindingFieldName!=null&&_bindingNodeData!=null){ |
|
|
|
OnValueChanged?.Invoke(); |
|
|
|
OnDataChanged?.Invoke(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -23,19 +24,22 @@ namespace TNode.Editor.Inspector{ |
|
|
|
public NodeData BindingNodeData{ |
|
|
|
public NodeData BindingNodeData{ |
|
|
|
get => _bindingNodeData; |
|
|
|
get => _bindingNodeData; |
|
|
|
set{ |
|
|
|
set{ |
|
|
|
|
|
|
|
var oldWrapper = ((NodeDataWrapper) _bindingNodeData); |
|
|
|
|
|
|
|
if(oldWrapper!=null){ |
|
|
|
|
|
|
|
oldWrapper.OnValueChanged -= OnNodeDataValueChanged; |
|
|
|
|
|
|
|
} |
|
|
|
_bindingNodeData = value; |
|
|
|
_bindingNodeData = value; |
|
|
|
if(_bindingFieldName!=null&&_bindingNodeData!=null){ |
|
|
|
if(_bindingFieldName!=null&&_bindingNodeData!=null){ |
|
|
|
OnValueChanged?.Invoke(); |
|
|
|
OnDataChanged?.Invoke(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(_bindingNodeData!=null) |
|
|
|
|
|
|
|
((NodeDataWrapper) _bindingNodeData).OnValueChanged += OnNodeDataValueChanged; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private T GetValue(){ |
|
|
|
private T GetValue(){ |
|
|
|
|
|
|
|
|
|
|
|
var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); |
|
|
|
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 |
|
|
|
//check field type |
|
|
|
if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ |
|
|
|
if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ |
|
|
|
return (T)fieldInfo.GetValue(BindingNodeData); |
|
|
|
return (T)fieldInfo.GetValue(BindingNodeData); |
|
|
@ -49,41 +53,49 @@ namespace TNode.Editor.Inspector{ |
|
|
|
protected T Value => GetValue(); |
|
|
|
protected T Value => GetValue(); |
|
|
|
|
|
|
|
|
|
|
|
protected void SetValue(T value){ |
|
|
|
protected void SetValue(T value){ |
|
|
|
var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); |
|
|
|
NodeDataWrapper wrapper = _bindingNodeData; |
|
|
|
Debug.Log(fieldInfo); |
|
|
|
Debug.Log(wrapper); |
|
|
|
Debug.Log(fieldInfo?.FieldType ); |
|
|
|
wrapper.SetValue(BindingPath,value); |
|
|
|
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(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public InspectorItem(){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OnDataChanged+= OnDataChangedHandler; |
|
|
|
} |
|
|
|
} |
|
|
|
else{ |
|
|
|
/* |
|
|
|
Debug.LogError("Wrong Type for current node data"); |
|
|
|
* e => { |
|
|
|
|
|
|
|
SetValue(e.newValue); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private void OnInspectorItemValueChanged(ChangeEvent<T> e){ |
|
|
|
|
|
|
|
SetValue(e.newValue); |
|
|
|
} |
|
|
|
} |
|
|
|
public InspectorItem(){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OnValueChanged+= OnValueChangedHandler; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
public void CreateBindable(BaseField<T> bindable){ |
|
|
|
public void CreateBindable(BaseField<T> bindable){ |
|
|
|
|
|
|
|
if (Bindable != null){ |
|
|
|
|
|
|
|
Bindable.Clear(); |
|
|
|
|
|
|
|
Bindable.UnregisterValueChangedCallback(OnInspectorItemValueChanged); |
|
|
|
|
|
|
|
} |
|
|
|
Bindable = bindable; |
|
|
|
Bindable = bindable; |
|
|
|
this.Add(Bindable); |
|
|
|
this.Add(Bindable); |
|
|
|
Bindable?.RegisterValueChangedCallback(e => { |
|
|
|
Bindable?.RegisterValueChangedCallback(OnInspectorItemValueChanged); |
|
|
|
SetValue(e.newValue); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
private void OnValueChangedHandler(){ |
|
|
|
private void OnDataChangedHandler(){ |
|
|
|
Bindable = this.Q<BaseField<T>>(); |
|
|
|
Bindable = this.Q<BaseField<T>>(); |
|
|
|
if(Bindable!= null){ |
|
|
|
if(Bindable!= null){ |
|
|
|
Bindable.value = Value; |
|
|
|
Bindable.value = Value; |
|
|
|
Bindable.label = BindingPath; |
|
|
|
Bindable.label = BindingPath; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnNodeDataValueChanged(NodeDataWrapper wrapper){ |
|
|
|
|
|
|
|
var value = (T) wrapper.GetValue(BindingPath) ; |
|
|
|
|
|
|
|
if(Bindable!=null){ |
|
|
|
|
|
|
|
Bindable.value = value; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
~InspectorItem(){ |
|
|
|
~InspectorItem(){ |
|
|
|
OnValueChanged-= OnValueChangedHandler; |
|
|
|
OnDataChanged-= OnDataChangedHandler; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |