123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEditor.AnimatedValues;
-
- namespace UnityEditor.UI
- {
- [CustomEditor(typeof(ScrollRect), true)]
- [CanEditMultipleObjects]
- /// <summary>
- /// Custom Editor for the ScrollRect Component.
- /// Extend this class to write a custom editor for a component derived from ScrollRect.
- /// </summary>
- public class ScrollRectEditor : Editor
- {
- SerializedProperty m_Content;
- SerializedProperty m_Horizontal;
- SerializedProperty m_Vertical;
- SerializedProperty m_MovementType;
- SerializedProperty m_Elasticity;
- SerializedProperty m_Inertia;
- SerializedProperty m_DecelerationRate;
- SerializedProperty m_ScrollSensitivity;
- SerializedProperty m_Viewport;
- SerializedProperty m_HorizontalScrollbar;
- SerializedProperty m_VerticalScrollbar;
- SerializedProperty m_HorizontalScrollbarVisibility;
- SerializedProperty m_VerticalScrollbarVisibility;
- SerializedProperty m_HorizontalScrollbarSpacing;
- SerializedProperty m_VerticalScrollbarSpacing;
- SerializedProperty m_OnValueChanged;
- AnimBool m_ShowElasticity;
- AnimBool m_ShowDecelerationRate;
- bool m_ViewportIsNotChild, m_HScrollbarIsNotChild, m_VScrollbarIsNotChild;
- static string s_HError = "For this visibility mode, the Viewport property and the Horizontal Scrollbar property both needs to be set to a Rect Transform that is a child to the Scroll Rect.";
- static string s_VError = "For this visibility mode, the Viewport property and the Vertical Scrollbar property both needs to be set to a Rect Transform that is a child to the Scroll Rect.";
-
- protected virtual void OnEnable()
- {
- m_Content = serializedObject.FindProperty("m_Content");
- m_Horizontal = serializedObject.FindProperty("m_Horizontal");
- m_Vertical = serializedObject.FindProperty("m_Vertical");
- m_MovementType = serializedObject.FindProperty("m_MovementType");
- m_Elasticity = serializedObject.FindProperty("m_Elasticity");
- m_Inertia = serializedObject.FindProperty("m_Inertia");
- m_DecelerationRate = serializedObject.FindProperty("m_DecelerationRate");
- m_ScrollSensitivity = serializedObject.FindProperty("m_ScrollSensitivity");
- m_Viewport = serializedObject.FindProperty("m_Viewport");
- m_HorizontalScrollbar = serializedObject.FindProperty("m_HorizontalScrollbar");
- m_VerticalScrollbar = serializedObject.FindProperty("m_VerticalScrollbar");
- m_HorizontalScrollbarVisibility = serializedObject.FindProperty("m_HorizontalScrollbarVisibility");
- m_VerticalScrollbarVisibility = serializedObject.FindProperty("m_VerticalScrollbarVisibility");
- m_HorizontalScrollbarSpacing = serializedObject.FindProperty("m_HorizontalScrollbarSpacing");
- m_VerticalScrollbarSpacing = serializedObject.FindProperty("m_VerticalScrollbarSpacing");
- m_OnValueChanged = serializedObject.FindProperty("m_OnValueChanged");
-
- m_ShowElasticity = new AnimBool(Repaint);
- m_ShowDecelerationRate = new AnimBool(Repaint);
- SetAnimBools(true);
- }
-
- protected virtual void OnDisable()
- {
- m_ShowElasticity.valueChanged.RemoveListener(Repaint);
- m_ShowDecelerationRate.valueChanged.RemoveListener(Repaint);
- }
-
- void SetAnimBools(bool instant)
- {
- SetAnimBool(m_ShowElasticity, !m_MovementType.hasMultipleDifferentValues && m_MovementType.enumValueIndex == (int)ScrollRect.MovementType.Elastic, instant);
- SetAnimBool(m_ShowDecelerationRate, !m_Inertia.hasMultipleDifferentValues && m_Inertia.boolValue == true, instant);
- }
-
- void SetAnimBool(AnimBool a, bool value, bool instant)
- {
- if (instant)
- a.value = value;
- else
- a.target = value;
- }
-
- void CalculateCachedValues()
- {
- m_ViewportIsNotChild = false;
- m_HScrollbarIsNotChild = false;
- m_VScrollbarIsNotChild = false;
- if (targets.Length == 1)
- {
- Transform transform = ((ScrollRect)target).transform;
- if (m_Viewport.objectReferenceValue == null || ((RectTransform)m_Viewport.objectReferenceValue).transform.parent != transform)
- m_ViewportIsNotChild = true;
- if (m_HorizontalScrollbar.objectReferenceValue == null || ((Scrollbar)m_HorizontalScrollbar.objectReferenceValue).transform.parent != transform)
- m_HScrollbarIsNotChild = true;
- if (m_VerticalScrollbar.objectReferenceValue == null || ((Scrollbar)m_VerticalScrollbar.objectReferenceValue).transform.parent != transform)
- m_VScrollbarIsNotChild = true;
- }
- }
-
- public override void OnInspectorGUI()
- {
- SetAnimBools(false);
-
- serializedObject.Update();
- // Once we have a reliable way to know if the object changed, only re-cache in that case.
- CalculateCachedValues();
-
- EditorGUILayout.PropertyField(m_Content);
-
- EditorGUILayout.PropertyField(m_Horizontal);
- EditorGUILayout.PropertyField(m_Vertical);
-
- EditorGUILayout.PropertyField(m_MovementType);
- if (EditorGUILayout.BeginFadeGroup(m_ShowElasticity.faded))
- {
- EditorGUI.indentLevel++;
- EditorGUILayout.PropertyField(m_Elasticity);
- EditorGUI.indentLevel--;
- }
- EditorGUILayout.EndFadeGroup();
-
- EditorGUILayout.PropertyField(m_Inertia);
- if (EditorGUILayout.BeginFadeGroup(m_ShowDecelerationRate.faded))
- {
- EditorGUI.indentLevel++;
- EditorGUILayout.PropertyField(m_DecelerationRate);
- EditorGUI.indentLevel--;
- }
- EditorGUILayout.EndFadeGroup();
-
- EditorGUILayout.PropertyField(m_ScrollSensitivity);
-
- EditorGUILayout.Space();
-
- EditorGUILayout.PropertyField(m_Viewport);
-
- EditorGUILayout.PropertyField(m_HorizontalScrollbar);
- if (m_HorizontalScrollbar.objectReferenceValue && !m_HorizontalScrollbar.hasMultipleDifferentValues)
- {
- EditorGUI.indentLevel++;
- EditorGUILayout.PropertyField(m_HorizontalScrollbarVisibility, EditorGUIUtility.TrTextContent("Visibility"));
-
- if ((ScrollRect.ScrollbarVisibility)m_HorizontalScrollbarVisibility.enumValueIndex == ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport
- && !m_HorizontalScrollbarVisibility.hasMultipleDifferentValues)
- {
- if (m_ViewportIsNotChild || m_HScrollbarIsNotChild)
- EditorGUILayout.HelpBox(s_HError, MessageType.Error);
- EditorGUILayout.PropertyField(m_HorizontalScrollbarSpacing, EditorGUIUtility.TrTextContent("Spacing"));
- }
-
- EditorGUI.indentLevel--;
- }
-
- EditorGUILayout.PropertyField(m_VerticalScrollbar);
- if (m_VerticalScrollbar.objectReferenceValue && !m_VerticalScrollbar.hasMultipleDifferentValues)
- {
- EditorGUI.indentLevel++;
- EditorGUILayout.PropertyField(m_VerticalScrollbarVisibility, EditorGUIUtility.TrTextContent("Visibility"));
-
- if ((ScrollRect.ScrollbarVisibility)m_VerticalScrollbarVisibility.enumValueIndex == ScrollRect.ScrollbarVisibility.AutoHideAndExpandViewport
- && !m_VerticalScrollbarVisibility.hasMultipleDifferentValues)
- {
- if (m_ViewportIsNotChild || m_VScrollbarIsNotChild)
- EditorGUILayout.HelpBox(s_VError, MessageType.Error);
- EditorGUILayout.PropertyField(m_VerticalScrollbarSpacing, EditorGUIUtility.TrTextContent("Spacing"));
- }
-
- EditorGUI.indentLevel--;
- }
-
- EditorGUILayout.Space();
-
- EditorGUILayout.PropertyField(m_OnValueChanged);
-
- serializedObject.ApplyModifiedProperties();
- }
- }
- }
|