summaryrefslogtreecommitdiff
path: root/Assets/Plugins/Editor/AdvancedInspector/FieldEditors/RangeEditor.cs
blob: 0f540c19f92569290b69c3555cdefa78807b6bbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;

namespace AdvancedInspector
{
    public class RangeIntEditor : FieldEditor
    {
        public override Type[] EditedTypes
        {
            get { return new Type[] { typeof(RangeInt) }; }
        }

        public override void Draw(InspectorField field, GUIStyle style)
        {
            RangeValueAttribute range = field.GetAttribute<RangeValueAttribute>();
            if (range == null)
                return;

            EditorGUILayout.BeginHorizontal();

            RangeInt[] ranges = field.GetValues<RangeInt>();

            int[] mins = new int[ranges.Length];
            int[] maxs = new int[ranges.Length];
            int min = ranges[0].min;
            int max = ranges[0].max;
            bool different = false;

            for (int i = 0; i < ranges.Length; i++)
            {
                mins[i] = ranges[i].min;
                maxs[i] = ranges[i].max;
                if (ranges[i].min != min || ranges[0].max != max)
                    different = true;
            }

            if (IntegerEditor.DrawInt("", mins, out min, GUILayout.Width(64)))
                for (int i = 0; i < field.Instances.Length; i++)
                    field.SetValue(field.Instances[i], new RangeInt(min, ranges[i].max));

            EditorGUI.BeginChangeCheck();
            float fMin = min;
            float fMax = max;
            EditorGUI.showMixedValue = different;
            EditorGUILayout.MinMaxSlider(ref fMin, ref fMax, range.Min, range.Max);
            if (EditorGUI.EndChangeCheck() && min < max)
                for (int i = 0; i < field.Instances.Length; i++)
                    field.SetValue(field.Instances[i], new RangeInt((int)fMin, (int)fMax));

            if (IntegerEditor.DrawInt("", maxs, out max, GUILayout.Width(64)))
                for (int i = 0; i < field.Instances.Length; i++)
                    field.SetValue(field.Instances[i], new RangeInt(ranges[i].min, max));

            EditorGUILayout.EndHorizontal();
        }
    }

    public class RangeFloatEditor : FieldEditor
    {
        public override Type[] EditedTypes
        {
            get { return new Type[] { typeof(RangeFloat) }; }
        }

        public override void Draw(InspectorField field, GUIStyle style)
        {
            RangeValueAttribute range = field.GetAttribute<RangeValueAttribute>();
            if (range == null)
                return;

            EditorGUILayout.BeginHorizontal();

            RangeFloat[] ranges = field.GetValues<RangeFloat>();

            float[] mins = new float[ranges.Length];
            float[] maxs = new float[ranges.Length];
            float min = ranges[0].min;
            float max = ranges[0].max;
            bool different = false;

            for (int i = 0; i < ranges.Length; i++)
            {
                mins[i] = ranges[i].min;
                maxs[i] = ranges[i].max;
                if (ranges[i].min != min || ranges[0].max != max)
                    different = true;
            }

            if (FloatEditor.DrawFloat("", mins, out min, GUILayout.Width(64)))
                for (int i = 0; i < field.Instances.Length; i++)
                    field.SetValue(field.Instances[i], new RangeFloat(min, ranges[i].max));

            EditorGUI.BeginChangeCheck();
            EditorGUI.showMixedValue = different;
            EditorGUILayout.MinMaxSlider(ref min, ref max, range.Min, range.Max);
            if (EditorGUI.EndChangeCheck() && min < max)
                for (int i = 0; i < field.Instances.Length; i++)
                    field.SetValue(field.Instances[i], new RangeFloat(min, max));

            if (FloatEditor.DrawFloat("", maxs, out max, GUILayout.Width(64)))
                for (int i = 0; i < field.Instances.Length; i++)
                    field.SetValue(field.Instances[i], new RangeFloat(ranges[i].min, max));

            EditorGUILayout.EndHorizontal();
        }
    }
}