18 private SerializedProperty _entries;
20 private GUIContent _iconToolbarMinus;
21 private GUIContent _eventIDName;
22 private GUIContent _addButtonContent;
24 private GUIContent[] _enumNames;
25 private int[] _enumValues;
34 _entries = tableProperty.FindPropertyRelative(
"_entries");
36 _addButtonContent =
new GUIContent(
"Add New Event Type");
37 _eventIDName =
new GUIContent(
"");
39 _iconToolbarMinus =
new GUIContent(EditorGUIUtility.IconContent(
"Toolbar Minus"));
40 _iconToolbarMinus.tooltip =
"Remove all events in this list.";
42 _enumNames = Enum.GetNames(enumType).Query().Select(s =>
new GUIContent(s)).ToArray();
43 _enumValues = (
int[])Enum.GetValues(enumType);
47 if (_entries.serializedObject.isEditingMultipleObjects) {
51 int toBeRemovedEntry = -1;
53 EditorGUILayout.Space();
55 Vector2 removeButtonSize = GUIStyle.none.CalcSize(_iconToolbarMinus);
57 for (
int i = 0; i < _entries.arraySize; ++i) {
58 SerializedProperty delegateProperty = _entries.GetArrayElementAtIndex(i);
59 SerializedProperty enumValueProperty = delegateProperty.FindPropertyRelative(
"enumValue");
60 SerializedProperty callbacksProperty = delegateProperty.FindPropertyRelative(
"callback");
62 int index = Array.IndexOf(_enumValues, enumValueProperty.intValue);
64 _eventIDName.text =
"Event " + enumValueProperty.intValue;
66 _eventIDName.text = _enumNames[index].text;
69 EditorGUILayout.PropertyField(callbacksProperty, _eventIDName);
70 Rect callbackRect = GUILayoutUtility.GetLastRect();
72 Rect removeButtonPos =
new Rect(callbackRect.xMax - removeButtonSize.x - 8, callbackRect.y + 1, removeButtonSize.x, removeButtonSize.y);
73 if (GUI.Button(removeButtonPos, _iconToolbarMinus, GUIStyle.none)) {
77 EditorGUILayout.Space();
80 if (toBeRemovedEntry > -1) {
81 RemoveEntry(toBeRemovedEntry);
84 Rect btPosition = GUILayoutUtility.GetRect(_addButtonContent, GUI.skin.button);
85 const float addButonWidth = 200f;
86 btPosition.x = btPosition.x + (btPosition.width - addButonWidth) / 2;
87 btPosition.width = addButonWidth;
88 if (GUI.Button(btPosition, _addButtonContent)) {
92 _entries.serializedObject.ApplyModifiedProperties();
96 if (_entries ==
null)
return false;
97 for (
int i = 0; i < _entries.arraySize; i++) {
98 var entryProperty = _entries.GetArrayElementAtIndex(i);
99 var enumValueProperty = entryProperty.FindPropertyRelative(
"enumValue");
100 if (enumValueProperty.intValue == enumValue) {
107 private void RemoveEntry(
int toBeRemovedEntry) {
108 _entries.DeleteArrayElementAtIndex(toBeRemovedEntry);
111 private void showAddEventMenu() {
113 GenericMenu menu =
new GenericMenu();
114 for (
int i = 0; i < _enumNames.Length; ++i) {
118 for (
int p = 0; p < _entries.arraySize; ++p) {
119 SerializedProperty entryProperty = _entries.GetArrayElementAtIndex(p);
120 SerializedProperty enumValueProperty = entryProperty.FindPropertyRelative(
"enumValue");
121 if (enumValueProperty.intValue == _enumValues[i]) {
127 menu.AddItem(_enumNames[i],
false, OnAddNewSelected, _enumValues[i]);
129 menu.AddDisabledItem(_enumNames[i]);
132 menu.ShowAsContext();
137 private void OnAddNewSelected(
object enumValue) {
138 _entries.arraySize += 1;
139 SerializedProperty entryProperty = _entries.GetArrayElementAtIndex(_entries.arraySize - 1);
140 SerializedProperty enumValueProperty = entryProperty.FindPropertyRelative(
"enumValue");
141 enumValueProperty.intValue = (int)enumValue;
143 _entries.serializedObject.ApplyModifiedProperties();
EnumEventTableEditor(SerializedProperty tableProperty, Type enumType)
The enum event table is unable to properly display itself in the inspector, it instead must be constr...
bool HasAnyCallbacks(int enumValue)