| using UnityEngine; |
| using UnityEngine.UI; |
| using UnityEditorInternal; |
| using UnityEditor.AnimatedValues; |
|
|
| namespace UnityEditor.UI |
| { |
| [CustomEditor(typeof(LayoutElement), true)] |
| [CanEditMultipleObjects] |
| |
| |
| |
| |
| public class LayoutElementEditor : Editor |
| { |
| SerializedProperty m_IgnoreLayout; |
| SerializedProperty m_MinWidth; |
| SerializedProperty m_MinHeight; |
| SerializedProperty m_PreferredWidth; |
| SerializedProperty m_PreferredHeight; |
| SerializedProperty m_FlexibleWidth; |
| SerializedProperty m_FlexibleHeight; |
| SerializedProperty m_LayoutPriority; |
|
|
| protected virtual void OnEnable() |
| { |
| m_IgnoreLayout = serializedObject.FindProperty("m_IgnoreLayout"); |
| m_MinWidth = serializedObject.FindProperty("m_MinWidth"); |
| m_MinHeight = serializedObject.FindProperty("m_MinHeight"); |
| m_PreferredWidth = serializedObject.FindProperty("m_PreferredWidth"); |
| m_PreferredHeight = serializedObject.FindProperty("m_PreferredHeight"); |
| m_FlexibleWidth = serializedObject.FindProperty("m_FlexibleWidth"); |
| m_FlexibleHeight = serializedObject.FindProperty("m_FlexibleHeight"); |
| m_LayoutPriority = serializedObject.FindProperty("m_LayoutPriority"); |
| } |
|
|
| public override void OnInspectorGUI() |
| { |
| serializedObject.Update(); |
|
|
| EditorGUILayout.PropertyField(m_IgnoreLayout); |
|
|
| if (!m_IgnoreLayout.boolValue) |
| { |
| EditorGUILayout.Space(); |
|
|
| LayoutElementField(m_MinWidth, 0); |
| LayoutElementField(m_MinHeight, 0); |
| LayoutElementField(m_PreferredWidth, t => t.rect.width); |
| LayoutElementField(m_PreferredHeight, t => t.rect.height); |
| LayoutElementField(m_FlexibleWidth, 1); |
| LayoutElementField(m_FlexibleHeight, 1); |
| } |
|
|
| EditorGUILayout.PropertyField(m_LayoutPriority); |
|
|
| serializedObject.ApplyModifiedProperties(); |
| } |
|
|
| void LayoutElementField(SerializedProperty property, float defaultValue) |
| { |
| LayoutElementField(property, _ => defaultValue); |
| } |
|
|
| void LayoutElementField(SerializedProperty property, System.Func<RectTransform, float> defaultValue) |
| { |
| Rect position = EditorGUILayout.GetControlRect(); |
|
|
| |
| GUIContent label = EditorGUI.BeginProperty(position, null, property); |
|
|
| |
| Rect fieldPosition = EditorGUI.PrefixLabel(position, label); |
|
|
| Rect toggleRect = fieldPosition; |
| toggleRect.width = 16; |
|
|
| Rect floatFieldRect = fieldPosition; |
| floatFieldRect.xMin += 16; |
|
|
| |
| EditorGUI.BeginChangeCheck(); |
| bool enabled = EditorGUI.ToggleLeft(toggleRect, GUIContent.none, property.floatValue >= 0); |
| if (EditorGUI.EndChangeCheck()) |
| { |
| |
| property.floatValue = (enabled ? defaultValue((target as LayoutElement).transform as RectTransform) : -1); |
| } |
|
|
| if (!property.hasMultipleDifferentValues && property.floatValue >= 0) |
| { |
| |
| EditorGUIUtility.labelWidth = 4; |
| EditorGUI.BeginChangeCheck(); |
| float newValue = EditorGUI.FloatField(floatFieldRect, new GUIContent(" "), property.floatValue); |
| if (EditorGUI.EndChangeCheck()) |
| { |
| property.floatValue = Mathf.Max(0, newValue); |
| } |
| EditorGUIUtility.labelWidth = 0; |
| } |
|
|
| EditorGUI.EndProperty(); |
| } |
| } |
| } |
|
|