ExposedParameterDrawer.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using UnityEditor;
  2. using UnityEngine;
  3. using UnityEngine.UIElements;
  4. using UnityEditor.UIElements;
  5. namespace GraphProcessor
  6. {
  7. [CustomPropertyDrawer(typeof(ExposedParameter))]
  8. public class ExposedParameterDrawer : PropertyDrawer
  9. {
  10. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  11. {
  12. // Create property container element.
  13. var container = new VisualElement();
  14. container.Add(CreateValProperty(property));
  15. return container;
  16. }
  17. protected VisualElement CreateValProperty(SerializedProperty property, string displayName = null)
  18. {
  19. if (displayName == null)
  20. displayName = GetNameProperty(property).stringValue;
  21. var p = new PropertyField(GetValProperty(property), displayName);
  22. p.RegisterValueChangeCallback(e => {
  23. ApplyModifiedProperties(property);
  24. });
  25. return p;
  26. }
  27. protected SerializedProperty GetSettingsProperty(SerializedProperty property) => property.FindPropertyRelative(nameof(ExposedParameter.settings));
  28. protected SerializedProperty GetValProperty(SerializedProperty property) => property.FindPropertyRelative("val");
  29. protected SerializedProperty GetNameProperty(SerializedProperty property) => property.FindPropertyRelative(nameof(ExposedParameter.name));
  30. protected void ApplyModifiedProperties(SerializedProperty property)
  31. {
  32. property.serializedObject.ApplyModifiedProperties();
  33. property.serializedObject.Update();
  34. }
  35. }
  36. [CustomPropertyDrawer(typeof(FloatParameter))]
  37. public class FloatParameterDrawer : ExposedParameterDrawer
  38. {
  39. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  40. {
  41. var container = new VisualElement();
  42. var val = GetValProperty(property);
  43. var name = GetNameProperty(property);
  44. var settings = GetSettingsProperty(property);
  45. var mode = settings.FindPropertyRelative(nameof(FloatParameter.FloatSettings.mode));
  46. var min = settings.FindPropertyRelative(nameof(FloatParameter.FloatSettings.min));
  47. var max = settings.FindPropertyRelative(nameof(FloatParameter.FloatSettings.max));
  48. container.Add(new IMGUIContainer(() => {
  49. float newValue;
  50. EditorGUIUtility.labelWidth = 150;
  51. if ((FloatParameter.FloatMode)mode.intValue == FloatParameter.FloatMode.Slider)
  52. {
  53. newValue = EditorGUILayout.Slider(name.stringValue, val.floatValue, min.floatValue, max.floatValue);
  54. newValue = Mathf.Clamp(newValue, min.floatValue, max.floatValue);
  55. }
  56. else
  57. newValue = EditorGUILayout.FloatField(name.stringValue, val.floatValue);
  58. if (newValue != val.floatValue)
  59. {
  60. val.floatValue = newValue;
  61. ApplyModifiedProperties(property);
  62. }
  63. EditorGUIUtility.labelWidth = 0;
  64. }));
  65. return container;
  66. }
  67. }
  68. [CustomPropertyDrawer(typeof(IntParameter))]
  69. public class IntParameterDrawer : ExposedParameterDrawer
  70. {
  71. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  72. {
  73. var container = new VisualElement();
  74. var val = GetValProperty(property);
  75. var name = GetNameProperty(property);
  76. var settings = GetSettingsProperty(property);
  77. var mode = settings.FindPropertyRelative(nameof(IntParameter.IntSettings.mode));
  78. var min = settings.FindPropertyRelative(nameof(IntParameter.IntSettings.min));
  79. var max = settings.FindPropertyRelative(nameof(IntParameter.IntSettings.max));
  80. container.Add(new IMGUIContainer(() => {
  81. int newValue;
  82. EditorGUIUtility.labelWidth = 150;
  83. if ((IntParameter.IntMode)mode.intValue == IntParameter.IntMode.Slider)
  84. {
  85. newValue = EditorGUILayout.IntSlider(name.stringValue, val.intValue, min.intValue, max.intValue);
  86. newValue = Mathf.Clamp(newValue, min.intValue, max.intValue);
  87. }
  88. else
  89. newValue = EditorGUILayout.IntField(name.stringValue, val.intValue);
  90. if (newValue != val.intValue)
  91. {
  92. val.intValue = newValue;
  93. ApplyModifiedProperties(property);
  94. }
  95. EditorGUIUtility.labelWidth = 0;
  96. }));
  97. return container;
  98. }
  99. }
  100. [CustomPropertyDrawer(typeof(Vector2Parameter))]
  101. public class Vector2ParameterDrawer : ExposedParameterDrawer
  102. {
  103. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  104. {
  105. var container = new VisualElement();
  106. var val = GetValProperty(property);
  107. var name = GetNameProperty(property);
  108. var settings = GetSettingsProperty(property);
  109. var mode = settings.FindPropertyRelative(nameof(Vector2Parameter.Vector2Settings.mode));
  110. var min = settings.FindPropertyRelative(nameof(Vector2Parameter.Vector2Settings.min));
  111. var max = settings.FindPropertyRelative(nameof(Vector2Parameter.Vector2Settings.max));
  112. container.Add(new IMGUIContainer(() => {
  113. EditorGUIUtility.labelWidth = 150;
  114. EditorGUI.BeginChangeCheck();
  115. if ((Vector2Parameter.Vector2Mode)mode.intValue == Vector2Parameter.Vector2Mode.MinMaxSlider)
  116. {
  117. float x = val.vector2Value.x;
  118. float y = val.vector2Value.y;
  119. EditorGUILayout.MinMaxSlider(name.stringValue, ref x, ref y, min.floatValue, max.floatValue);
  120. val.vector2Value = new Vector2(x, y);
  121. }
  122. else
  123. val.vector2Value = EditorGUILayout.Vector2Field(name.stringValue, val.vector2Value);
  124. if (EditorGUI.EndChangeCheck())
  125. ApplyModifiedProperties(property);
  126. EditorGUIUtility.labelWidth = 0;
  127. }));
  128. return container;
  129. }
  130. }
  131. [CustomPropertyDrawer(typeof(GradientParameter))]
  132. public class GradientParameterDrawer : ExposedParameterDrawer
  133. {
  134. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  135. {
  136. var name = GetNameProperty(property);
  137. var settings = GetSettingsProperty(property);
  138. var mode = (GradientParameter.GradientColorMode)settings.FindPropertyRelative(nameof(GradientParameter.GradientSettings.mode)).intValue;
  139. if (mode == GradientParameter.GradientColorMode.HDR)
  140. return new PropertyField(property.FindPropertyRelative("hdrVal"), name.stringValue);
  141. else
  142. return new PropertyField(property.FindPropertyRelative("val"), name.stringValue);
  143. }
  144. }
  145. [CustomPropertyDrawer(typeof(ColorParameter))]
  146. public class ColorParameterDrawer : ExposedParameterDrawer
  147. {
  148. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  149. {
  150. var name = GetNameProperty(property);
  151. var settings = GetSettingsProperty(property);
  152. var val = GetValProperty(property);
  153. var mode = (ColorParameter.ColorMode)settings.FindPropertyRelative(nameof(ColorParameter.ColorSettings.mode)).intValue;
  154. var colorField = new ColorField(name.stringValue) { value = val.colorValue, hdr = mode == ColorParameter.ColorMode.HDR };
  155. colorField.RegisterValueChangedCallback(e => {
  156. val.colorValue = e.newValue;
  157. ApplyModifiedProperties(property);
  158. });
  159. return colorField;
  160. }
  161. }
  162. [CustomPropertyDrawer(typeof(ExposedParameter.Settings))]
  163. public class ExposedParameterSettingsDrawer : PropertyDrawer
  164. {
  165. public override VisualElement CreatePropertyGUI(SerializedProperty property)
  166. {
  167. return CreateHideInInspectorField(property);
  168. }
  169. protected VisualElement CreateHideInInspectorField(SerializedProperty settingsProperty)
  170. {
  171. var isHidden = settingsProperty.FindPropertyRelative(nameof(ExposedParameter.Settings.isHidden));
  172. var graph = GetGraph(settingsProperty);
  173. var param = GetParameter(settingsProperty);
  174. var p = new PropertyField(isHidden, "Hide in Inspector");
  175. p.RegisterValueChangeCallback(e => {
  176. settingsProperty.serializedObject.ApplyModifiedProperties();
  177. graph.NotifyExposedParameterChanged(param);
  178. });
  179. return p;
  180. }
  181. protected static BaseGraph GetGraph(SerializedProperty property) => property.serializedObject.FindProperty("graph").objectReferenceValue as BaseGraph;
  182. protected static ExposedParameter GetParameter(SerializedProperty settingsProperty)
  183. {
  184. var guid = settingsProperty.FindPropertyRelative(nameof(ExposedParameter.Settings.guid)).stringValue;
  185. return GetGraph(settingsProperty).GetExposedParameterFromGUID(guid);
  186. }
  187. protected static PropertyField CreateSettingsField(SerializedProperty settingsProperty, string fieldName, string displayName = null)
  188. {
  189. var prop = settingsProperty.FindPropertyRelative(fieldName);
  190. var param = GetParameter(settingsProperty);
  191. var graph = GetGraph(settingsProperty);
  192. if (displayName == null)
  193. displayName = ObjectNames.NicifyVariableName(fieldName);
  194. var p = new PropertyField(prop, displayName);
  195. p.Bind(settingsProperty.serializedObject);
  196. p.RegisterValueChangeCallback(e => {
  197. settingsProperty.serializedObject.ApplyModifiedProperties();
  198. graph.NotifyExposedParameterChanged(param);
  199. });
  200. return p;
  201. }
  202. }
  203. [CustomPropertyDrawer(typeof(ColorParameter.ColorSettings))]
  204. public class ExposedColorSettingsDrawer : ExposedParameterSettingsDrawer
  205. {
  206. public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)
  207. {
  208. VisualElement settings = new VisualElement();
  209. settings.Add(CreateHideInInspectorField(settingsProperty));
  210. settings.Add(CreateSettingsField(settingsProperty, nameof(ColorParameter.ColorSettings.mode), "Mode"));
  211. return settings;
  212. }
  213. }
  214. [CustomPropertyDrawer(typeof(FloatParameter.FloatSettings))]
  215. public class FloatSettingsDrawer : ExposedParameterSettingsDrawer
  216. {
  217. public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)
  218. {
  219. VisualElement settings = new VisualElement();
  220. settings.Bind(settingsProperty.serializedObject);
  221. settings.Add(CreateHideInInspectorField(settingsProperty));
  222. var mode = CreateSettingsField(settingsProperty, nameof(FloatParameter.FloatSettings.mode), "Mode");
  223. var min = CreateSettingsField(settingsProperty, nameof(FloatParameter.FloatSettings.min), "Min");
  224. var max = CreateSettingsField(settingsProperty, nameof(FloatParameter.FloatSettings.max), "Max");
  225. mode.RegisterValueChangeCallback(e => UpdateVisibility(e.changedProperty));
  226. UpdateVisibility(settingsProperty.FindPropertyRelative(nameof(FloatParameter.FloatSettings.mode)));
  227. void UpdateVisibility(SerializedProperty property)
  228. {
  229. if (property == null)
  230. return;
  231. var newValue = (FloatParameter.FloatMode)property.intValue;
  232. if (newValue == FloatParameter.FloatMode.Slider)
  233. min.style.display = max.style.display = DisplayStyle.Flex;
  234. else
  235. min.style.display = max.style.display = DisplayStyle.None;
  236. }
  237. settings.Add(mode);
  238. settings.Add(min);
  239. settings.Add(max);
  240. return settings;
  241. }
  242. }
  243. [CustomPropertyDrawer(typeof(IntParameter.IntSettings))]
  244. public class IntSettingsDrawer : ExposedParameterSettingsDrawer
  245. {
  246. public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)
  247. {
  248. VisualElement settings = new VisualElement();
  249. settings.Bind(settingsProperty.serializedObject);
  250. settings.Add(CreateHideInInspectorField(settingsProperty));
  251. var mode = CreateSettingsField(settingsProperty, nameof(IntParameter.IntSettings.mode), "Mode");
  252. var min = CreateSettingsField(settingsProperty, nameof(IntParameter.IntSettings.min), "Min");
  253. var max = CreateSettingsField(settingsProperty, nameof(IntParameter.IntSettings.max), "Max");
  254. mode.RegisterValueChangeCallback(e => UpdateVisibility(e.changedProperty));
  255. UpdateVisibility(settingsProperty.FindPropertyRelative(nameof(IntParameter.IntSettings.mode)));
  256. void UpdateVisibility(SerializedProperty property)
  257. {
  258. if (property == null)
  259. return;
  260. var newValue = (IntParameter.IntMode)property.intValue;
  261. if (newValue == IntParameter.IntMode.Slider)
  262. min.style.display = max.style.display = DisplayStyle.Flex;
  263. else
  264. min.style.display = max.style.display = DisplayStyle.None;
  265. }
  266. settings.Add(mode);
  267. settings.Add(min);
  268. settings.Add(max);
  269. return settings;
  270. }
  271. }
  272. [CustomPropertyDrawer(typeof(Vector2Parameter.Vector2Settings))]
  273. public class Vector2SettingsDrawer : ExposedParameterSettingsDrawer
  274. {
  275. public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)
  276. {
  277. VisualElement settings = new VisualElement();
  278. settings.Add(CreateHideInInspectorField(settingsProperty));
  279. settings.Add(CreateSettingsField(settingsProperty, nameof(Vector2Parameter.Vector2Settings.mode), "Mode"));
  280. settings.Add(CreateSettingsField(settingsProperty, nameof(Vector2Parameter.Vector2Settings.min), "Min"));
  281. settings.Add(CreateSettingsField(settingsProperty, nameof(Vector2Parameter.Vector2Settings.max), "Max"));
  282. return settings;
  283. }
  284. }
  285. [CustomPropertyDrawer(typeof(GradientParameter.GradientSettings))]
  286. public class GradientSettingsDrawer : ExposedParameterSettingsDrawer
  287. {
  288. public override VisualElement CreatePropertyGUI(SerializedProperty settingsProperty)
  289. {
  290. VisualElement settings = new VisualElement();
  291. settings.Add(CreateHideInInspectorField(settingsProperty));
  292. settings.Add(CreateSettingsField(settingsProperty, nameof(GradientParameter.GradientSettings.mode), "Mode"));
  293. return settings;
  294. }
  295. }
  296. }