com.alicizax.unity.ui.exten.../Editor/UX/Group/UXGroupInspector.cs

154 lines
4.7 KiB
C#
Raw Normal View History

using AlicizaX.Editor;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace UnityEngine.UI
{
[CustomEditor(typeof(UXGroup))]
public class UXGroupInspector : GameFrameworkInspector
{
private SerializedProperty m_Buttons;
private UXGroup _target;
private ReorderableList _reorderableList;
private void OnEnable()
{
_target = (UXGroup)target;
m_Buttons = serializedObject.FindProperty("m_Buttons");
_reorderableList = new ReorderableList(serializedObject, m_Buttons, true, true, true, true)
{
drawHeaderCallback = DrawHeader,
drawElementCallback = DrawElement,
onAddCallback = OnAddList,
onRemoveCallback = OnRemoveList,
onChangedCallback = OnChanged,
};
}
public override void OnInspectorGUI()
{
serializedObject.Update();
bool isPlaying = Application.isPlaying || EditorApplication.isPlaying;
_reorderableList.draggable = !isPlaying;
_reorderableList.displayAdd = !isPlaying;
_reorderableList.displayRemove = !isPlaying;
bool prevEnabled = GUI.enabled;
if (isPlaying) GUI.enabled = false;
_reorderableList.DoLayoutList();
GUI.enabled = prevEnabled;
serializedObject.ApplyModifiedProperties();
}
private void DrawHeader(Rect rect)
{
EditorGUI.LabelField(rect, "Toggles", EditorStyles.boldLabel);
}
// 记录旧的引用用于侦测变化
private UXButton previousRef;
private void DrawElement(Rect rect, int index, bool isActive, bool isFocused)
{
SerializedProperty element = m_Buttons.GetArrayElementAtIndex(index);
rect.y += 2;
Rect fieldRect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
UXButton oldButton = element.objectReferenceValue as UXButton;
string label = $"[{index}] {(oldButton != null ? oldButton.name : "Null")}";
EditorGUI.BeginChangeCheck();
var newRef = EditorGUI.ObjectField(fieldRect, label, oldButton, typeof(UXButton), true) as UXButton;
if (EditorGUI.EndChangeCheck())
{
// 先处理 Remove旧值存在且不同
if (oldButton != null && oldButton != newRef)
{
OnRemove(oldButton);
}
// 再处理 Add新值非空
if (newRef != null && oldButton != newRef)
{
OnAdd(newRef);
}
// 最后把引用写回去
element.objectReferenceValue = newRef;
}
}
private void OnAddList(ReorderableList list)
{
int newIndex = m_Buttons.arraySize;
m_Buttons.arraySize++;
serializedObject.ApplyModifiedProperties();
var newElem = m_Buttons.GetArrayElementAtIndex(newIndex);
newElem.objectReferenceValue = null;
serializedObject.ApplyModifiedProperties();
}
private void OnRemoveList(ReorderableList list)
{
if (list.index < 0 || list.index >= m_Buttons.arraySize)
return;
var oldButton = m_Buttons.GetArrayElementAtIndex(list.index).objectReferenceValue as UXButton;
if (oldButton)
{
OnRemove(oldButton);
}
m_Buttons.DeleteArrayElementAtIndex(list.index);
serializedObject.ApplyModifiedProperties();
}
private void OnChanged(ReorderableList list)
{
serializedObject.ApplyModifiedProperties();
}
// ========================
// 你的新增方法:自动调用
// ========================
private void OnAdd(UXButton button)
{
SerializedObject so = new SerializedObject(button);
var groupProp = so.FindProperty("m_UXGroup");
groupProp.objectReferenceValue = target;
UXGroup group = (UXGroup)target;
group.RegisterButton(button);
so.ApplyModifiedProperties();
}
private void OnRemove(UXButton button)
{
SerializedObject so = new SerializedObject(button);
var groupProp = so.FindProperty("m_UXGroup");
UXGroup group = groupProp.objectReferenceValue as UXGroup;
if (group != null)
group.UnregisterButton(button);
groupProp.objectReferenceValue = null;
so.ApplyModifiedProperties();
}
}
}