| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 | using UnityEditor;using UnityEngine;using UnityEngine.UIElements;using UnityEditor.UIElements;namespace GraphProcessor{    [CustomPropertyDrawer(typeof(ExposedParameter))]    public class ExposedParameterDrawer : PropertyDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            // Create property container element.            var container = new VisualElement();            container.Add(CreateValProperty(property));            return container;        }        protected VisualElement CreateValProperty(SerializedProperty property, string displayName = null)        {            if (displayName == null)                displayName = GetNameProperty(property).stringValue;            var p = new PropertyField(GetValProperty(property), displayName);            p.RegisterValueChangeCallback(e => {                ApplyModifiedProperties(property);            });            return p;        }        protected SerializedProperty GetSettingsProperty(SerializedProperty property) => property.FindPropertyRelative(nameof(ExposedParameter.settings));        protected SerializedProperty GetValProperty(SerializedProperty property) => property.FindPropertyRelative("val");        protected SerializedProperty GetNameProperty(SerializedProperty property) => property.FindPropertyRelative(nameof(ExposedParameter.name));        protected void ApplyModifiedProperties(SerializedProperty property)        {            property.serializedObject.ApplyModifiedProperties();            property.serializedObject.Update();        }    }    [CustomPropertyDrawer(typeof(FloatParameter))]    public class FloatParameterDrawer : ExposedParameterDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            var container = new VisualElement();            var val = GetValProperty(property);            var name = GetNameProperty(property);            var settings = GetSettingsProperty(property);            var mode = settings.FindPropertyRelative(nameof(FloatParameter.FloatSettings.mode));            var min = settings.FindPropertyRelative(nameof(FloatParameter.FloatSettings.min));            var max = settings.FindPropertyRelative(nameof(FloatParameter.FloatSettings.max));            container.Add(new IMGUIContainer(() => {                float newValue;                EditorGUIUtility.labelWidth = 150;                if ((FloatParameter.FloatMode)mode.intValue == FloatParameter.FloatMode.Slider)                {                    newValue = EditorGUILayout.Slider(name.stringValue, val.floatValue, min.floatValue, max.floatValue);                    newValue = Mathf.Clamp(newValue, min.floatValue, max.floatValue);                }                else                    newValue = EditorGUILayout.FloatField(name.stringValue, val.floatValue);                if (newValue != val.floatValue)                {                    val.floatValue = newValue;                    ApplyModifiedProperties(property);                }                EditorGUIUtility.labelWidth = 0;            }));            return container;        }    }    [CustomPropertyDrawer(typeof(IntParameter))]    public class IntParameterDrawer : ExposedParameterDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            var container = new VisualElement();            var val = GetValProperty(property);            var name = GetNameProperty(property);            var settings = GetSettingsProperty(property);            var mode = settings.FindPropertyRelative(nameof(IntParameter.IntSettings.mode));            var min = settings.FindPropertyRelative(nameof(IntParameter.IntSettings.min));            var max = settings.FindPropertyRelative(nameof(IntParameter.IntSettings.max));            container.Add(new IMGUIContainer(() => {                int newValue;                EditorGUIUtility.labelWidth = 150;                if ((IntParameter.IntMode)mode.intValue == IntParameter.IntMode.Slider)                {                    newValue = EditorGUILayout.IntSlider(name.stringValue, val.intValue, min.intValue, max.intValue);                    newValue = Mathf.Clamp(newValue, min.intValue, max.intValue);                }                else                    newValue = EditorGUILayout.IntField(name.stringValue, val.intValue);                if (newValue != val.intValue)                {                    val.intValue = newValue;                    ApplyModifiedProperties(property);                }                EditorGUIUtility.labelWidth = 0;            }));            return container;        }    }    [CustomPropertyDrawer(typeof(Vector2Parameter))]    public class Vector2ParameterDrawer : ExposedParameterDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            var container = new VisualElement();            var val = GetValProperty(property);            var name = GetNameProperty(property);            var settings = GetSettingsProperty(property);            var mode = settings.FindPropertyRelative(nameof(Vector2Parameter.Vector2Settings.mode));            var min = settings.FindPropertyRelative(nameof(Vector2Parameter.Vector2Settings.min));            var max = settings.FindPropertyRelative(nameof(Vector2Parameter.Vector2Settings.max));            container.Add(new IMGUIContainer(() => {                EditorGUIUtility.labelWidth = 150;                EditorGUI.BeginChangeCheck();                if ((Vector2Parameter.Vector2Mode)mode.intValue == Vector2Parameter.Vector2Mode.MinMaxSlider)                {                    float x = val.vector2Value.x;                    float y = val.vector2Value.y;                    EditorGUILayout.MinMaxSlider(name.stringValue, ref x, ref y, min.floatValue, max.floatValue);                    val.vector2Value = new Vector2(x, y);                }                else                    val.vector2Value = EditorGUILayout.Vector2Field(name.stringValue, val.vector2Value);                if (EditorGUI.EndChangeCheck())                    ApplyModifiedProperties(property);                EditorGUIUtility.labelWidth = 0;            }));            return container;        }    }    [CustomPropertyDrawer(typeof(GradientParameter))]    public class GradientParameterDrawer : ExposedParameterDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            var name = GetNameProperty(property);            var settings = GetSettingsProperty(property);            var mode = (GradientParameter.GradientColorMode)settings.FindPropertyRelative(nameof(GradientParameter.GradientSettings.mode)).intValue;            if (mode == GradientParameter.GradientColorMode.HDR)                return new PropertyField(property.FindPropertyRelative("hdrVal"), name.stringValue);            else                return new PropertyField(property.FindPropertyRelative("val"), name.stringValue);        }    }    [CustomPropertyDrawer(typeof(ColorParameter))]    public class ColorParameterDrawer : ExposedParameterDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            var name = GetNameProperty(property);            var settings = GetSettingsProperty(property);            var val = GetValProperty(property);            var mode = (ColorParameter.ColorMode)settings.FindPropertyRelative(nameof(ColorParameter.ColorSettings.mode)).intValue;            var colorField = new ColorField(name.stringValue) { value = val.colorValue, hdr = mode == ColorParameter.ColorMode.HDR };            colorField.RegisterValueChangedCallback(e => {                val.colorValue = e.newValue;                ApplyModifiedProperties(property);            });            return colorField;        }    }    [CustomPropertyDrawer(typeof(ExposedParameter.Settings))]    public class ExposedParameterSettingsDrawer : PropertyDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty property)        {            return CreateHideInInspectorField(property);        }        protected VisualElement CreateHideInInspectorField(SerializedProperty settingsProperty)        {            var isHidden = settingsProperty.FindPropertyRelative(nameof(ExposedParameter.Settings.isHidden));            var graph = GetGraph(settingsProperty);            var param = GetParameter(settingsProperty); 			var p =  new PropertyField(isHidden, "Hide in Inspector");            p.RegisterValueChangeCallback(e => {                settingsProperty.serializedObject.ApplyModifiedProperties();                graph.NotifyExposedParameterChanged(param);            });            return p;        }        protected static BaseGraph GetGraph(SerializedProperty property) => property.serializedObject.FindProperty("graph").objectReferenceValue as BaseGraph;        protected static ExposedParameter GetParameter(SerializedProperty settingsProperty)        {            var guid = settingsProperty.FindPropertyRelative(nameof(ExposedParameter.Settings.guid)).stringValue;            return GetGraph(settingsProperty).GetExposedParameterFromGUID(guid);        }        protected static PropertyField CreateSettingsField(SerializedProperty settingsProperty, string fieldName, string displayName = null)        {            var prop = settingsProperty.FindPropertyRelative(fieldName);            var param = GetParameter(settingsProperty);             var graph = GetGraph(settingsProperty);            if (displayName == null)                displayName = ObjectNames.NicifyVariableName(fieldName);            var p =  new PropertyField(prop, displayName);            p.Bind(settingsProperty.serializedObject);            p.RegisterValueChangeCallback(e => {                settingsProperty.serializedObject.ApplyModifiedProperties();                graph.NotifyExposedParameterChanged(param);            });            return p;        }    }    [CustomPropertyDrawer(typeof(ColorParameter.ColorSettings))]    public class ExposedColorSettingsDrawer : ExposedParameterSettingsDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)        {            VisualElement settings = new VisualElement();            settings.Add(CreateHideInInspectorField(settingsProperty));            settings.Add(CreateSettingsField(settingsProperty, nameof(ColorParameter.ColorSettings.mode), "Mode"));            return settings;        }    }    [CustomPropertyDrawer(typeof(FloatParameter.FloatSettings))]    public class FloatSettingsDrawer : ExposedParameterSettingsDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)        {            VisualElement settings = new VisualElement();            settings.Bind(settingsProperty.serializedObject);            settings.Add(CreateHideInInspectorField(settingsProperty));            var mode = CreateSettingsField(settingsProperty, nameof(FloatParameter.FloatSettings.mode), "Mode");            var min = CreateSettingsField(settingsProperty, nameof(FloatParameter.FloatSettings.min), "Min");            var max = CreateSettingsField(settingsProperty, nameof(FloatParameter.FloatSettings.max), "Max");            mode.RegisterValueChangeCallback(e => UpdateVisibility(e.changedProperty));            UpdateVisibility(settingsProperty.FindPropertyRelative(nameof(FloatParameter.FloatSettings.mode)));            void UpdateVisibility(SerializedProperty property)            {                if (property == null)                    return;                var newValue = (FloatParameter.FloatMode)property.intValue;                if (newValue == FloatParameter.FloatMode.Slider)                    min.style.display = max.style.display = DisplayStyle.Flex;                else                    min.style.display = max.style.display = DisplayStyle.None;            }            settings.Add(mode);            settings.Add(min);            settings.Add(max);            return settings;        }    }    [CustomPropertyDrawer(typeof(IntParameter.IntSettings))]    public class IntSettingsDrawer : ExposedParameterSettingsDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)        {            VisualElement settings = new VisualElement();            settings.Bind(settingsProperty.serializedObject);            settings.Add(CreateHideInInspectorField(settingsProperty));            var mode = CreateSettingsField(settingsProperty, nameof(IntParameter.IntSettings.mode), "Mode");            var min = CreateSettingsField(settingsProperty, nameof(IntParameter.IntSettings.min), "Min");            var max = CreateSettingsField(settingsProperty, nameof(IntParameter.IntSettings.max), "Max");            mode.RegisterValueChangeCallback(e => UpdateVisibility(e.changedProperty));            UpdateVisibility(settingsProperty.FindPropertyRelative(nameof(IntParameter.IntSettings.mode)));            void UpdateVisibility(SerializedProperty property)            {                if (property == null)                    return;                var newValue = (IntParameter.IntMode)property.intValue;                if (newValue == IntParameter.IntMode.Slider)                    min.style.display = max.style.display = DisplayStyle.Flex;                else                    min.style.display = max.style.display = DisplayStyle.None;            }            settings.Add(mode);            settings.Add(min);            settings.Add(max);            return settings;        }    }    [CustomPropertyDrawer(typeof(Vector2Parameter.Vector2Settings))]    public class Vector2SettingsDrawer : ExposedParameterSettingsDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)        {            VisualElement settings = new VisualElement();            settings.Add(CreateHideInInspectorField(settingsProperty));            settings.Add(CreateSettingsField(settingsProperty, nameof(Vector2Parameter.Vector2Settings.mode), "Mode"));            settings.Add(CreateSettingsField(settingsProperty, nameof(Vector2Parameter.Vector2Settings.min), "Min"));            settings.Add(CreateSettingsField(settingsProperty, nameof(Vector2Parameter.Vector2Settings.max), "Max"));            return settings;        }    }    [CustomPropertyDrawer(typeof(GradientParameter.GradientSettings))]    public class GradientSettingsDrawer : ExposedParameterSettingsDrawer    {        public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)        {            VisualElement settings = new VisualElement();            settings.Add(CreateHideInInspectorField(settingsProperty));            settings.Add(CreateSettingsField(settingsProperty, nameof(GradientParameter.GradientSettings.mode), "Mode"));            return settings;        }    }}
 |