A game about forced loneliness, made by TACStudios
at master 122 lines 4.8 kB view raw
1using System; 2using UnityEngine; 3using UnityEngine.EventSystems; 4 5namespace UnityEditor.EventSystems 6{ 7 [CustomEditor(typeof(EventTrigger), true)] 8 public class EventTriggerEditor : Editor 9 { 10 SerializedProperty m_DelegatesProperty; 11 12 GUIContent m_IconToolbarMinus; 13 GUIContent m_EventIDName; 14 GUIContent[] m_EventTypes; 15 GUIContent m_AddButonContent; 16 17 protected virtual void OnEnable() 18 { 19 m_DelegatesProperty = serializedObject.FindProperty("m_Delegates"); 20 m_AddButonContent = EditorGUIUtility.TrTextContent("Add New Event Type"); 21 m_EventIDName = new GUIContent(""); 22 // Have to create a copy since otherwise the tooltip will be overwritten. 23 m_IconToolbarMinus = new GUIContent(EditorGUIUtility.IconContent("Toolbar Minus")); 24 m_IconToolbarMinus.tooltip = "Remove all events in this list."; 25 26 string[] eventNames = Enum.GetNames(typeof(EventTriggerType)); 27 m_EventTypes = new GUIContent[eventNames.Length]; 28 for (int i = 0; i < eventNames.Length; ++i) 29 { 30 m_EventTypes[i] = new GUIContent(eventNames[i]); 31 } 32 } 33 34 public override void OnInspectorGUI() 35 { 36 serializedObject.Update(); 37 int toBeRemovedEntry = -1; 38 39 EditorGUILayout.Space(); 40 41 Vector2 removeButtonSize = GUIStyle.none.CalcSize(m_IconToolbarMinus); 42 43 for (int i = 0; i < m_DelegatesProperty.arraySize; ++i) 44 { 45 SerializedProperty delegateProperty = m_DelegatesProperty.GetArrayElementAtIndex(i); 46 SerializedProperty eventProperty = delegateProperty.FindPropertyRelative("eventID"); 47 SerializedProperty callbacksProperty = delegateProperty.FindPropertyRelative("callback"); 48 m_EventIDName.text = eventProperty.enumDisplayNames[eventProperty.enumValueIndex]; 49 50 EditorGUILayout.PropertyField(callbacksProperty, m_EventIDName); 51 Rect callbackRect = GUILayoutUtility.GetLastRect(); 52 53 Rect removeButtonPos = new Rect(callbackRect.xMax - removeButtonSize.x - 8, callbackRect.y + 1, removeButtonSize.x, removeButtonSize.y); 54 if (GUI.Button(removeButtonPos, m_IconToolbarMinus, GUIStyle.none)) 55 { 56 toBeRemovedEntry = i; 57 } 58 59 EditorGUILayout.Space(); 60 } 61 62 if (toBeRemovedEntry > -1) 63 { 64 RemoveEntry(toBeRemovedEntry); 65 } 66 67 Rect btPosition = GUILayoutUtility.GetRect(m_AddButonContent, GUI.skin.button); 68 const float addButonWidth = 200f; 69 btPosition.x = btPosition.x + (btPosition.width - addButonWidth) / 2; 70 btPosition.width = addButonWidth; 71 if (GUI.Button(btPosition, m_AddButonContent)) 72 { 73 ShowAddTriggermenu(); 74 } 75 76 serializedObject.ApplyModifiedProperties(); 77 } 78 79 private void RemoveEntry(int toBeRemovedEntry) 80 { 81 m_DelegatesProperty.DeleteArrayElementAtIndex(toBeRemovedEntry); 82 } 83 84 void ShowAddTriggermenu() 85 { 86 // Now create the menu, add items and show it 87 GenericMenu menu = new GenericMenu(); 88 for (int i = 0; i < m_EventTypes.Length; ++i) 89 { 90 bool active = true; 91 92 // Check if we already have a Entry for the current eventType, if so, disable it 93 for (int p = 0; p < m_DelegatesProperty.arraySize; ++p) 94 { 95 SerializedProperty delegateEntry = m_DelegatesProperty.GetArrayElementAtIndex(p); 96 SerializedProperty eventProperty = delegateEntry.FindPropertyRelative("eventID"); 97 if (eventProperty.enumValueIndex == i) 98 { 99 active = false; 100 } 101 } 102 if (active) 103 menu.AddItem(m_EventTypes[i], false, OnAddNewSelected, i); 104 else 105 menu.AddDisabledItem(m_EventTypes[i]); 106 } 107 menu.ShowAsContext(); 108 Event.current.Use(); 109 } 110 111 private void OnAddNewSelected(object index) 112 { 113 int selected = (int)index; 114 115 m_DelegatesProperty.arraySize += 1; 116 SerializedProperty delegateEntry = m_DelegatesProperty.GetArrayElementAtIndex(m_DelegatesProperty.arraySize - 1); 117 SerializedProperty eventProperty = delegateEntry.FindPropertyRelative("eventID"); 118 eventProperty.enumValueIndex = selected; 119 serializedObject.ApplyModifiedProperties(); 120 } 121 } 122}