feat:new method create inspector and composite field are now accepted and inspected

main
taoria 3 years ago
parent c8fa58132d
commit 4b792468ec
  1. 1
      TNode/Editor/Cache/NodeEditorExtensions.cs
  2. 1
      TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs
  3. 1
      TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs
  4. 6
      TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs
  5. 4
      TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs
  6. 4
      TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs
  7. 1
      TNode/Editor/Inspector/InspectorItem.cs
  8. 1
      TNode/Editor/Inspector/InspectorItemFactory.cs
  9. 37
      TNode/Editor/Inspector/NodeInspectorInNode.cs
  10. 3
      TNode/Editor/Inspector/PropertyDrawer.meta
  11. 1
      TNode/Editor/Resources/NodeInspector.uss
  12. 3
      TNode/Editor/Resources/NodeInspector.uss.meta
  13. 3
      TNode/Models/BlackboardDragNodeData.cs
  14. 68
      TNode/Tools/NodeDataWrapper.cs

@ -113,7 +113,6 @@ namespace TNode.Cache{
){ ){
//Get the generic type of this type //Get the generic type of this type
//Add this type to the dictionary //Add this type to the dictionary
Debug.Log($"type {type} is a registered as node component for {parent}");
FromGenericToSpecific.Add(parent, type); 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. //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.

@ -5,6 +5,7 @@ using UnityEngine.UIElements;
namespace TNode.Editor.Inspector.InspectorImplementation{ namespace TNode.Editor.Inspector.InspectorImplementation{
[NodeComponent] [NodeComponent]
[Obsolete]
public class EnumFieldItem:InspectorItem<Enum>{ public class EnumFieldItem:InspectorItem<Enum>{
public EnumFieldItem() : base(){ public EnumFieldItem() : base(){
var field = new EnumField(); var field = new EnumField();

@ -3,6 +3,7 @@ using TNode.Attribute;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector.InspectorImplementation{ namespace TNode.Editor.Inspector.InspectorImplementation{
[Obsolete]
[NodeComponent] [NodeComponent]
public class FloatFieldItem:InspectorItem<float>{ public class FloatFieldItem:InspectorItem<float>{
public FloatFieldItem():base(){ public FloatFieldItem():base(){

@ -1,9 +1,11 @@
using UnityEditor; using System;
using UnityEditor;
using UnityEditor.UIElements; using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
using Object = UnityEngine.Object;
namespace TNode.Editor.Inspector.InspectorImplementation{ namespace TNode.Editor.Inspector.InspectorImplementation{
[Obsolete]
public class PropertyFieldItem:InspectorItem<Object>{ public class PropertyFieldItem:InspectorItem<Object>{
public PropertyFieldItem(){ public PropertyFieldItem(){

@ -1,7 +1,9 @@
using TNode.Attribute; using System;
using TNode.Attribute;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector.InspectorImplementation{ namespace TNode.Editor.Inspector.InspectorImplementation{
[Obsolete]
/// <summary> /// <summary>
/// Force these element to bind native c# property /// Force these element to bind native c# property
/// </summary> /// </summary>

@ -1,7 +1,9 @@
using TNode.Attribute; using System;
using TNode.Attribute;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector.InspectorImplementation{ namespace TNode.Editor.Inspector.InspectorImplementation{
[Obsolete]
[NodeComponent] [NodeComponent]
public class ToggleFieldItem:InspectorItem<bool>{ public class ToggleFieldItem:InspectorItem<bool>{
public ToggleFieldItem(){ public ToggleFieldItem(){

@ -5,6 +5,7 @@ using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector{ namespace TNode.Editor.Inspector{
[Obsolete]
public abstract class InspectorItem<T>:VisualElement,INodeDataBinding<T> { public abstract class InspectorItem<T>:VisualElement,INodeDataBinding<T> {
protected NodeData _bindingNodeData; protected NodeData _bindingNodeData;
protected string _bindingFieldName; protected string _bindingFieldName;

@ -7,6 +7,7 @@ using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace TNode.Editor.Inspector{ namespace TNode.Editor.Inspector{
[Obsolete]
public class InspectorItemFactory{ public class InspectorItemFactory{
public InspectorItem<T> Create<T>(){ public InspectorItem<T> Create<T>(){

@ -1,6 +1,8 @@
using System.Reflection; using System.Reflection;
using TNode.Attribute; using TNode.Attribute;
using TNode.Models; using TNode.Models;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
@ -14,8 +16,11 @@ namespace TNode.Editor.Inspector{
UpdateData(); UpdateData();
} }
} }
public NodeInspectorInNode():base(){
}
private void UpdateData(){ private void UpdateData(){
if (_data != null){ if (_data != null){
RefreshInspector(); RefreshInspector();
@ -23,7 +28,37 @@ namespace TNode.Editor.Inspector{
} }
private void RefreshInspector(){ private void RefreshInspector(){
//Set size
Clear(); Clear();
//RefreshItems();
RefreshPropertyDrawer();
}
private void RefreshPropertyDrawer(){
//Check if the data's type is a generic type of BlackboardDragNodeData<>
if (_data.GetType().IsSubclassOf(typeof(BlackboardDragNodeData<>))){
return;
}
var serializedObject = new SerializedObject((NodeDataWrapper)_data);
foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public|BindingFlags.NonPublic)){
//Create corresponding property field
//check if the field has ShowInNodeView attribute
var showInNodeViewAttribute = field.GetCustomAttribute<ShowInNodeViewAttribute>() != null;
if (!showInNodeViewAttribute)
continue;
var drawer = new PropertyField(serializedObject.FindProperty("Data").FindPropertyRelative(field.Name),field.Name);
Debug.Log(serializedObject.FindProperty("Data"));
drawer.Bind(serializedObject);
Add(drawer);
}
}
private void RefreshItems(){
InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); InspectorItemFactory inspectorItemFactory = new InspectorItemFactory();
foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){
var bindingPath = field.Name; var bindingPath = field.Name;
@ -37,8 +72,8 @@ namespace TNode.Editor.Inspector{
castedItem.BindingNodeData = _data; castedItem.BindingNodeData = _data;
castedItem.BindingPath = bindingPath; castedItem.BindingPath = bindingPath;
} }
Add((VisualElement)createdItem);
Add((VisualElement) createdItem);
} }
} }
} }

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cc8c20a304714599959643305857c804
timeCreated: 1657486909

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3180a0745e5144aea3d7ea3d43b5b073
timeCreated: 1657483260

@ -1,4 +1,5 @@
using System.Runtime.InteropServices; using System;
using System.Runtime.InteropServices;
using Newtonsoft.Json; using Newtonsoft.Json;
using TNode.Attribute; using TNode.Attribute;
using TNode.Attribute.Ports; using TNode.Attribute.Ports;

@ -4,36 +4,81 @@ using TNode.Models;
using UnityEngine; using UnityEngine;
namespace TNode.Editor{ namespace TNode.Editor{
public class NodeDataWrapper{ /// <summary>
private readonly NodeData _data; /// Scriptable object wrapper enable property drawer for t-node
/// </summary>
public class NodeDataWrapper<T> : ScriptableObject where T : NodeData{
public T Data;
private static readonly Dictionary<T,NodeDataWrapper<T>> Cache = new ();
public event Action<NodeDataWrapper<T>> OnValueChanged;
public static NodeDataWrapper<T> Get(T data){
if(Cache.ContainsKey(data)){
return Cache[data];
}
var wrapper = ScriptableObject.CreateInstance<NodeDataWrapper<T>>();
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<T> wrapper){
if (wrapper == null)
return null;
return wrapper.Data;
}
public static implicit operator NodeDataWrapper<T>(T unWrapper){
if (unWrapper == null)
return null;
return Get(unWrapper);
}
}
public class NodeDataWrapper:ScriptableObject{
[SerializeReference]
public NodeData Data;
private static readonly Dictionary<NodeData,NodeDataWrapper> Cache = new (); private static readonly Dictionary<NodeData,NodeDataWrapper> Cache = new ();
public event Action<NodeDataWrapper> OnValueChanged; public event Action<NodeDataWrapper> OnValueChanged;
public static NodeDataWrapper Get(NodeData data){ public static NodeDataWrapper Get(NodeData data){
if (data.GetType().IsGenericType){
return ScriptableObject.CreateInstance<NodeDataWrapper>();
}
if(Cache.ContainsKey(data)){ if(Cache.ContainsKey(data)){
return Cache[data]; return Cache[data];
} }
var wrapper = new NodeDataWrapper(data); var wrapper = ScriptableObject.CreateInstance<NodeDataWrapper>();
wrapper.Data = data;
Cache.Add(data,wrapper); Cache.Add(data,wrapper);
return wrapper; return wrapper;
} }
public NodeDataWrapper(NodeData data){
this._data = data;
}
public void SetValue(string path, object value){ public void SetValue(string path, object value){
var fieldInfo = _data.GetType().GetField(path); var fieldInfo = Data.GetType().GetField(path);
fieldInfo.SetValue(_data,value); fieldInfo.SetValue(Data,value);
OnValueChanged?.Invoke(this); OnValueChanged?.Invoke(this);
} }
public object GetValue(string path){ public object GetValue(string path){
var fieldInfo = _data.GetType().GetField(path); var fieldInfo = Data.GetType().GetField(path);
return fieldInfo.GetValue(_data); return fieldInfo.GetValue(Data);
} }
public static implicit operator NodeData(NodeDataWrapper wrapper){ public static implicit operator NodeData(NodeDataWrapper wrapper){
if (wrapper == null) if (wrapper == null)
return null; return null;
return wrapper._data; return wrapper.Data;
} }
public static implicit operator NodeDataWrapper(NodeData unWrapper){ public static implicit operator NodeDataWrapper(NodeData unWrapper){
@ -41,6 +86,5 @@ namespace TNode.Editor{
return null; return null;
return Get(unWrapper); return Get(unWrapper);
} }
} }
} }
Loading…
Cancel
Save