2021-06-25 07:50:12 -04:00

57 lines
2.7 KiB
C#

using UnityEngine;
using UnityEditor;
namespace Cinemachine.Editor
{
[CustomPropertyDrawer(typeof(CinemachineBlendDefinitionPropertyAttribute))]
internal sealed class CinemachineBlendDefinitionPropertyDrawer : PropertyDrawer
{
CinemachineBlendDefinition myClass = new CinemachineBlendDefinition(); // to access name strings
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
{
float vSpace = 0;
float floatFieldWidth = EditorGUIUtility.singleLineHeight * 2.5f;
SerializedProperty timeProp = property.FindPropertyRelative(() => myClass.m_Time);
GUIContent timeText = new GUIContent(" s", timeProp.tooltip);
var textDimensions = GUI.skin.label.CalcSize(timeText);
rect = EditorGUI.PrefixLabel(rect, EditorGUI.BeginProperty(rect, label, property));
rect.y += vSpace; rect.height = EditorGUIUtility.singleLineHeight;
rect.width -= floatFieldWidth + textDimensions.x;
SerializedProperty styleProp = property.FindPropertyRelative(() => myClass.m_Style);
if (styleProp.enumValueIndex != (int)CinemachineBlendDefinition.Style.Custom)
EditorGUI.PropertyField(rect, styleProp, GUIContent.none);
else
{
SerializedProperty curveProp = property.FindPropertyRelative(() => myClass.m_CustomCurve);
Rect r = rect;
r.width -= rect.height;
r.height -= 1;
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(r, curveProp, GUIContent.none);
if (EditorGUI.EndChangeCheck())
{
curveProp.animationCurveValue = InspectorUtility.NormalizeCurve(curveProp.animationCurveValue);
curveProp.serializedObject.ApplyModifiedProperties();
}
r.x += r.width; r.width = r.height; ++r.height;
EditorGUI.PropertyField(r, styleProp, GUIContent.none);
}
if (styleProp.intValue != (int)CinemachineBlendDefinition.Style.Cut)
{
float oldWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth = textDimensions.x;
rect.x += rect.width; rect.width = floatFieldWidth + EditorGUIUtility.labelWidth;
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(rect, timeProp, timeText);
if (EditorGUI.EndChangeCheck())
timeProp.floatValue = Mathf.Max(timeProp.floatValue, 0);
EditorGUIUtility.labelWidth = oldWidth;
}
}
}
}