eye-therapy-2 / Assets / Scripts / Editor / MinMaxSliderDrawer.cs
MinMaxSliderDrawer.cs
Raw
using UnityEngine;
using UnityEditor;
using GD.MinMaxSlider;

[CustomPropertyDrawer(typeof(MinMaxSliderAttribute))]
public class MinMaxSliderDrawer : PropertyDrawer {

    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){

        var minMaxAttribute = (MinMaxSliderAttribute)attribute;
        var propertyType = property.propertyType;

        //label.tooltip = minMaxAttribute.min.ToString("F2") + " to " + minMaxAttribute.max.ToString("F2");

        //PrefixLabel returns the rect of the right part of the control. It leaves out the label section. We don't have to worry about it. Nice!
        Rect controlRect = EditorGUI.PrefixLabel(position, label);
        
        Rect[] splittedRect = SplitRect(controlRect,3);

        if(propertyType == SerializedPropertyType.Vector2){ 

            EditorGUI.BeginChangeCheck();

            Vector2 vector = property.vector2Value;
            float minVal = vector.x;
            float maxVal = vector.y;

            //F2 limits the float to two decimal places (0.00).
            minVal = EditorGUI.FloatField(splittedRect[0], float.Parse(minVal.ToString("F2")));
            maxVal = EditorGUI.FloatField(splittedRect[2], float.Parse(maxVal.ToString("F2")));

            EditorGUI.MinMaxSlider(splittedRect[1], ref minVal, ref maxVal,
            minMaxAttribute.min,minMaxAttribute.max);

            if(minVal < minMaxAttribute.min){
                minVal = minMaxAttribute.min;
            }

            if(maxVal > minMaxAttribute.max){
                maxVal = minMaxAttribute.max;
            }

            vector = new Vector2(minVal > maxVal ? maxVal : minVal, maxVal);

            if(EditorGUI.EndChangeCheck()){
                property.vector2Value = vector;
            }

        }else if(propertyType == SerializedPropertyType.Vector2Int){

            EditorGUI.BeginChangeCheck();

            Vector2Int vector = property.vector2IntValue;
            float minVal = vector.x;
            float maxVal = vector.y;

            minVal = EditorGUI.FloatField(splittedRect[0], minVal);
            maxVal = EditorGUI.FloatField(splittedRect[2], maxVal);

            EditorGUI.MinMaxSlider(splittedRect[1], ref minVal, ref maxVal,
            minMaxAttribute.min,minMaxAttribute.max);

            if(minVal < minMaxAttribute.min){
                maxVal = minMaxAttribute.min;
            }

            if(minVal > minMaxAttribute.max){
                maxVal = minMaxAttribute.max;
            }

            vector = new Vector2Int(Mathf.FloorToInt(minVal > maxVal ? maxVal : minVal), Mathf.FloorToInt(maxVal));

            if(EditorGUI.EndChangeCheck()){
                property.vector2IntValue = vector;
            }

        } 

    }

    Rect[] SplitRect(Rect rectToSplit, int n){


        Rect[] rects = new Rect[n];

        for(int i = 0; i < n; i++){

            rects[i] = new Rect(rectToSplit.position.x + (i * rectToSplit.width / n), rectToSplit.position.y, rectToSplit.width / n, rectToSplit.height);
        
        }

        int padding = (int)rects[0].width - 40;
        int space = 5;

        rects[0].width -= padding + space;
        rects[2].width -= padding + space;

        rects[1].x -= padding;
        rects[1].width += padding * 2;

        rects[2].x += padding + space;
        

        return rects;

    }
    
}