HumanoidControl_Free/Editor/Tools/Input/KeyboardInput_Editor.cs
Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

119 lines
4.7 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
namespace Passer {
[CustomEditor(typeof(KeyboardInput))]
public class KeyboardInput_Editor : Editor {
#region Disable
protected virtual void OnDisable() {
KeyboardInput keyboardInput = (KeyboardInput)target;
Cleanup(keyboardInput.keyboardHandlers);
}
protected static void Cleanup(List<KeyboardEventHandlers> eventHandlers) {
foreach (KeyboardEventHandlers inputEventList in eventHandlers) {
inputEventList.events.RemoveAll(triggerEvent => triggerEvent.isDead);
}
}
#endregion
#region Inspector
protected int selectedKey = -1;
protected int selectedSub = -1;
public override void OnInspectorGUI() {
serializedObject.Update();
SerializedProperty handlersProp = serializedObject.FindProperty("keyboardHandlers");
for (int i = 0; i < handlersProp.arraySize; i++) {
SerializedProperty handlerProp = handlersProp.GetArrayElementAtIndex(i);
KeyEventHandlers(handlerProp);
}
CleanKeyboardHandlers(handlersProp);
EditorGUILayout.BeginHorizontal();
KeyCode keyCode = (KeyCode)EditorGUILayout.EnumPopup(KeyCode.None, GUILayout.Width(140)); ;
if (keyCode != KeyCode.None)
AddKeyboardInput(handlersProp, keyCode);
EditorGUILayout.EndHorizontal();
serializedObject.ApplyModifiedProperties();
}
private void KeyEventHandlers(SerializedProperty eventHandlerProp) {
Event_Editor.EventInspector(eventHandlerProp,
ref selectedKey, ref selectedSub,
Event_Editor.EventMethodCheck,
ControllerEvent_Editor.InitControllerEvent,
LabelField
);
ControllerEvent_Editor.SetParameterOnEvents(eventHandlerProp);
}
protected static void LabelField(SerializedProperty eventHandlerProp) {
SerializedProperty handlerKeyProp = eventHandlerProp.FindPropertyRelative("keyCode");
handlerKeyProp.intValue = (int)(KeyCode)EditorGUILayout.EnumPopup((KeyCode)handlerKeyProp.intValue, GUILayout.Width(140));
}
private void AddKeyboardInput(SerializedProperty handlersProp, KeyCode keyCode) {
int handlerIndex = handlersProp.arraySize;
handlersProp.InsertArrayElementAtIndex(handlerIndex);
SerializedProperty newHandlerProp = handlersProp.GetArrayElementAtIndex(handlerIndex);
SerializedProperty handlerIdProp = newHandlerProp.FindPropertyRelative("id");
handlerIdProp.intValue = handlerIndex;
SerializedProperty eventTypeLabelsProp = newHandlerProp.FindPropertyRelative("eventTypeLabels");
for (int i = 0; i < KeyboardInput.eventTypeLabels.Length; i++) {
eventTypeLabelsProp.InsertArrayElementAtIndex(i);
SerializedProperty eventTypeLabelProp = eventTypeLabelsProp.GetArrayElementAtIndex(i);
eventTypeLabelProp.stringValue = KeyboardInput.eventTypeLabels[i];
}
SerializedProperty keyCodeProp = newHandlerProp.FindPropertyRelative("keyCode");
keyCodeProp.intValue = (int)keyCode;
// Remove all events becuase the new array element is a copy of the last element...
SerializedProperty eventsProp = newHandlerProp.FindPropertyRelative("events");
eventsProp.arraySize = 0;
}
private void CleanKeyboardHandlers(SerializedProperty handlersProp) {
int i;
do {
i = FindKeyboardHandler(handlersProp, KeyCode.None);
if (i >= 0)
handlersProp.DeleteArrayElementAtIndex(i);
} while (i >= 0);
}
/// <summary>
/// Find a keyboardHandler for a specific key
/// </summary>
/// <param name="handlersProp">The keyboard handlers List property</param>
/// <param name="code">The KeyCode of the key</param>
/// <returns>Index of the first keyboardhandler in the list for the given ket.
/// This is -1 when no keyboardHandler could be found.</returns>
protected int FindKeyboardHandler(SerializedProperty handlersProp, KeyCode code) {
for (int i = 0; i < handlersProp.arraySize; i++) {
SerializedProperty handlerProp = handlersProp.GetArrayElementAtIndex(i);
SerializedProperty keyCodeProp = handlerProp.FindPropertyRelative("keyCode");
if ((KeyCode)keyCodeProp.intValue == code)
return i;
}
return -1;
}
#endregion
}
}