Unity graph tool solution based on different implementation now focused on Unity.Experimental.Graphview
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.8 KiB

using System.Reflection;
using TNode.Attribute;
using TNode.Models;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace TNode.Editor.Inspector{
public class NodeInspectorInNode:VisualElement{
private NodeData _data;
public NodeData Data{
get => _data;
set{
_data = value;
UpdateData();
}
}
public NodeInspectorInNode():base(){
}
private void UpdateData(){
if (_data != null){
RefreshInspector();
}
}
private void RefreshInspector(){
//Set size
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();
foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){
var bindingPath = field.Name;
var type = field.FieldType;
//check if the field has ShowInNodeView attribute
var showInNodeViewAttribute = field.GetCustomAttribute<ShowInNodeViewAttribute>() != null;
if (!showInNodeViewAttribute)
continue;
var createdItem = inspectorItemFactory.Create(type);
if (createdItem is{ } castedItem){
castedItem.BindingNodeData = _data;
castedItem.BindingPath = bindingPath;
}
Add((VisualElement) createdItem);
}
}
}
}