namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.Globalization;
|
|
using Supyrb;
|
|
|
|
[CustomPropertyDrawer(typeof(MinMaxRangeAttribute))]
|
|
class MinMaxRangeDrawer : PropertyDrawer
|
|
{
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
label.tooltip = VRTK_EditorUtilities.GetTooltipAttribute(fieldInfo).tooltip;
|
|
bool foundGeneric = false;
|
|
bool valid = false;
|
|
try
|
|
{
|
|
Vector2 input = SerializedPropertyExtensions.GetValue<Limits2D>(property).AsVector2();
|
|
Vector2 output = BuildSlider(position, label, input, out valid);
|
|
if (valid)
|
|
{
|
|
SerializedPropertyExtensions.SetValue<Limits2D>(property, new Limits2D(output));
|
|
}
|
|
foundGeneric = true;
|
|
}
|
|
catch (System.Exception)
|
|
{
|
|
Error(position, label);
|
|
}
|
|
|
|
if (!foundGeneric)
|
|
{
|
|
switch (property.propertyType)
|
|
{
|
|
case SerializedPropertyType.Vector2:
|
|
Vector2 input = property.vector2Value;
|
|
Vector2 output = BuildSlider(position, label, input, out valid);
|
|
if (valid)
|
|
{
|
|
property.vector2Value = output;
|
|
}
|
|
break;
|
|
default:
|
|
Error(position, label);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private Vector2 BuildSlider(Rect position, GUIContent label, Vector2 range, out bool valid)
|
|
{
|
|
float fieldWidth = GUI.skin.textField.CalcSize(new GUIContent(1.23456f.ToString(CultureInfo.InvariantCulture))).x; ;
|
|
float fieldPadding = 5f;
|
|
float min = range.x;
|
|
float max = range.y;
|
|
|
|
MinMaxRangeAttribute attr = attribute as MinMaxRangeAttribute;
|
|
EditorGUI.BeginChangeCheck();
|
|
Rect updatedPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
|
|
min = EditorGUI.FloatField(new Rect(updatedPosition.x, updatedPosition.y, fieldWidth, updatedPosition.height), Mathf.Clamp(min, attr.min, attr.max));
|
|
EditorGUI.MinMaxSlider(new Rect(updatedPosition.x + (fieldWidth + fieldPadding), updatedPosition.y, updatedPosition.width - ((fieldWidth + fieldPadding) * 2f), updatedPosition.height), ref min, ref max, attr.min, attr.max);
|
|
max = EditorGUI.FloatField(new Rect(updatedPosition.x + (updatedPosition.width - fieldWidth), updatedPosition.y, fieldWidth, updatedPosition.height), Mathf.Clamp(max, attr.min, attr.max));
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
range.x = min;
|
|
range.y = max;
|
|
valid = true;
|
|
return range;
|
|
}
|
|
valid = false;
|
|
return Vector2.zero;
|
|
}
|
|
|
|
private void Error(Rect position, GUIContent label)
|
|
{
|
|
EditorGUI.LabelField(position, label, new GUIContent("Use only with Vector2 or Limits2D"));
|
|
}
|
|
}
|
|
}
|