seefood_diet / Assets / UIKit / Editor / UIElementInspector.cs
UIElementInspector.cs
Raw
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.AnimatedValues;
using UnityEditor.UI;
using UnityEngine;
using UnityEngine.UI;

namespace UIKit.Editor {

    [CustomEditor (typeof (UIElement))]
    [CanEditMultipleObjects]
    public class UIElementInspector : 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;
        SerializedProperty m_UseSpriteMesh;

        GUIContent m_SpriteContent;
        GUIContent m_SpriteTypeContent;
        GUIContent m_ClockwiseContent;
        AnimBool m_ShowSlicedOrTiled;
        AnimBool m_ShowSliced;
        AnimBool m_ShowTiled;
        AnimBool m_ShowFilled;
        AnimBool m_ShowType;

        SerializedProperty m_Radius;
        SerializedProperty m_EnableIndependentConers;
        SerializedProperty m_IndependentCornerRadii;

        SerializedProperty m_ShadowColor;
        SerializedProperty m_ShadowBlur;
        SerializedProperty m_ShadowOffset;
        SerializedProperty m_ShadowScale;

        SerializedProperty m_ImageColor;

        protected override void OnEnable () {

            base.OnEnable ();

            m_Radius = serializedObject.FindProperty ("Radius");
            m_EnableIndependentConers = serializedObject.FindProperty ("EnableIndependentConers");
            m_IndependentCornerRadii = serializedObject.FindProperty ("IndependentCornerRadii");

            m_ShadowColor = serializedObject.FindProperty ("ShadowColor");
            m_ShadowBlur = serializedObject.FindProperty ("ShadowBlur");
            m_ShadowOffset = serializedObject.FindProperty ("ShadowOffset");
            m_ShadowScale = serializedObject.FindProperty ("ShadowScale");

            m_ImageColor = serializedObject.FindProperty ("ImageColor");

            m_SpriteContent = EditorGUIUtility.TrTextContent ("Source Image");
            m_SpriteTypeContent = EditorGUIUtility.TrTextContent ("Image Type");
            m_ClockwiseContent = EditorGUIUtility.TrTextContent ("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_UseSpriteMesh = serializedObject.FindProperty ("m_UseSpriteMesh");

            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 ();

            UIElementGUI ();
            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++;

                if ((Image.Type) m_Type.enumValueIndex == Image.Type.Simple)
                    EditorGUILayout.PropertyField (m_UseSpriteMesh);

                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);
        }

        void UIElementGUI () {

            var m_Target = (UIElement) target;

            if (!m_Target.canvas.additionalShaderChannels.HasFlag (AdditionalCanvasShaderChannels.TexCoord1)) {
                EditorGUILayout.HelpBox ("Make sure that \"TexCoord1\" is enabled in \"Additional Shader Channels\" on the Canvas", MessageType.Error, true);
            }

            EditorGUILayout.PropertyField (m_Radius);
            EditorGUILayout.PropertyField (m_EnableIndependentConers);
            EditorGUILayout.PropertyField (m_IndependentCornerRadii);

            EditorGUILayout.PropertyField (m_ShadowColor);
            EditorGUILayout.PropertyField (m_ShadowBlur);
            EditorGUILayout.PropertyField (m_ShadowOffset);
            EditorGUILayout.PropertyField (m_ShadowScale);

            EditorGUILayout.PropertyField (m_ImageColor);
        }

        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;
                    }
                }
                (serializedObject.targetObject as Image).DisableSpriteOptimizations ();
            }
        }

        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 modify the Sprite properties, 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;
        }

        public override bool HasPreviewGUI () { return true; }

        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);
        }
    }
}