using UnityEngine;
|
using UnityEditor;
|
using vnxbqy.UI;
|
using UnityEditorInternal;
|
|
[CustomEditor(typeof(WidgetBehavior), true)]
|
public class WidgetBehaviorEditor : Editor
|
{
|
|
ReorderableList list;
|
void OnEnable()
|
{
|
var serProp = this.serializedObject.FindProperty("widgets");
|
this.list = new ReorderableList(serProp.serializedObject, serProp, true, true, true, true);
|
this.list.drawHeaderCallback = this.OnDrawListHeader;
|
this.list.drawElementCallback = this.OnDrawListElement;
|
this.list.onAddCallback = this.OnAddCallback;
|
}
|
void OnDrawListHeader(Rect rect)
|
{
|
var spacing = 10f;
|
var arect = rect;
|
arect.height = EditorGUIUtility.singleLineHeight;
|
arect.x += 15;
|
arect.width = 200;
|
EditorGUI.LabelField(arect, "Name");
|
arect.x += arect.width + spacing;
|
arect.width = 200;
|
EditorGUI.LabelField(arect, "GameObject");
|
}
|
|
void OnAddCallback(ReorderableList list)
|
{
|
if (list.serializedProperty != null)
|
{
|
list.serializedProperty.arraySize++;
|
list.index = list.serializedProperty.arraySize - 1;
|
|
SerializedProperty itemData = list.serializedProperty.GetArrayElementAtIndex(list.index);
|
var namePop = itemData.FindPropertyRelative("name");
|
namePop.stringValue = null;
|
var goPop = itemData.FindPropertyRelative("gameObject");
|
goPop.objectReferenceValue = null;
|
}
|
else
|
{
|
ReorderableList.defaultBehaviours.DoAddButton(list);
|
}
|
}
|
|
void OnDrawListElement(Rect rect, int index, bool isActive, bool isFocused)
|
{
|
var spacing = 10f;
|
var arect = rect;
|
var element = this.list.serializedProperty.GetArrayElementAtIndex(index);
|
|
var nameProperty = element.FindPropertyRelative("name");
|
var goProperty = element.FindPropertyRelative("gameObject");
|
|
arect.height = EditorGUIUtility.singleLineHeight;
|
arect.width = 200;
|
if (goProperty.objectReferenceValue != null && string.IsNullOrEmpty(nameProperty.stringValue))
|
nameProperty.stringValue = EditorGUI.TextField(arect, goProperty.objectReferenceValue.name);
|
else
|
nameProperty.stringValue = EditorGUI.TextField(arect, nameProperty.stringValue);
|
arect.x += arect.width + spacing;
|
arect.width = 200;
|
EditorGUI.PropertyField(arect, goProperty, GUIContent.none);
|
}
|
|
public override void OnInspectorGUI()
|
{
|
base.OnInspectorGUI();
|
this.serializedObject.Update();
|
var property = list.serializedProperty;
|
property.isExpanded = EditorGUILayout.Foldout(property.isExpanded, property.displayName);
|
if (property.isExpanded)
|
{
|
this.list.DoLayoutList();
|
}
|
this.serializedObject.ApplyModifiedProperties();
|
}
|
|
}
|