Snaparazzi/Assets/MPUIKit/Editor/Scripts/MPImageBasicEditor.cs
2024-02-29 21:33:27 +01:00

528 lines
23 KiB
C#

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