diff options
Diffstat (limited to 'Assets/uGUI-2017.1/Editor/UI/ImageEditor.cs')
-rw-r--r-- | Assets/uGUI-2017.1/Editor/UI/ImageEditor.cs | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/Assets/uGUI-2017.1/Editor/UI/ImageEditor.cs b/Assets/uGUI-2017.1/Editor/UI/ImageEditor.cs new file mode 100644 index 0000000..85da33f --- /dev/null +++ b/Assets/uGUI-2017.1/Editor/UI/ImageEditor.cs @@ -0,0 +1,251 @@ +using System.Linq; +using UnityEngine; +using UnityEditor.AnimatedValues; +using UnityEngine.UI; + +namespace UnityEditor.UI +{ + /// <summary> + /// Editor class used to edit UI Sprites. + /// </summary> + + [CustomEditor(typeof(Image), true)] + [CanEditMultipleObjects] + public class ImageEditor : GraphicEditor + { + SerializedProperty m_FillMethod; + SerializedProperty m_FillOrigin; + SerializedProperty m_FillAmount; + SerializedProperty m_FillClockwise; + SerializedProperty m_Type; + SerializedProperty m_FillCenter; + SerializedProperty m_Sprite; + SerializedProperty m_PreserveAspect; + GUIContent m_SpriteContent; + GUIContent m_SpriteTypeContent; + GUIContent m_ClockwiseContent; + AnimBool m_ShowSlicedOrTiled; + AnimBool m_ShowSliced; + AnimBool m_ShowTiled; + AnimBool m_ShowFilled; + AnimBool m_ShowType; + + protected override void OnEnable() + { + base.OnEnable(); + + m_SpriteContent = new GUIContent("Source Image"); + m_SpriteTypeContent = new GUIContent("Image Type"); + m_ClockwiseContent = new GUIContent("Clockwise"); + + m_Sprite = serializedObject.FindProperty("m_Sprite"); + m_Type = serializedObject.FindProperty("m_Type"); + m_FillCenter = serializedObject.FindProperty("m_FillCenter"); + m_FillMethod = serializedObject.FindProperty("m_FillMethod"); + m_FillOrigin = serializedObject.FindProperty("m_FillOrigin"); + m_FillClockwise = serializedObject.FindProperty("m_FillClockwise"); + m_FillAmount = serializedObject.FindProperty("m_FillAmount"); + m_PreserveAspect = serializedObject.FindProperty("m_PreserveAspect"); + + m_ShowType = new AnimBool(m_Sprite.objectReferenceValue != null); + m_ShowType.valueChanged.AddListener(Repaint); + + var typeEnum = (Image.Type)m_Type.enumValueIndex; + + m_ShowSlicedOrTiled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); + m_ShowSliced = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); + m_ShowTiled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Tiled); + m_ShowFilled = new AnimBool(!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Filled); + m_ShowSlicedOrTiled.valueChanged.AddListener(Repaint); + m_ShowSliced.valueChanged.AddListener(Repaint); + m_ShowTiled.valueChanged.AddListener(Repaint); + m_ShowFilled.valueChanged.AddListener(Repaint); + + SetShowNativeSize(true); + } + + protected override void OnDisable() + { + m_ShowType.valueChanged.RemoveListener(Repaint); + m_ShowSlicedOrTiled.valueChanged.RemoveListener(Repaint); + m_ShowSliced.valueChanged.RemoveListener(Repaint); + m_ShowTiled.valueChanged.RemoveListener(Repaint); + m_ShowFilled.valueChanged.RemoveListener(Repaint); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + SpriteGUI(); + AppearanceControlsGUI(); + RaycastControlsGUI(); + + m_ShowType.target = m_Sprite.objectReferenceValue != null; + if (EditorGUILayout.BeginFadeGroup(m_ShowType.faded)) + TypeGUI(); + EditorGUILayout.EndFadeGroup(); + + SetShowNativeSize(false); + if (EditorGUILayout.BeginFadeGroup(m_ShowNativeSize.faded)) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(m_PreserveAspect); + EditorGUI.indentLevel--; + } + EditorGUILayout.EndFadeGroup(); + NativeSizeButtonGUI(); + + serializedObject.ApplyModifiedProperties(); + } + + void SetShowNativeSize(bool instant) + { + Image.Type type = (Image.Type)m_Type.enumValueIndex; + bool showNativeSize = (type == Image.Type.Simple || type == Image.Type.Filled) && m_Sprite.objectReferenceValue != null; + base.SetShowNativeSize(showNativeSize, instant); + } + + /// <summary> + /// Draw the atlas and Image selection fields. + /// </summary> + + protected void SpriteGUI() + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_Sprite, m_SpriteContent); + if (EditorGUI.EndChangeCheck()) + { + var newSprite = m_Sprite.objectReferenceValue as Sprite; + if (newSprite) + { + Image.Type oldType = (Image.Type)m_Type.enumValueIndex; + if (newSprite.border.SqrMagnitude() > 0) + { + m_Type.enumValueIndex = (int)Image.Type.Sliced; + } + else if (oldType == Image.Type.Sliced) + { + m_Type.enumValueIndex = (int)Image.Type.Simple; + } + } + } + } + + /// <summary> + /// Sprites's custom properties based on the type. + /// </summary> + + protected void TypeGUI() + { + EditorGUILayout.PropertyField(m_Type, m_SpriteTypeContent); + + ++EditorGUI.indentLevel; + { + Image.Type typeEnum = (Image.Type)m_Type.enumValueIndex; + + bool showSlicedOrTiled = (!m_Type.hasMultipleDifferentValues && (typeEnum == Image.Type.Sliced || typeEnum == Image.Type.Tiled)); + if (showSlicedOrTiled && targets.Length > 1) + showSlicedOrTiled = targets.Select(obj => obj as Image).All(img => img.hasBorder); + + m_ShowSlicedOrTiled.target = showSlicedOrTiled; + m_ShowSliced.target = (showSlicedOrTiled && !m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Sliced); + m_ShowTiled.target = (showSlicedOrTiled && !m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Tiled); + m_ShowFilled.target = (!m_Type.hasMultipleDifferentValues && typeEnum == Image.Type.Filled); + + Image image = target as Image; + if (EditorGUILayout.BeginFadeGroup(m_ShowSlicedOrTiled.faded)) + { + if (image.hasBorder) + EditorGUILayout.PropertyField(m_FillCenter); + } + EditorGUILayout.EndFadeGroup(); + + if (EditorGUILayout.BeginFadeGroup(m_ShowSliced.faded)) + { + if (image.sprite != null && !image.hasBorder) + EditorGUILayout.HelpBox("This Image doesn't have a border.", MessageType.Warning); + } + EditorGUILayout.EndFadeGroup(); + + if (EditorGUILayout.BeginFadeGroup(m_ShowTiled.faded)) + { + if (image.sprite != null && !image.hasBorder && (image.sprite.texture.wrapMode != TextureWrapMode.Repeat || image.sprite.packed)) + EditorGUILayout.HelpBox("It looks like you want to tile a sprite with no border. It would be more efficient to convert the Sprite to an Advanced texture, clear the Packing tag and set the Wrap mode to Repeat.", MessageType.Warning); + } + EditorGUILayout.EndFadeGroup(); + + if (EditorGUILayout.BeginFadeGroup(m_ShowFilled.faded)) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField(m_FillMethod); + if (EditorGUI.EndChangeCheck()) + { + m_FillOrigin.intValue = 0; + } + switch ((Image.FillMethod)m_FillMethod.enumValueIndex) + { + case Image.FillMethod.Horizontal: + m_FillOrigin.intValue = (int)(Image.OriginHorizontal)EditorGUILayout.EnumPopup("Fill Origin", (Image.OriginHorizontal)m_FillOrigin.intValue); + break; + case Image.FillMethod.Vertical: + m_FillOrigin.intValue = (int)(Image.OriginVertical)EditorGUILayout.EnumPopup("Fill Origin", (Image.OriginVertical)m_FillOrigin.intValue); + break; + case Image.FillMethod.Radial90: + m_FillOrigin.intValue = (int)(Image.Origin90)EditorGUILayout.EnumPopup("Fill Origin", (Image.Origin90)m_FillOrigin.intValue); + break; + case Image.FillMethod.Radial180: + m_FillOrigin.intValue = (int)(Image.Origin180)EditorGUILayout.EnumPopup("Fill Origin", (Image.Origin180)m_FillOrigin.intValue); + break; + case Image.FillMethod.Radial360: + m_FillOrigin.intValue = (int)(Image.Origin360)EditorGUILayout.EnumPopup("Fill Origin", (Image.Origin360)m_FillOrigin.intValue); + break; + } + EditorGUILayout.PropertyField(m_FillAmount); + if ((Image.FillMethod)m_FillMethod.enumValueIndex > Image.FillMethod.Vertical) + { + EditorGUILayout.PropertyField(m_FillClockwise, m_ClockwiseContent); + } + } + EditorGUILayout.EndFadeGroup(); + } + --EditorGUI.indentLevel; + } + + /// <summary> + /// All graphics have a preview. + /// </summary> + + public override bool HasPreviewGUI() { return true; } + + /// <summary> + /// Draw the Image preview. + /// </summary> + + public override void OnPreviewGUI(Rect rect, GUIStyle background) + { + Image image = target as Image; + if (image == null) return; + + Sprite sf = image.sprite; + if (sf == null) return; + + SpriteDrawUtility.DrawSprite(sf, rect, image.canvasRenderer.GetColor()); + } + + /// <summary> + /// Info String drawn at the bottom of the Preview + /// </summary> + + public override string GetInfoString() + { + Image image = target as Image; + Sprite sprite = image.sprite; + + int x = (sprite != null) ? Mathf.RoundToInt(sprite.rect.width) : 0; + int y = (sprite != null) ? Mathf.RoundToInt(sprite.rect.height) : 0; + + return string.Format("Image Size: {0}x{1}", x, y); + } + } +} |