| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 | using System;using UnityEditor;using UnityEditor.UI;using UnityEngine;using UnityEngine.UI;using Object = UnityEngine.Object;namespace MPUIKIT.Editor {    [CustomEditor(typeof(MPImage), true)]    [CanEditMultipleObjects]    public class MPImageEditor : ImageEditor {        private SerializedProperty spSprite;        private SerializedProperty spCircle, spTriangle, spRectangle, spPentagon, spHexagon, spNStarPolygon;        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 spMaterialSettings, spMaterial, spImageType;        private SerializedProperty spGradient;        private bool gsInitialized, shaderChannelsNeedUpdate;        protected override void OnEnable() {            foreach (Object obj in serializedObject.targetObjects) {                ((MPImage) obj).UpdateSerializedValuesFromSharedMaterial();            }            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");            spMaterialSettings = serializedObject.FindProperty("m_MaterialMode");            spMaterial = serializedObject.FindProperty("m_Material");            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");            spCircle = serializedObject.FindProperty("m_Circle");            spRectangle = serializedObject.FindProperty("m_Rectangle");            spTriangle = serializedObject.FindProperty("m_Triangle");            spPentagon = serializedObject.FindProperty("m_Pentagon");            spHexagon = serializedObject.FindProperty("m_Hexagon");            spNStarPolygon = serializedObject.FindProperty("m_NStarPolygon");            spPreserveAspect = serializedObject.FindProperty("m_PreserveAspect");            spGradient = serializedObject.FindProperty("m_GradientEffect");        }        public override void OnInspectorGUI() {            serializedObject.Update();            FixShaderChannelGUI();            RaycastControlsGUI();            EditorGUILayout.PropertyField(m_Color);            EditorGUILayout.Space();            EditorGUILayout.PropertyField(spShape);            if (spShape.enumValueIndex != (int) DrawShape.None) {                EditorGUILayout.BeginVertical("Box");                if (!spShape.hasMultipleDifferentValues) {                    switch ((DrawShape) spShape.enumValueIndex) {                        case DrawShape.Circle:                            EditorGUILayout.PropertyField(spCircle);                            break;                        case DrawShape.Rectangle:                            EditorGUILayout.PropertyField(spRectangle);                            break;                        case DrawShape.Pentagon:                            EditorGUILayout.PropertyField(spPentagon);                            break;                        case DrawShape.Triangle:                            EditorGUILayout.PropertyField(spTriangle);                            break;                        case DrawShape.Hexagon:                            EditorGUILayout.PropertyField(spHexagon);                            break;                        case DrawShape.NStarPolygon:                            EditorGUILayout.PropertyField(spNStarPolygon);                            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();            SharedMaterialGUI();            EditorGUILayout.Space();            EditorGUILayout.BeginVertical("Box");            {                EditorGUILayout.PropertyField(spGradient);            }            EditorGUILayout.EndVertical();            serializedObject.ApplyModifiedProperties();            serializedObject.Update();            Repaint();        }                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 void FixShaderChannelGUI() {            if (!shaderChannelsNeedUpdate) return;            EditorGUILayout.HelpBox(                "Parent Canvas needs to have these additional shader channels : Texcoord1, Texcoord2",                MessageType.Error);            EditorGUILayout.BeginHorizontal();            {                GUILayout.FlexibleSpace();                if (GUILayout.Button("Fix", GUILayout.Width(100))) {                    Canvas canvas = (target as MPImage)?.GetComponentInParent<Canvas>();                    if (canvas != null) {                        MPEditorUtility.AddAdditionalShaderChannelsToCanvas(canvas);                        shaderChannelsNeedUpdate = false;                    }                }            }            EditorGUILayout.EndHorizontal();        }        private new void SpriteGUI() {            EditorGUI.BeginChangeCheck();            EditorGUILayout.PropertyField(spSprite, new GUIContent("Sprite"));            if (EditorGUI.EndChangeCheck()) {                Sprite newSprite = spSprite.objectReferenceValue as Sprite;                if (newSprite) {                    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;                    }                }                (serializedObject.targetObject as Image)?.DisableSpriteOptimizations();            }        }        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 void SharedMaterialGUI() {            Rect rect = EditorGUILayout.GetControlRect(true,                EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing);            int matSett = spMaterialSettings.enumValueIndex;            Rect labelRect = rect;            labelRect.width = EditorGUIUtility.labelWidth;            EditorGUI.LabelField(labelRect, "Material Mode");            rect.x += labelRect.width;            rect.width -= labelRect.width;            EditorGUI.BeginChangeCheck();            EditorGUI.showMixedValue = spMaterialSettings.hasMultipleDifferentValues;            string[] options = new[] {"Dynamic", "Shared"};            if (EditorGUI.showMixedValue) options = new[] {"---", "---"};            matSett = GUI.Toolbar(rect, matSett, options);            if (EditorGUI.EndChangeCheck()) {                spMaterialSettings.enumValueIndex = matSett;                foreach (Object obj in targets) {                    ((MPImage) obj).MaterialMode = (MaterialMode) matSett;                    EditorUtility.SetDirty(obj);                }            }            EditorGUI.showMixedValue = false;            EditorGUI.BeginDisabledGroup(spMaterialSettings.enumValueIndex == (int) MaterialMode.Dynamic);            {                rect = EditorGUILayout.GetControlRect(true,                    EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing);                Object matObj = spMaterial.objectReferenceValue;                EditorGUI.BeginChangeCheck();                {                    EditorGUI.showMixedValue = spMaterialSettings.hasMultipleDifferentValues;                    matObj = (Material) EditorGUI.ObjectField(                        new Rect(rect.x, rect.y, rect.width - 60, EditorGUIUtility.singleLineHeight),                        matObj, typeof(Material), false);                    EditorGUI.showMixedValue = false;                }                if (EditorGUI.EndChangeCheck()) {                    spMaterial.objectReferenceValue = matObj;                    foreach (Object obj in targets) {                        ((MPImage) obj).material = (Material) matObj;                        EditorUtility.SetDirty(obj);                    }                }                EditorGUI.BeginDisabledGroup(spMaterial.objectReferenceValue != null);                {                    if (GUI.Button(new Rect(rect.x + rect.width - 55, rect.y, 55, EditorGUIUtility.singleLineHeight),                        "Create")) {                        Material mat = ((MPImage) target).CreateMaterialAssetFromComponentSettings();                        spMaterial.objectReferenceValue = mat;                        foreach (Object obj in targets) {                            ((MPImage) obj).material = mat;                            EditorUtility.SetDirty(obj);                        }                    }                }                EditorGUI.EndDisabledGroup();            }            EditorGUI.EndDisabledGroup();        }    }}
 |