A game about forced loneliness, made by TACStudios
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}