| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528 | using System;using UnityEngine;using UnityEditor;using UnityEngine.UI;using UnityEditor.UI;namespace MPUIKIT.Editor {    [CustomEditor(typeof(MPImageBasic))]    public class MPImageBasicEditor : ImageEditor {        private SerializedProperty spSprite;        private SerializedProperty spCircleRadius, spCircleFitToRect;        private SerializedProperty spTriangleCornerRadius, spTriangleUniformCornerRadius;        private SerializedProperty spRectangleCornerRadius, spRectangleUniformCornerRadius;        private SerializedProperty spNStarPolygonSideCount, spNStarPolygonInset, spNStarPolygonCornerRadius;        private SerializedProperty spPreserveAspect;        private SerializedProperty spFillMethod, spFillOrigin, spFillAmount, spFillClockwise;        private SerializedProperty spShape;        private SerializedProperty spStrokeWidth, spOutlineWidth, spOutlineColor, spFalloffDistance;        private SerializedProperty spConstrainRotation, spShapeRotation, spFlipHorizontal, spFlipVertical;        private SerializedProperty spImageType;        protected override void OnEnable() {            base.OnEnable();            spSprite = serializedObject.FindProperty("m_Sprite");            spShape = serializedObject.FindProperty("m_DrawShape");            spStrokeWidth = serializedObject.FindProperty("m_StrokeWidth");            spOutlineWidth = serializedObject.FindProperty("m_OutlineWidth");            spOutlineColor = serializedObject.FindProperty("m_OutlineColor");            spFalloffDistance = serializedObject.FindProperty("m_FalloffDistance");            spImageType = serializedObject.FindProperty("m_ImageType");            spFillMethod = serializedObject.FindProperty("m_FillMethod");            spFillOrigin = serializedObject.FindProperty("m_FillOrigin");            spFillAmount = serializedObject.FindProperty("m_FillAmount");            spFillClockwise = serializedObject.FindProperty("m_FillClockwise");            spConstrainRotation = serializedObject.FindProperty("m_ConstrainRotation");            spShapeRotation = serializedObject.FindProperty("m_ShapeRotation");            spFlipHorizontal = serializedObject.FindProperty("m_FlipHorizontal");            spFlipVertical = serializedObject.FindProperty("m_FlipVertical");            spCircleRadius = serializedObject.FindProperty("m_CircleRadius");            spCircleFitToRect = serializedObject.FindProperty("m_CircleFitToRect");            spTriangleCornerRadius = serializedObject.FindProperty("m_TriangleCornerRadius");            spTriangleUniformCornerRadius = serializedObject.FindProperty("m_TriangleUniformCornerRadius");            spRectangleCornerRadius = serializedObject.FindProperty("m_RectangleCornerRadius");            spRectangleUniformCornerRadius = serializedObject.FindProperty("m_TriangleUniformCornerRadius");            spNStarPolygonSideCount = serializedObject.FindProperty("m_NStarPolygonSideCount");            spNStarPolygonInset = serializedObject.FindProperty("m_NStarPolygonInset");            spNStarPolygonCornerRadius = serializedObject.FindProperty("m_NStarPolygonCornerRadius");            spPreserveAspect = serializedObject.FindProperty("m_PreserveAspect");        }        public override void OnInspectorGUI() {            serializedObject.Update();            RaycastControlsGUI();            EditorGUILayout.PropertyField(m_Color);            EditorGUILayout.Space();            Rect shapePopupRect = EditorGUILayout.GetControlRect();            DrawShapeBasic selectedIndex = (DrawShapeBasic) spShape.enumValueIndex;            if (selectedIndex == (DrawShapeBasic) DrawShape.Pentagon || selectedIndex == (DrawShapeBasic) DrawShape.Hexagon)            {                selectedIndex = (DrawShapeBasic) DrawShape.None;                spShape.enumValueIndex = (int) selectedIndex;            }                        EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spShape.hasMultipleDifferentValues;                selectedIndex = (DrawShapeBasic) EditorGUI.EnumPopup(shapePopupRect, "Draw Shape", selectedIndex);                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck())            {                spShape.enumValueIndex = (int) selectedIndex;            }            if (spShape.enumValueIndex != (int) DrawShape.None && !spShape.hasMultipleDifferentValues) {                EditorGUILayout.BeginVertical("Box");                if (!spShape.hasMultipleDifferentValues) {                    switch ((DrawShape) spShape.enumValueIndex) {                        case DrawShape.Circle:                            CircleGUI();                            break;                        case DrawShape.Rectangle:                            RectangleGUI();                            break;                        case DrawShape.Triangle:                            TriangleGUI();                            break;                        case DrawShape.NStarPolygon:                            NStarPolygonGUI();                            break;                        default:                            throw new ArgumentOutOfRangeException();                    }                }                EditorGUILayout.Space();                if (spShape.enumValueIndex != (int) DrawShape.None) {                    AdditionalShapeDataGUI();                }                EditorGUILayout.EndVertical();            }            EditorGUILayout.Space();            ImageTypeGUI();            SpriteGUI();            if (!spSprite.hasMultipleDifferentValues && spSprite.objectReferenceValue != null) {                EditorGUILayout.PropertyField(spPreserveAspect);            }            SetShowNativeSize(spSprite.objectReferenceValue != null, true);            NativeSizeButtonGUI();            EditorGUILayout.Space();            serializedObject.ApplyModifiedProperties();        }        private void NStarPolygonGUI() {            spNStarPolygonSideCount.intValue =                EditorGUILayout.IntSlider("Side Count", spNStarPolygonSideCount.intValue, 3, 10);            spNStarPolygonInset.floatValue =                EditorGUILayout.Slider("Inset", spNStarPolygonInset.floatValue, 2f,                    spNStarPolygonSideCount.intValue - 0.1f);            spNStarPolygonCornerRadius.floatValue =                EditorGUILayout.FloatField("Corner Radius", spNStarPolygonCornerRadius.floatValue);        }        private void CircleGUI() {            EditorGUI.BeginDisabledGroup(spCircleFitToRect.boolValue);            EditorGUILayout.PropertyField(spCircleRadius, new GUIContent("Radius"));            EditorGUI.EndDisabledGroup();            Rect rect = EditorGUILayout.GetControlRect();            MPEditorUtility.CornerRadiusModeGUI(rect, ref spCircleFitToRect, new[] {"Free", "Fit"}, String.Empty);        }        private void RectangleGUI() {            Rect rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);            MPEditorUtility.CornerRadiusModeGUI(rect, ref spRectangleUniformCornerRadius, new[] {"Free", "Uniform"});            Vector4 vectorValue = spRectangleCornerRadius.vector4Value;            float floatVal = vectorValue.x;            float[] zw = new[] {vectorValue.w, vectorValue.z};            float[] xy = new[] {vectorValue.x, vectorValue.y};            EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spRectangleCornerRadius.hasMultipleDifferentValues;                if (spRectangleUniformCornerRadius.boolValue) {                    floatVal = EditorGUILayout.FloatField("Uniform Radius", floatVal);                }                else {                    rect = EditorGUILayout.GetControlRect(true,                        EditorGUIUtility.standardVerticalSpacing + EditorGUIUtility.singleLineHeight * 2);                    Rect RadiusVectorRect = new Rect(rect.x, rect.y,                        rect.width, EditorGUIUtility.singleLineHeight);                    EditorGUI.MultiFloatField(RadiusVectorRect, new[] {                        new GUIContent("W"), new GUIContent("Z")                    }, zw);                    RadiusVectorRect.y +=                        EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;                    EditorGUI.MultiFloatField(RadiusVectorRect, new[] {                        new GUIContent("X "), new GUIContent("Y")                    }, xy);                }                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                spRectangleCornerRadius.vector4Value = spRectangleUniformCornerRadius.boolValue                    ? new Vector4(floatVal, floatVal, floatVal, floatVal)                    : new Vector4(xy[0], xy[1], zw[1], zw[0]);            }        }        private void TriangleGUI() {            Rect rect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);            MPEditorUtility.CornerRadiusModeGUI(rect, ref spTriangleUniformCornerRadius, new[] {"Free", "Uniform"});            Vector3 vectorValue = spTriangleCornerRadius.vector3Value;            float floatVal = vectorValue.x;            EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spTriangleCornerRadius.hasMultipleDifferentValues;                if (spTriangleUniformCornerRadius.boolValue) {                    floatVal = EditorGUILayout.FloatField("Uniform Radius", floatVal);                }                else {                    vectorValue = EditorGUILayout.Vector3Field("", vectorValue);                }                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                spTriangleCornerRadius.vector3Value = spTriangleUniformCornerRadius.boolValue                    ? new Vector3(floatVal, floatVal, floatVal)                    : vectorValue;            }        }        private void AdditionalShapeDataGUI() {            EditorGUILayout.Space();            float strokeWidth = spStrokeWidth.floatValue;            float outlineWidth = spOutlineWidth.floatValue;            float falloff = spFalloffDistance.floatValue;            Color outlineColor = spOutlineColor.colorValue;            Rect r = EditorGUILayout.GetControlRect(true,                EditorGUIUtility.singleLineHeight * 2 + EditorGUIUtility.standardVerticalSpacing);            Rect line = r;            line.height = EditorGUIUtility.singleLineHeight;            float x = (line.width - 10f) / 2;            float fieldWidth = x / 2 - 10f;            float labelWidth = x - fieldWidth;            line.width = labelWidth;            EditorGUI.LabelField(line, "Stroke");            Rect dragZone = line;            line.x += labelWidth;            line.width = fieldWidth;            EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spStrokeWidth.hasMultipleDifferentValues;                strokeWidth =                    EditorGUILayoutExtended.FloatFieldExtended(line, spStrokeWidth.floatValue, dragZone);                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                spStrokeWidth.floatValue = strokeWidth;            }            line.x += fieldWidth + 10;            line.width = labelWidth;            EditorGUI.LabelField(line, "Falloff");            dragZone = line;            line.x += labelWidth;            line.width = fieldWidth;            EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spFalloffDistance.hasMultipleDifferentValues;                falloff =                    EditorGUILayoutExtended.FloatFieldExtended(line, spFalloffDistance.floatValue, dragZone);                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                spFalloffDistance.floatValue = falloff;            }            line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;            line.x = r.x;            line.width = labelWidth;            EditorGUI.LabelField(line, "Outline Width");            dragZone = line;            line.x += labelWidth;            line.width = fieldWidth;            EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spOutlineWidth.hasMultipleDifferentValues;                outlineWidth =                    EditorGUILayoutExtended.FloatFieldExtended(line, spOutlineWidth.floatValue, dragZone);                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                spOutlineWidth.floatValue = outlineWidth;            }            line.x += fieldWidth + 10;            line.width = labelWidth;            EditorGUI.LabelField(line, "Outline Color");            dragZone = line;            line.width = fieldWidth;            line.x += labelWidth;            EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spOutlineColor.hasMultipleDifferentValues;                outlineColor = EditorGUI.ColorField(line, spOutlineColor.colorValue);                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                spOutlineColor.colorValue = outlineColor;            }            EditorGUILayout.Space();            RotationGUI();        }        private void RotationGUI() {            Rect r = EditorGUILayout.GetControlRect(true,                EditorGUIUtility.singleLineHeight + 24 + EditorGUIUtility.standardVerticalSpacing);            Rect line = r;            line.height = EditorGUIUtility.singleLineHeight;            float x = (line.width - 10f) / 2;            float fieldWidth = x / 2 - 10f;            float labelWidth = x - fieldWidth;            line.width = labelWidth;            EditorGUI.LabelField(line, "Rotation");            line.x += labelWidth;            line.width = r.width - labelWidth - 78;            string[] options = spConstrainRotation.hasMultipleDifferentValues                ? new[] {"---", "---"}                : new[] {"Free", "Constrained"};            bool boolVal = spConstrainRotation.boolValue;            EditorGUI.BeginChangeCheck();            {                boolVal = GUI.Toolbar(line, boolVal ? 1 : 0, options) == 1;            }            if (EditorGUI.EndChangeCheck()) {                spConstrainRotation.boolValue = boolVal;                GUI.FocusControl(null);            }            line.x += line.width + 14;            line.width = 64;            EditorGUI.LabelField(line, "Flip");            line.y += EditorGUIUtility.standardVerticalSpacing + EditorGUIUtility.singleLineHeight;            line.x = r.x + 10;            line.height = EditorGUIUtility.singleLineHeight;            line.width = labelWidth - 10;            EditorGUI.BeginDisabledGroup(spConstrainRotation.boolValue);            {                Rect dragZone = line;                EditorGUI.LabelField(line, "Angle");                line.x = r.x + labelWidth;                line.width = r.width - labelWidth - 148;                float rotationValue = spShapeRotation.floatValue;                EditorGUI.BeginChangeCheck();                {                    EditorGUI.showMixedValue = spShapeRotation.hasMultipleDifferentValues;                    rotationValue =                        EditorGUILayoutExtended.FloatFieldExtended(line, spShapeRotation.floatValue, dragZone);                    EditorGUI.showMixedValue = false;                }                if (EditorGUI.EndChangeCheck()) {                    spShapeRotation.floatValue = rotationValue;                }            }            EditorGUI.EndDisabledGroup();            EditorGUI.BeginDisabledGroup(!spConstrainRotation.boolValue);            {                line.x += line.width + 4;                line.width = 30;                line.height = 24;                if (GUI.Button(line, MPEditorContents.RotateLeftNormal)) {                    float rotation = spShapeRotation.floatValue;                    float remainder = rotation % 90;                    if (Mathf.Abs(remainder) <= 0) {                        rotation += 90;                    }                    else {                        rotation = rotation - remainder + 90;                    }                    if (Math.Abs(rotation) >= 360) rotation = 0;                    spShapeRotation.floatValue = rotation;                }                line.x += 34;                if (GUI.Button(line, MPEditorContents.RotateRightNormal)) {                    float rotation = spShapeRotation.floatValue;                    float remainder = rotation % 90;                    if (Mathf.Abs(remainder) <= 0) {                        rotation -= 90;                    }                    else {                        rotation -= remainder;                    }                    if (Math.Abs(rotation) >= 360) rotation = 0;                    spShapeRotation.floatValue = rotation;                }            }            EditorGUI.EndDisabledGroup();            line.x += 46;            bool flipH = spFlipHorizontal.boolValue;            bool flipV = spFlipVertical.boolValue;            EditorGUI.BeginChangeCheck();            {                EditorGUI.BeginDisabledGroup(spFlipHorizontal.hasMultipleDifferentValues ||                                             spFlipVertical.hasMultipleDifferentValues);                flipH = GUI.Toggle(line, spFlipHorizontal.boolValue,                    spFlipHorizontal.boolValue                        ? MPEditorContents.FlipHorizontalActive                        : MPEditorContents.FlipHorizontalNormal, "button");                line.x += 34;                flipV = GUI.Toggle(line, spFlipVertical.boolValue,                    spFlipVertical.boolValue                        ? MPEditorContents.FlipVerticalActive                        : MPEditorContents.FlipVerticalNormal, "button");                EditorGUI.EndDisabledGroup();            }            if (EditorGUI.EndChangeCheck()) {                spFlipHorizontal.boolValue = flipH;                spFlipVertical.boolValue = flipV;            }        }        private new void SpriteGUI() {            Sprite spriteRef = spSprite.objectReferenceValue as Sprite;            Sprite sprite = MPEditorUtility.EmptySprite.Equals(spriteRef) ? null : spriteRef;                        EditorGUI.BeginChangeCheck();            {                EditorGUI.showMixedValue = spSprite.hasMultipleDifferentValues;                sprite = EditorGUILayout.ObjectField("Sprite", sprite, typeof(Sprite), false, GUILayout.Height(EditorGUIUtility.singleLineHeight)) as Sprite;                                EditorGUI.showMixedValue = false;            }            if (EditorGUI.EndChangeCheck()) {                Sprite newSprite = sprite == null? MPEditorUtility.EmptySprite : sprite;                if (newSprite != null) {                    Image.Type oldType = (Image.Type) spImageType.enumValueIndex;                    if (newSprite.border.SqrMagnitude() > 0) {                        spImageType.enumValueIndex = (int) Image.Type.Sliced;                    }                    else if (oldType == Image.Type.Sliced) {                        spImageType.enumValueIndex = (int) Image.Type.Simple;                    }                }                spSprite.objectReferenceValue = newSprite;                (serializedObject.targetObject as Image)?.DisableSpriteOptimizations();            }            EditorGUI.EndDisabledGroup();        }        private void ImageTypeGUI() {            int selectedIndex = spImageType.enumValueIndex == (int) Image.Type.Simple ? 0 : 1;            Rect imageTypeRect = EditorGUILayout.GetControlRect();            EditorGUI.BeginChangeCheck();            {                EditorGUI.LabelField(                    new Rect(imageTypeRect.x, imageTypeRect.y, EditorGUIUtility.labelWidth, imageTypeRect.height),                    "Type");                imageTypeRect.x += EditorGUIUtility.labelWidth + 2;                imageTypeRect.width -= EditorGUIUtility.labelWidth + 2;                selectedIndex = EditorGUI.Popup(imageTypeRect, selectedIndex, new[] {"Simple", "Filled"});            }            if (EditorGUI.EndChangeCheck()) {                spImageType.enumValueIndex = (int) (selectedIndex == 0 ? Image.Type.Simple : Image.Type.Filled);            }            if (!spImageType.hasMultipleDifferentValues && spImageType.enumValueIndex == (int) Image.Type.Filled) {                ++EditorGUI.indentLevel;                EditorGUI.BeginChangeCheck();                EditorGUILayout.PropertyField(spFillMethod);                if (EditorGUI.EndChangeCheck()) {                    spFillOrigin.intValue = 0;                }                switch ((Image.FillMethod) spFillMethod.enumValueIndex) {                    case Image.FillMethod.Horizontal:                        spFillOrigin.intValue = (int) (Image.OriginHorizontal) EditorGUILayout.EnumPopup("Fill Origin",                            (Image.OriginHorizontal) spFillOrigin.intValue);                        break;                    case Image.FillMethod.Vertical:                        spFillOrigin.intValue = (int) (Image.OriginVertical) EditorGUILayout.EnumPopup("Fill Origin",                            (Image.OriginVertical) spFillOrigin.intValue);                        break;                    case Image.FillMethod.Radial90:                        spFillOrigin.intValue =                            (int) (Image.Origin90) EditorGUILayout.EnumPopup("Fill Origin",                                (Image.Origin90) spFillOrigin.intValue);                        break;                    case Image.FillMethod.Radial180:                        spFillOrigin.intValue =                            (int) (Image.Origin180) EditorGUILayout.EnumPopup("Fill Origin",                                (Image.Origin180) spFillOrigin.intValue);                        break;                    case Image.FillMethod.Radial360:                        spFillOrigin.intValue =                            (int) (Image.Origin360) EditorGUILayout.EnumPopup("Fill Origin",                                (Image.Origin360) spFillOrigin.intValue);                        break;                }                EditorGUILayout.PropertyField(spFillAmount);                if ((Image.FillMethod) spFillMethod.enumValueIndex > Image.FillMethod.Vertical) {                    EditorGUILayout.PropertyField(spFillClockwise, new GUIContent("Clockwise"));                }                --EditorGUI.indentLevel;            }        }        private enum DrawShapeBasic        {            None = 0,            Circle = 1,            Triangle = 2,            Rectangle = 3,            NStarPolygon = 6        }    }    }
 |