| 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(""); |
| |
| 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() |
| { |
| |
| GenericMenu menu = new GenericMenu(); |
| for (int i = 0; i < m_EventTypes.Length; ++i) |
| { |
| bool active = true; |
|
|
| |
| 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(); |
| } |
| } |
| } |
|
|