109 lines
3.9 KiB
C#
109 lines
3.9 KiB
C#
using System;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace FIMSpace.FEditor
|
|
{
|
|
[CustomPropertyDrawer(typeof(FPD_SuffixAttribute))]
|
|
public class FPD_Suffix : PropertyDrawer
|
|
{
|
|
FPD_SuffixAttribute Attribute { get { return ((FPD_SuffixAttribute)base.attribute); } }
|
|
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
label = EditorGUI.BeginProperty(position, label, property);
|
|
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
|
|
|
|
float sliderVal = property.floatValue;
|
|
|
|
GUIContent suff = new GUIContent(Attribute.Suffix);
|
|
Vector2 fieldS = EditorStyles.label.CalcSize(suff);
|
|
|
|
float fieldSize = 34 + fieldS.x + Attribute.widerField;
|
|
var percField = new Rect(position.x + position.width - fieldSize + 5, position.y, fieldSize, position.height);
|
|
Rect floatField = position;
|
|
|
|
bool editable = Attribute.editableValue;
|
|
if (GUI.enabled == false) editable = false;
|
|
|
|
if (editable)
|
|
{
|
|
floatField = new Rect(position.x + position.width - fieldSize + 2, position.y, fieldSize - (fieldS.x + 4), position.height);
|
|
percField.position = new Vector2(position.x + position.width - fieldS.x, percField.position.y);
|
|
percField.width = fieldS.x;
|
|
}
|
|
|
|
position.width -= fieldSize + 3;
|
|
sliderVal = GUI.HorizontalSlider(position, property.floatValue, Attribute.Min, Attribute.Max);
|
|
|
|
float pre, value;
|
|
int indent;
|
|
|
|
indent = EditorGUI.indentLevel;
|
|
EditorGUI.indentLevel = 0;
|
|
|
|
switch (Attribute.Mode)
|
|
{
|
|
case FPD_SuffixAttribute.SuffixMode.From0to100:
|
|
|
|
if (!editable)
|
|
EditorGUI.LabelField(percField, Mathf.Round(sliderVal / Attribute.Max * 100f).ToString() + Attribute.Suffix);
|
|
else
|
|
{
|
|
pre = Mathf.Round(sliderVal / Attribute.Max * 100f);
|
|
value = EditorGUI.FloatField(floatField, Mathf.Round(sliderVal / Attribute.Max * 100f));
|
|
if (value != pre) sliderVal = value / 100f;
|
|
|
|
EditorGUI.LabelField(percField, Attribute.Suffix);
|
|
}
|
|
|
|
break;
|
|
|
|
case FPD_SuffixAttribute.SuffixMode.PercentageUnclamped:
|
|
|
|
if (!editable)
|
|
EditorGUI.LabelField(percField, Mathf.Round(sliderVal * 100f).ToString() + Attribute.Suffix);
|
|
else
|
|
{
|
|
pre = Mathf.Round(sliderVal * 100f);
|
|
value = EditorGUI.FloatField(floatField, Mathf.Round(sliderVal * 100f));
|
|
if (value != pre) sliderVal = value / 100f;
|
|
|
|
EditorGUI.LabelField(percField, Attribute.Suffix);
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
case FPD_SuffixAttribute.SuffixMode.FromMinToMax:
|
|
|
|
pre = sliderVal;
|
|
value = EditorGUI.FloatField(floatField, sliderVal);
|
|
if (value != pre) sliderVal = value;
|
|
|
|
EditorGUI.LabelField(percField, Attribute.Suffix);
|
|
|
|
break;
|
|
|
|
case FPD_SuffixAttribute.SuffixMode.FromMinToMaxRounded:
|
|
|
|
pre = Mathf.Round(sliderVal);
|
|
value = EditorGUI.FloatField(floatField, Mathf.Round(sliderVal));
|
|
if (value != pre) sliderVal = value;
|
|
|
|
EditorGUI.LabelField(percField, Attribute.Suffix);
|
|
|
|
break;
|
|
}
|
|
|
|
property.floatValue = sliderVal;
|
|
EditorGUI.indentLevel = indent;
|
|
|
|
EditorGUI.EndProperty();
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|