Snaparazzi/Assets/MPUIKit/Editor/Scripts/ShapeDrawers/HexagonPropertyDrawer.cs

106 lines
5.7 KiB
C#
Raw Normal View History

2024-02-29 20:33:27 +00:00
using UnityEditor;
using UnityEngine;
namespace MPUIKIT.Editor {
[CustomPropertyDrawer(typeof(Hexagon))]
public class HexagonPropertyDrawer : PropertyDrawer {
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
EditorGUI.BeginProperty(position, label, property);
{
SerializedProperty rectRadius = property.FindPropertyRelative("m_CornerRadius");
SerializedProperty uniformRect = property.FindPropertyRelative("m_UniformCornerRadius");
SerializedProperty triSizes = property.FindPropertyRelative("m_TipSize");
SerializedProperty uniformTriS = property.FindPropertyRelative("m_UniformTipSize");
SerializedProperty triRadius = property.FindPropertyRelative("m_TipRadius");
SerializedProperty uniformTriR = property.FindPropertyRelative("m_UniformTipRadius");
Vector4 radiusVectorValue = rectRadius.vector4Value;
float radiusFloatValue = radiusVectorValue.x;
bool rectBoolVal = uniformRect.boolValue;
float[] zw = new[] {radiusVectorValue.w, radiusVectorValue.z};
float[] xy = new[] {radiusVectorValue.x, radiusVectorValue.y};
Vector2 triSizesVectorValue = triSizes.vector2Value;
float triSizesFloatValue = triSizesVectorValue.x;
Vector2 triRadiusVectorValue = triRadius.vector2Value;
float triRadiusFloatValue = triRadiusVectorValue.x;
Rect line = position;
line.height = EditorGUIUtility.singleLineHeight;
string[] toolbarLabel = new[] {"Free", "Uniform"};
MPEditorUtility.CornerRadiusModeGUI(line, ref uniformRect, toolbarLabel);
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.BeginChangeCheck();
{
EditorGUI.showMixedValue = rectRadius.hasMultipleDifferentValues;
if (rectBoolVal) {
radiusFloatValue = EditorGUI.FloatField(line, "Uniform Radius", radiusFloatValue);
}
else {
EditorGUI.MultiFloatField(line, new []{new GUIContent("W"), new GUIContent("Z")}, zw);
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.MultiFloatField(line, new []{new GUIContent("X"), new GUIContent("Y")}, xy);
}
EditorGUI.showMixedValue = false;
}
if (EditorGUI.EndChangeCheck()) {
rectRadius.vector4Value = rectBoolVal
? new Vector4(radiusFloatValue, radiusFloatValue, radiusFloatValue, radiusFloatValue)
: new Vector4(xy[0], xy[1], zw[1], zw[0]);
}
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
MPEditorUtility.CornerRadiusModeGUI(line, ref uniformTriS, toolbarLabel, "Tip Size");
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.BeginChangeCheck();
{
EditorGUI.showMixedValue = triSizes.hasMultipleDifferentValues;
if (uniformTriS.boolValue) {
triSizesFloatValue = EditorGUI.FloatField(line, "Uniform Size", triSizesFloatValue);
}
else {
triSizesVectorValue = EditorGUI.Vector2Field(line, string.Empty, triSizesVectorValue);
}
EditorGUI.showMixedValue = false;
}
if (EditorGUI.EndChangeCheck()) {
triSizes.vector2Value = uniformTriS.boolValue
? new Vector2(triSizesFloatValue, triSizesFloatValue)
: triSizesVectorValue;
}
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
MPEditorUtility.CornerRadiusModeGUI(line, ref uniformTriR, toolbarLabel, "Tip Radius");
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.BeginChangeCheck();
{
EditorGUI.showMixedValue = triRadius.hasMultipleDifferentValues;
if (uniformTriR.boolValue) {
triRadiusFloatValue = EditorGUI.FloatField(line, "Uniform Radius", triRadiusFloatValue);
}
else {
triRadiusVectorValue = EditorGUI.Vector2Field(line, string.Empty, triRadiusVectorValue);
}
EditorGUI.showMixedValue = false;
}
if (EditorGUI.EndChangeCheck()) {
triRadius.vector2Value = uniformTriR.boolValue
? new Vector2(triRadiusFloatValue, triRadiusFloatValue)
: triRadiusVectorValue;
}
}
EditorGUI.EndProperty();
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
if (property.FindPropertyRelative("m_UniformCornerRadius").boolValue) {
return EditorGUIUtility.singleLineHeight * 6 + EditorGUIUtility.standardVerticalSpacing * 5;
}
return EditorGUIUtility.singleLineHeight * 7 + EditorGUIUtility.standardVerticalSpacing * 6;
}
}
}