You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
8.3 KiB
176 lines
8.3 KiB
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(); |
|
} |
|
} |
|
}
|
|
|