summaryrefslogtreecommitdiff
path: root/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/FloatEditor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Plugins/Editor/AdvancedInspector/FieldEditors/FloatEditor.cs')
-rw-r--r--Assets/Plugins/Editor/AdvancedInspector/FieldEditors/FloatEditor.cs208
1 files changed, 208 insertions, 0 deletions
diff --git a/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/FloatEditor.cs b/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/FloatEditor.cs
new file mode 100644
index 00000000..d139c02f
--- /dev/null
+++ b/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/FloatEditor.cs
@@ -0,0 +1,208 @@
+using UnityEngine;
+using UnityEditor;
+using System;
+using System.Collections;
+
+namespace AdvancedInspector
+{
+ public class FloatEditor : FieldEditor
+ {
+ public override Type[] EditedTypes
+ {
+ get { return new Type[] { typeof(float), typeof(decimal), typeof(double) }; }
+ }
+
+ public override void OnLabelDraw(InspectorField field, Rect rect)
+ {
+ if (InspectorPreferences.IsDragControl(InspectorPreferences.ValueScroll))
+ EditorGUIUtility.AddCursorRect(rect, MouseCursor.ResizeHorizontal);
+ }
+
+ public override void OnLabelClick(InspectorField field)
+ {
+ EditorGUIUtility.SetWantsMouseJumping(1);
+ }
+
+ public override void OnLabelDragged(InspectorField field)
+ {
+ if (InspectorPreferences.IsDragControl(InspectorPreferences.ValueScroll))
+ {
+ object result = field.GetValues()[0];
+ double sensitivity = CalculateDragSensitivity(result);
+ result = Convert.ToDouble(result) + (double)(sensitivity * HandleUtility.niceMouseDelta);
+
+ RangeValueAttribute rangeValue = field.GetAttribute<RangeValueAttribute>();
+ if (rangeValue != null)
+ result = Math.Min(Math.Max((double)result, rangeValue.Min), rangeValue.Max);
+
+ RangeAttribute range = field.GetAttribute<RangeAttribute>();
+ if (range != null)
+ result = Math.Min(Math.Max((double)result, range.min), range.max);
+
+ try
+ {
+ result = Convert.ChangeType(result, field.Type);
+ field.SetValue(result);
+ }
+ catch (Exception)
+ {
+ return;
+ }
+ }
+ }
+
+ private static double CalculateDragSensitivity(object value)
+ {
+ double number = Convert.ToDouble(value);
+
+ if (!double.IsInfinity(number) && !double.IsNaN(number))
+ return (Math.Max(1d, Math.Pow(Math.Abs(number), 0.5d)) * 0.03d);
+
+ return 0d;
+ }
+
+ public override void Draw(InspectorField field, GUIStyle style)
+ {
+ RangeValueAttribute rangeValue = field.GetAttribute<RangeValueAttribute>();
+ RangeAttribute range = field.GetAttribute<RangeAttribute>();
+
+ if (range != null && rangeValue == null)
+ rangeValue = new RangeValueAttribute(range.min, range.max);
+
+ AngleAttribute angle = field.GetAttribute<AngleAttribute>();
+
+ object result;
+ if (DrawFloatingNumber(new GUIContent(""), field.GetValues(), rangeValue, angle, style, out result))
+ field.SetValue(result);
+ }
+
+ public static bool DrawFloat(string label, float[] values, out float result, params GUILayoutOption[] options)
+ {
+ return DrawFloat(label, values, null, null, null, out result, options);
+ }
+
+ public static bool DrawFloat(string label, float[] values, GUIStyle style, out float result, params GUILayoutOption[] options)
+ {
+ return DrawFloat(label, values, null, null, style, out result, options);
+ }
+
+ public static bool DrawFloat(string label, float[] values, RangeValueAttribute range, AngleAttribute angle, GUIStyle style, out float result, params GUILayoutOption[] options)
+ {
+ object genericResult;
+ object[] genericValues = new object[values.Length];
+ for (int i = 0; i < values.Length; i++)
+ genericValues[i] = values[i];
+
+ bool changed = DrawFloatingNumber(new GUIContent(label), genericValues, range, angle, style, out genericResult, options);
+
+ try
+ {
+ result = (float)genericResult;
+ }
+ catch (Exception)
+ {
+ result = values[0];
+ return false;
+ }
+
+ return changed;
+ }
+
+ public static bool DrawFloatingNumber(GUIContent label, object[] values, RangeValueAttribute range, AngleAttribute angle, GUIStyle style, out object result, params GUILayoutOption[] options)
+ {
+ result = 0;
+
+ EditorGUI.showMixedValue = false;
+ result = values[0];
+ Type type = result.GetType();
+ for (int i = 1; i < values.Length; i++)
+ {
+ if (values[i].Equals(result))
+ continue;
+
+ EditorGUI.showMixedValue = true;
+ break;
+ }
+
+ EditorGUI.BeginChangeCheck();
+ EditorGUILayout.BeginHorizontal();
+
+ if (!string.IsNullOrEmpty(label.text))
+ {
+ int size = (int)GUI.skin.label.CalcSize(label).x;
+ if (size > 4)
+ size = Mathf.Max(size, 15);
+
+ GUILayout.Label(label, GUI.skin.label, GUILayout.Width(size));
+
+ Event e = Event.current;
+ Rect labelRect = GUILayoutUtility.GetLastRect();
+ int id = EditorGUIUtility.GetControlID(FocusType.Passive, labelRect);
+
+ if (InspectorPreferences.IsDragControl(InspectorPreferences.ValueScroll))
+ {
+ if (e.type == EventType.Repaint)
+ {
+ EditorGUIUtility.AddCursorRect(labelRect, MouseCursor.ResizeHorizontal);
+ }
+ else if (e.type == EventType.MouseDown && labelRect.Contains(e.mousePosition) && e.button == 0)
+ {
+ GUIUtility.hotControl = id;
+ GUIUtility.keyboardControl = id;
+ EditorGUIUtility.SetWantsMouseJumping(1);
+ e.Use();
+ }
+ else if (e.type == EventType.MouseDrag && GUIUtility.hotControl == id)
+ {
+ double sensitivity = CalculateDragSensitivity(result);
+ result = Convert.ToDecimal(result) + (decimal)(sensitivity * HandleUtility.niceMouseDelta);
+
+ if (range != null)
+ result = Math.Min(Math.Max((double)result, (double)range.Min), (double)range.Max);
+
+ GUI.changed = true;
+ e.Use();
+ }
+ else if (e.type == EventType.MouseUp && GUIUtility.hotControl == id)
+ {
+ GUIUtility.hotControl = 0;
+ EditorGUIUtility.SetWantsMouseJumping(0);
+ e.Use();
+ }
+ }
+ }
+
+ if (angle != null)
+ {
+ if (range != null)
+ result = ExtraGUILayout.FloatAngle((float)result, angle.Snap, range.Min, range.Max);
+ else
+ result = ExtraGUILayout.FloatAngle((float)result, angle.Snap);
+ }
+ else
+ {
+ if (range != null)
+ result = EditorGUILayout.Slider((float)result, range.Min, range.Max, options);
+ else
+ {
+ if (style != null)
+ result = EditorGUILayout.TextField(result.ToString(), style, options);
+ else
+ result = EditorGUILayout.TextField(result.ToString(), options);
+ }
+ }
+
+ try
+ {
+ result = Convert.ChangeType(result, type);
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+
+ EditorGUILayout.EndHorizontal();
+ return EditorGUI.EndChangeCheck();
+ }
+ }
+} \ No newline at end of file