123 lines
4.7 KiB
C#
123 lines
4.7 KiB
C#
|
using System;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.EventSystems;
|
||
|
|
||
|
namespace UnityEditor.EventSystems
|
||
|
{
|
||
|
[CustomEditor(typeof(EventTrigger), true)]
|
||
|
public class EventTriggerEditor : Editor
|
||
|
{
|
||
|
SerializedProperty m_DelegatesProperty;
|
||
|
|
||
|
GUIContent m_IconToolbarMinus;
|
||
|
GUIContent m_EventIDName;
|
||
|
GUIContent[] m_EventTypes;
|
||
|
GUIContent m_AddButonContent;
|
||
|
|
||
|
protected virtual void OnEnable()
|
||
|
{
|
||
|
m_DelegatesProperty = serializedObject.FindProperty("m_Delegates");
|
||
|
m_AddButonContent = EditorGUIUtility.TrTextContent("Add New Event Type");
|
||
|
m_EventIDName = new GUIContent("");
|
||
|
// Have to create a copy since otherwise the tooltip will be overwritten.
|
||
|
m_IconToolbarMinus = new GUIContent(EditorGUIUtility.IconContent("Toolbar Minus"));
|
||
|
m_IconToolbarMinus.tooltip = "Remove all events in this list.";
|
||
|
|
||
|
string[] eventNames = Enum.GetNames(typeof(EventTriggerType));
|
||
|
m_EventTypes = new GUIContent[eventNames.Length];
|
||
|
for (int i = 0; i < eventNames.Length; ++i)
|
||
|
{
|
||
|
m_EventTypes[i] = new GUIContent(eventNames[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void OnInspectorGUI()
|
||
|
{
|
||
|
serializedObject.Update();
|
||
|
int toBeRemovedEntry = -1;
|
||
|
|
||
|
EditorGUILayout.Space();
|
||
|
|
||
|
Vector2 removeButtonSize = GUIStyle.none.CalcSize(m_IconToolbarMinus);
|
||
|
|
||
|
for (int i = 0; i < m_DelegatesProperty.arraySize; ++i)
|
||
|
{
|
||
|
SerializedProperty delegateProperty = m_DelegatesProperty.GetArrayElementAtIndex(i);
|
||
|
SerializedProperty eventProperty = delegateProperty.FindPropertyRelative("eventID");
|
||
|
SerializedProperty callbacksProperty = delegateProperty.FindPropertyRelative("callback");
|
||
|
m_EventIDName.text = eventProperty.enumDisplayNames[eventProperty.enumValueIndex];
|
||
|
|
||
|
EditorGUILayout.PropertyField(callbacksProperty, m_EventIDName);
|
||
|
Rect callbackRect = GUILayoutUtility.GetLastRect();
|
||
|
|
||
|
Rect removeButtonPos = new Rect(callbackRect.xMax - removeButtonSize.x - 8, callbackRect.y + 1, removeButtonSize.x, removeButtonSize.y);
|
||
|
if (GUI.Button(removeButtonPos, m_IconToolbarMinus, GUIStyle.none))
|
||
|
{
|
||
|
toBeRemovedEntry = i;
|
||
|
}
|
||
|
|
||
|
EditorGUILayout.Space();
|
||
|
}
|
||
|
|
||
|
if (toBeRemovedEntry > -1)
|
||
|
{
|
||
|
RemoveEntry(toBeRemovedEntry);
|
||
|
}
|
||
|
|
||
|
Rect btPosition = GUILayoutUtility.GetRect(m_AddButonContent, GUI.skin.button);
|
||
|
const float addButonWidth = 200f;
|
||
|
btPosition.x = btPosition.x + (btPosition.width - addButonWidth) / 2;
|
||
|
btPosition.width = addButonWidth;
|
||
|
if (GUI.Button(btPosition, m_AddButonContent))
|
||
|
{
|
||
|
ShowAddTriggermenu();
|
||
|
}
|
||
|
|
||
|
serializedObject.ApplyModifiedProperties();
|
||
|
}
|
||
|
|
||
|
private void RemoveEntry(int toBeRemovedEntry)
|
||
|
{
|
||
|
m_DelegatesProperty.DeleteArrayElementAtIndex(toBeRemovedEntry);
|
||
|
}
|
||
|
|
||
|
void ShowAddTriggermenu()
|
||
|
{
|
||
|
// Now create the menu, add items and show it
|
||
|
GenericMenu menu = new GenericMenu();
|
||
|
for (int i = 0; i < m_EventTypes.Length; ++i)
|
||
|
{
|
||
|
bool active = true;
|
||
|
|
||
|
// Check if we already have a Entry for the current eventType, if so, disable it
|
||
|
for (int p = 0; p < m_DelegatesProperty.arraySize; ++p)
|
||
|
{
|
||
|
SerializedProperty delegateEntry = m_DelegatesProperty.GetArrayElementAtIndex(p);
|
||
|
SerializedProperty eventProperty = delegateEntry.FindPropertyRelative("eventID");
|
||
|
if (eventProperty.enumValueIndex == i)
|
||
|
{
|
||
|
active = false;
|
||
|
}
|
||
|
}
|
||
|
if (active)
|
||
|
menu.AddItem(m_EventTypes[i], false, OnAddNewSelected, i);
|
||
|
else
|
||
|
menu.AddDisabledItem(m_EventTypes[i]);
|
||
|
}
|
||
|
menu.ShowAsContext();
|
||
|
Event.current.Use();
|
||
|
}
|
||
|
|
||
|
private void OnAddNewSelected(object index)
|
||
|
{
|
||
|
int selected = (int)index;
|
||
|
|
||
|
m_DelegatesProperty.arraySize += 1;
|
||
|
SerializedProperty delegateEntry = m_DelegatesProperty.GetArrayElementAtIndex(m_DelegatesProperty.arraySize - 1);
|
||
|
SerializedProperty eventProperty = delegateEntry.FindPropertyRelative("eventID");
|
||
|
eventProperty.enumValueIndex = selected;
|
||
|
serializedObject.ApplyModifiedProperties();
|
||
|
}
|
||
|
}
|
||
|
}
|