NavigationDrawer.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. namespace UnityEditor.UI
  4. {
  5. [CustomPropertyDrawer(typeof(Navigation), true)]
  6. /// <summary>
  7. /// This is a PropertyDrawer for Navigation. It is implemented using the standard Unity PropertyDrawer framework.
  8. /// </summary>
  9. public class NavigationDrawer : PropertyDrawer
  10. {
  11. private class Styles
  12. {
  13. readonly public GUIContent navigationContent;
  14. public Styles()
  15. {
  16. navigationContent = EditorGUIUtility.TrTextContent("Navigation");
  17. }
  18. }
  19. private static Styles s_Styles = null;
  20. public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
  21. {
  22. if (s_Styles == null)
  23. s_Styles = new Styles();
  24. Rect drawRect = pos;
  25. drawRect.height = EditorGUIUtility.singleLineHeight;
  26. SerializedProperty navigation = prop.FindPropertyRelative("m_Mode");
  27. SerializedProperty wrapAround = prop.FindPropertyRelative("m_WrapAround");
  28. Navigation.Mode navMode = GetNavigationMode(navigation);
  29. EditorGUI.PropertyField(drawRect, navigation, s_Styles.navigationContent);
  30. ++EditorGUI.indentLevel;
  31. drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  32. switch (navMode)
  33. {
  34. case Navigation.Mode.Horizontal:
  35. case Navigation.Mode.Vertical:
  36. {
  37. EditorGUI.PropertyField(drawRect, wrapAround);
  38. drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  39. }
  40. break;
  41. case Navigation.Mode.Explicit:
  42. {
  43. SerializedProperty selectOnUp = prop.FindPropertyRelative("m_SelectOnUp");
  44. SerializedProperty selectOnDown = prop.FindPropertyRelative("m_SelectOnDown");
  45. SerializedProperty selectOnLeft = prop.FindPropertyRelative("m_SelectOnLeft");
  46. SerializedProperty selectOnRight = prop.FindPropertyRelative("m_SelectOnRight");
  47. EditorGUI.PropertyField(drawRect, selectOnUp);
  48. drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  49. EditorGUI.PropertyField(drawRect, selectOnDown);
  50. drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  51. EditorGUI.PropertyField(drawRect, selectOnLeft);
  52. drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  53. EditorGUI.PropertyField(drawRect, selectOnRight);
  54. drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  55. }
  56. break;
  57. }
  58. --EditorGUI.indentLevel;
  59. }
  60. static Navigation.Mode GetNavigationMode(SerializedProperty navigation)
  61. {
  62. return (Navigation.Mode)navigation.enumValueIndex;
  63. }
  64. public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
  65. {
  66. SerializedProperty navigation = prop.FindPropertyRelative("m_Mode");
  67. if (navigation == null)
  68. return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  69. Navigation.Mode navMode = GetNavigationMode(navigation);
  70. switch (navMode)
  71. {
  72. case Navigation.Mode.None:
  73. return EditorGUIUtility.singleLineHeight;
  74. case Navigation.Mode.Horizontal:
  75. case Navigation.Mode.Vertical:
  76. return 2 * EditorGUIUtility.singleLineHeight + 2 * EditorGUIUtility.standardVerticalSpacing;
  77. case Navigation.Mode.Explicit:
  78. return 5 * EditorGUIUtility.singleLineHeight + 5 * EditorGUIUtility.standardVerticalSpacing;
  79. default:
  80. return EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  81. }
  82. }
  83. }
  84. }