mixedreality/com.microsoft.mixedreality..../Core/Inspectors/PropertyDrawers/InputActionPropertyDrawer.cs

90 lines
3.8 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.Input.Editor
{
[CustomPropertyDrawer(typeof(MixedRealityInputAction))]
public class InputActionPropertyDrawer : PropertyDrawer
{
private static MixedRealityInputActionsProfile profile = null;
private static GUIContent[] actionLabels = { new GUIContent("Missing Input Action Profile") };
private static int[] actionIds = { 0 };
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent content)
{
if (!MixedRealityToolkit.IsInitialized || !MixedRealityToolkit.Instance.HasActiveProfile)
{
profile = null;
actionLabels = new[] { new GUIContent("Missing Mixed Reality Toolkit") };
actionIds = new[] { 0 };
}
else
{
if (profile == null ||
(MixedRealityToolkit.Instance.ActiveProfile.IsInputSystemEnabled &&
profile.InputActions != null &&
profile.InputActions != MixedRealityToolkit.Instance.ActiveProfile.InputSystemProfile.InputActionsProfile.InputActions))
{
profile = MixedRealityToolkit.Instance.ActiveProfile.InputSystemProfile.InputActionsProfile;
if (profile != null)
{
actionLabels = profile.InputActions.Select(action => new GUIContent(action.Description)).Prepend(new GUIContent("None")).ToArray();
actionIds = profile.InputActions.Select(action => (int)action.Id).Prepend(0).ToArray();
}
else
{
actionLabels = new[] { new GUIContent("No input action profile found") };
actionIds = new[] { 0 };
}
}
if (!MixedRealityToolkit.Instance.ActiveProfile.IsInputSystemEnabled)
{
profile = null;
actionLabels = new[] { new GUIContent("Input System Disabled") };
actionIds = new[] { 0 };
}
}
var label = EditorGUI.BeginProperty(rect, content, property);
var inputActionId = property.FindPropertyRelative("id");
if (profile == null || actionLabels == null || actionIds == null)
{
GUI.enabled = false;
EditorGUI.IntPopup(rect, label, inputActionId.intValue.ResetIfGreaterThan(0), actionLabels, actionIds);
GUI.enabled = true;
}
else
{
EditorGUI.BeginChangeCheck();
inputActionId.intValue = EditorGUI.IntPopup(rect, label, inputActionId.intValue.ResetIfGreaterThan(profile.InputActions.Length), actionLabels, actionIds);
if (EditorGUI.EndChangeCheck())
{
var description = property.FindPropertyRelative("description");
var axisConstraint = property.FindPropertyRelative("axisConstraint");
if (inputActionId.intValue > 0)
{
description.stringValue = profile.InputActions[inputActionId.intValue - 1].Description;
axisConstraint.intValue = (int)profile.InputActions[inputActionId.intValue - 1].AxisConstraint;
}
else
{
description.stringValue = "None";
axisConstraint.intValue = 0;
}
}
}
EditorGUI.EndProperty();
}
}
}