diff --git a/Sample/HelloGraph.cs b/Sample/HelloGraph.cs index 89b4857..fe9ed6b 100644 --- a/Sample/HelloGraph.cs +++ b/Sample/HelloGraph.cs @@ -2,7 +2,7 @@ using System; using TNode.Models; using UnityEngine; -namespace Sample.Editor{ +namespace Sample{ [CreateAssetMenu(fileName = "New HelloGraph", menuName = "TNode/HelloGraph")] [Serializable] public class HelloGraph : GraphData{ diff --git a/Sample/HelloNode.cs b/Sample/HelloNode.cs index b8dd3d0..a184613 100644 --- a/Sample/HelloNode.cs +++ b/Sample/HelloNode.cs @@ -1,5 +1,4 @@ -using Sample.Editor; -using TNode.Attribute; +using TNode.Attribute; using TNode.Models; namespace Sample{ diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index 2d3152b..c760bcc 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -206,10 +206,14 @@ namespace TNode.Editor.BaseViews{ if (evt.clickCount == 1){ if (_isInspectorOn){ _nodeInspector.Data = nodeData; + _nodeInspector.NodeView = nodeView as INodeView; } } }); + if(nodeView is INodeView nodeViewInterface){ + nodeViewInterface.SetNodeData(nodeData); + } } } diff --git a/TNode/Editor/BaseViews/NodeView.cs b/TNode/Editor/BaseViews/NodeView.cs index 60777c4..ae54853 100644 --- a/TNode/Editor/BaseViews/NodeView.cs +++ b/TNode/Editor/BaseViews/NodeView.cs @@ -1,12 +1,13 @@ -using Dialogue; -using TNode.Models; +using TNode.Models; +using UnityEditor; using UnityEditor.Experimental.GraphView; +using UnityEditor.UIElements; -namespace TNode.BaseViews{ +namespace TNode.Editor.BaseViews{ //A NodeAttribute monitor some type of node in the graph - public abstract class NodeView : Node where T:NodeData,new(){ + public abstract class NodeView : Node,INodeView where T:NodeData,new(){ protected T _data; public T Data{ get => _data; @@ -20,9 +21,39 @@ namespace TNode.BaseViews{ set => base.title = value; } public event System.Action OnDataChanged; - - public NodeView(){ + + protected NodeView(){ + OnDataChanged+=OnDataChangedHandler; + } + + private void OnDataChangedHandler(T obj){ + this.title = _data.nodeName; + } + + public void SetNodeData(NodeData nodeData){ + Data = (T)nodeData; + } + + public NodeData GetNodeData(){ + return _data; + } + + public void OnDataModified(){ + Refresh(); + } + + public void Refresh(){ + title = _data.nodeName; } + + } + + public interface INodeView{ + public void SetNodeData(NodeData nodeData); + public NodeData GetNodeData(); + + public void OnDataModified(); + } } \ No newline at end of file diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index 9df7c55..50c18de 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -67,7 +67,6 @@ namespace TNode.Cache{ parent.GetGenericTypeDefinition() == typeof(DataGraphView<>))){ //Get the generic type of this type //Add this type to the dictionary - Debug.Log($"Find a component named {type} and its parent is {parent}"); FromGenericToSpecific.Add(parent, type); } //TODO Note that a node component only applied to a specific type of editor,so ,same GraphView could behave differently in different editor.it's a todo feature. diff --git a/TNode/Editor/DefaultNodeView.cs b/TNode/Editor/DefaultNodeView.cs index 999938a..10f4713 100644 --- a/TNode/Editor/DefaultNodeView.cs +++ b/TNode/Editor/DefaultNodeView.cs @@ -1,7 +1,10 @@ using TNode.BaseViews; +using TNode.Editor.BaseViews; using TNode.Models; namespace TNode.Editor{ + + public class DefaultNodeView:NodeView{ } diff --git a/TNode/Editor/Inspector/DefaultInspectorItemFactory.cs b/TNode/Editor/Inspector/DefaultInspectorItemFactory.cs index 0f90d97..2d2d7ef 100644 --- a/TNode/Editor/Inspector/DefaultInspectorItemFactory.cs +++ b/TNode/Editor/Inspector/DefaultInspectorItemFactory.cs @@ -1,7 +1,9 @@ using System; using TNode.Cache; using TNode.Editor.Inspector.InspectorImplementation; +using Unity.VisualScripting; using UnityEditor; +using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector{ @@ -21,11 +23,21 @@ namespace TNode.Editor.Inspector{ public static InspectorItem DefaultInspectorItem(){ DefaultInspectorItem item = new DefaultInspectorItem(); if (typeof(string) == typeof(T)){ - item.foldOut.Add(new TextField(){ + var textField = new TextField(){ name = "StringTextField" + }; + item.foldOut.Add(textField); + textField.RegisterCallback>(e => { + Debug.Log(item.BindingNodeData); + Debug.Log(item.BindingPath); + item.BindingNodeData.GetType().GetField(item.BindingPath).SetValue(item.BindingNodeData, e.newValue); + if (item.parent.parent is NodeInspector nodeInspector){ + Debug.Log("item 's parent 's parent is exactly a node inspector"); + nodeInspector.NodeView.OnDataModified(); + } + }); } - return item; } diff --git a/TNode/Editor/Inspector/INodeDataBinding.cs b/TNode/Editor/Inspector/INodeDataBinding.cs index 1fe044b..d6f9613 100644 --- a/TNode/Editor/Inspector/INodeDataBinding.cs +++ b/TNode/Editor/Inspector/INodeDataBinding.cs @@ -3,20 +3,8 @@ using UnityEngine; namespace TNode.Editor.Inspector{ public interface INodeDataBinding:INodeDataBindingBase{ - protected T GetValue(){ - - var fieldInfo = typeof(T).GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - //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; - } - public T Value => GetValue(); + public void OnBindingDataUpdate(){ diff --git a/TNode/Editor/Inspector/InspectorImplementation/DefaultInspectorItem.cs b/TNode/Editor/Inspector/InspectorImplementation/DefaultInspectorItem.cs index 2dd72c2..bf99501 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/DefaultInspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/DefaultInspectorItem.cs @@ -3,13 +3,17 @@ namespace TNode.Editor.Inspector.InspectorImplementation{ public class DefaultInspectorItem:InspectorItem{ public readonly Foldout foldOut; - public DefaultInspectorItem(){ + public DefaultInspectorItem():base(){ foldOut = new Foldout{ text = "" }; this.Add(foldOut); OnValueChanged += () => { foldOut.text = this.BindingPath; + var textField = this.Q(); + if(textField != null){ + textField.value = this.Value.ToString(); + } }; } } diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs index 09de53f..49f2898 100644 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorItem.cs @@ -1,4 +1,5 @@ -using TNode.Models; +using TNode.BaseViews; +using TNode.Models; using UnityEngine; using UnityEngine.UIElements; @@ -29,13 +30,29 @@ namespace TNode.Editor.Inspector{ } } + 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(); public InspectorItem(){ + OnValueChanged+= OnValueChangedHandler; } - + private void OnValueChangedHandler(){ - - + } ~InspectorItem(){ OnValueChanged-= OnValueChangedHandler; diff --git a/TNode/Editor/Inspector/NodeInspector.cs b/TNode/Editor/Inspector/NodeInspector.cs index 902d761..63658fe 100644 --- a/TNode/Editor/Inspector/NodeInspector.cs +++ b/TNode/Editor/Inspector/NodeInspector.cs @@ -1,5 +1,6 @@ using System.Reflection; using TNode.BaseViews; +using TNode.Editor.BaseViews; using TNode.Models; using UnityEngine; using UnityEngine.UIElements; @@ -17,6 +18,7 @@ namespace TNode.Editor.Inspector{ } } + public INodeView NodeView; private void UpdateData(){ Debug.Log(_data); if (_data != null){ @@ -33,21 +35,23 @@ namespace TNode.Editor.Inspector{ private void RefreshInspector(){ //iterate field of data and get name of every fields,create a new inspector item of appropriate type and add it to the inspector for each field - this.Q("InspectorBody").Clear(); + var body = this.Q("InspectorBody"); + body.Clear(); + body.Add(new Label(_data.nodeName)); foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ var bindingPath = field.Name; - var type = field.FieldType; DefaultInspectorItemFactory defaultInspectorItemFactory = new DefaultInspectorItemFactory(); //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection MethodInfo methodInfo = defaultInspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); if (methodInfo != null){ var genericMethod = methodInfo.MakeGenericMethod(type); - var createdInspector = genericMethod.Invoke(defaultInspectorItemFactory,null) as VisualElement; - this.Q("InspectorBody").Add(createdInspector); - if (createdInspector is INodeDataBindingBase castedInspector){ - castedInspector.BindingNodeData = _data; - castedInspector.BindingPath = bindingPath; + var createdItem = genericMethod.Invoke(defaultInspectorItemFactory,null) as VisualElement; + + body.Add(createdItem); + if (createdItem is INodeDataBindingBase castedItem){ + castedItem.BindingNodeData = _data; + castedItem.BindingPath = bindingPath; } } } diff --git a/TNode/Editor/SearchWindowProvider.cs b/TNode/Editor/SearchWindowProvider.cs index 8278c97..1da8832 100644 --- a/TNode/Editor/SearchWindowProvider.cs +++ b/TNode/Editor/SearchWindowProvider.cs @@ -47,11 +47,12 @@ namespace TNode.Editor{ //Check if type is derived from NodeData if (typeof(NodeData).IsAssignableFrom(type)){ //Make an instance of the type - var nodeData = (NodeData) Activator.CreateInstance(type); - nodeData.nodeName = "New Node"; - ((IDataGraphView)_graphView).AddTNode(nodeData,new Rect(localPos.x,localPos.y,100,100)); + var nodeData = CreateInstance(type) as NodeData; + if (nodeData != null){ + nodeData.nodeName = "New Node"; + ((IDataGraphView) _graphView).AddTNode(nodeData, new Rect(localPos.x, localPos.y, 100, 100)); + } } - return true; } return false; diff --git a/TNode/Models/NodeData.cs b/TNode/Models/NodeData.cs index b7b8fb2..c6f8a34 100644 --- a/TNode/Models/NodeData.cs +++ b/TNode/Models/NodeData.cs @@ -11,7 +11,7 @@ namespace TNode.Models{ /// /// [Serializable] - public class NodeData:IModel{ + public class NodeData:ScriptableObject,IModel{ public NodeData() : base(){ //Object Registration