60 lines
1.9 KiB
C#
60 lines
1.9 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using UnityEditor;
|
|
using UnityEditor.UIElements;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace Misaki.GraphView.Editor
|
|
{
|
|
public class ExposedPropertyEditor
|
|
{
|
|
private readonly ExposedProperty _property;
|
|
private readonly SerializedObject _serializedObject;
|
|
|
|
public ExposedPropertyEditor(ExposedProperty property, SerializedObject serializedObject)
|
|
{
|
|
_property = property;
|
|
_serializedObject = serializedObject;
|
|
}
|
|
|
|
public virtual VisualElement CreateInspector()
|
|
{
|
|
var root = new VisualElement();
|
|
|
|
if (_serializedObject.targetObject is not GraphObject graphObject)
|
|
{
|
|
return root;
|
|
}
|
|
|
|
// Use reflection to get the inspector input fields
|
|
var fields = _property.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
|
|
|
|
if (fields.Length == 0)
|
|
{
|
|
var label = new Label("No properties to display.");
|
|
root.Add(label);
|
|
|
|
return root;
|
|
}
|
|
|
|
foreach (var field in fields)
|
|
{
|
|
var i = graphObject.ExposedProperties.IndexOf(_property);
|
|
var serializedProperty = _serializedObject.FindProperty("_exposedProperties")?.GetArrayElementAtIndex(i)?.FindPropertyRelative(field.Name);
|
|
|
|
if (serializedProperty == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var propertyName = ObjectNames.NicifyVariableName(field.Name);
|
|
var inputField = new PropertyField(serializedProperty, propertyName);
|
|
inputField.Bind(_serializedObject);
|
|
|
|
root.Add(inputField);
|
|
}
|
|
|
|
return root;
|
|
}
|
|
}
|
|
} |