OrbitalTransposerHeadingPropertyDrawer.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using UnityEngine;
  2. using UnityEditor;
  3. namespace Cinemachine.Editor
  4. {
  5. [CustomPropertyDrawer(typeof(OrbitalTransposerHeadingPropertyAttribute))]
  6. internal sealed class OrbitalTransposerHeadingPropertyDrawer : PropertyDrawer
  7. {
  8. const int vSpace = 2;
  9. bool mExpanded = true;
  10. CinemachineOrbitalTransposer.Heading def = new CinemachineOrbitalTransposer.Heading(); // to access name strings
  11. public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
  12. {
  13. float height = EditorGUIUtility.singleLineHeight;
  14. rect.height = height;
  15. mExpanded = EditorGUI.Foldout(rect, mExpanded, label, true);
  16. if (mExpanded)
  17. {
  18. ++EditorGUI.indentLevel;
  19. rect.y += height + vSpace;
  20. EditorGUI.PropertyField(rect, property.FindPropertyRelative(() => def.m_Definition));
  21. if (IsVelocityMode(property))
  22. {
  23. rect.y += height + vSpace;
  24. EditorGUI.PropertyField(rect, property.FindPropertyRelative(() => def.m_VelocityFilterStrength));
  25. }
  26. rect.y += height + vSpace;
  27. EditorGUI.PropertyField(rect, property.FindPropertyRelative(() => def.m_Bias));
  28. --EditorGUI.indentLevel;
  29. }
  30. }
  31. public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
  32. {
  33. float height = EditorGUIUtility.singleLineHeight + vSpace;
  34. if (mExpanded)
  35. height *= IsVelocityMode(property) ? 4 : 3;
  36. return height;
  37. }
  38. bool IsVelocityMode(SerializedProperty property)
  39. {
  40. var mode = property.FindPropertyRelative(() => def.m_Definition);
  41. var value = (CinemachineOrbitalTransposer.Heading.HeadingDefinition)
  42. (System.Enum.GetValues(typeof(CinemachineOrbitalTransposer.Heading.HeadingDefinition))).GetValue(mode.enumValueIndex);
  43. return value == CinemachineOrbitalTransposer.Heading.HeadingDefinition.Velocity
  44. || value == CinemachineOrbitalTransposer.Heading.HeadingDefinition.PositionDelta;
  45. }
  46. }
  47. }