SyncLayoutGroupLimitEditor.cs 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEditor.UI;
  6. using FitMode = UnityEngine.UI.ContentSizeFitter.FitMode;
  7. [CustomEditor(typeof(SyncLayoutGroupLimit), true)]
  8. [CanEditMultipleObjects]
  9. public class SyncLayoutGroupLimitEditor : Editor
  10. {
  11. private SerializedProperty m_LayoutPriority;
  12. private SerializedProperty m_SyncTargetRect;
  13. private SerializedProperty m_HorizontalFit;
  14. private SerializedProperty m_VerticalFit;
  15. private SerializedProperty m_MaxWidth;
  16. private SerializedProperty m_MaxHeight;
  17. protected virtual void OnEnable()
  18. {
  19. m_LayoutPriority = serializedObject.FindProperty("m_LayoutPriority");
  20. m_SyncTargetRect = serializedObject.FindProperty("m_SyncTargetRect");
  21. m_HorizontalFit = serializedObject.FindProperty("m_HorizontalFit");
  22. m_VerticalFit = serializedObject.FindProperty("m_VerticalFit");
  23. m_MaxWidth = base.serializedObject.FindProperty("m_MaxWidth");
  24. m_MaxHeight = base.serializedObject.FindProperty("m_MaxHeight");
  25. }
  26. /// <summary>
  27. /// <para>See: Editor.OnInspectorGUI.</para>
  28. /// </summary>
  29. public override void OnInspectorGUI()
  30. {
  31. serializedObject.Update();
  32. EditorGUILayout.PropertyField(m_SyncTargetRect);
  33. EditorGUILayout.Space();
  34. if (m_SyncTargetRect.objectReferenceValue)
  35. {
  36. EditorGUILayout.PropertyField(m_HorizontalFit, true);
  37. FitMode fitMode = (FitMode)Enum.Parse(typeof(FitMode), m_HorizontalFit.enumNames[m_HorizontalFit.enumValueIndex]);
  38. if (fitMode == FitMode.MinSize)
  39. {
  40. LayoutElementField(m_MaxWidth, t => LayoutUtility.GetMinWidth(t));
  41. }
  42. else if (fitMode == FitMode.PreferredSize)
  43. {
  44. LayoutElementField(m_MaxWidth, t => LayoutUtility.GetPreferredWidth(t));
  45. }
  46. EditorGUILayout.PropertyField(m_VerticalFit, true);
  47. fitMode = (FitMode)Enum.Parse(typeof(FitMode), m_VerticalFit.enumNames[m_VerticalFit.enumValueIndex]);
  48. if (fitMode == FitMode.MinSize)
  49. {
  50. LayoutElementField(m_MaxHeight, t => LayoutUtility.GetMinHeight(t));
  51. }
  52. else if (fitMode == FitMode.PreferredSize)
  53. {
  54. LayoutElementField(m_MaxHeight, t => LayoutUtility.GetPreferredHeight(t));
  55. }
  56. }
  57. EditorGUILayout.PropertyField(m_LayoutPriority);
  58. serializedObject.ApplyModifiedProperties();
  59. }
  60. private void LayoutElementField(SerializedProperty property, float defaultValue)
  61. {
  62. LayoutElementField(property, (RectTransform _) => defaultValue);
  63. }
  64. private void LayoutElementField(SerializedProperty property, Func<RectTransform, float> defaultValue)
  65. {
  66. Rect controlRect = EditorGUILayout.GetControlRect();
  67. GUIContent label = EditorGUI.BeginProperty(controlRect, null, property);
  68. Rect val = EditorGUI.PrefixLabel(controlRect, label);
  69. Rect position = val;
  70. position.width = 16f;
  71. Rect position2 = val;
  72. position2.xMin = (position2.xMin + 16f);
  73. EditorGUI.BeginChangeCheck();
  74. bool flag = EditorGUI.ToggleLeft(position, GUIContent.none, property.floatValue >= 0f);
  75. if (EditorGUI.EndChangeCheck())
  76. {
  77. property.floatValue = ((!flag) ? -1f : defaultValue((base.target as RectTransform)));
  78. }
  79. if (!property.hasMultipleDifferentValues && property.floatValue >= 0f)
  80. {
  81. EditorGUIUtility.labelWidth = 4f;
  82. EditorGUI.BeginChangeCheck();
  83. float num = EditorGUI.FloatField(position2, new GUIContent(" "), property.floatValue);
  84. if (EditorGUI.EndChangeCheck())
  85. {
  86. property.floatValue = Mathf.Max(0f, num);
  87. }
  88. EditorGUIUtility.labelWidth = 0f;
  89. }
  90. EditorGUI.EndProperty();
  91. }
  92. }