A game about forced loneliness, made by TACStudios
1using System;
2using System.Linq;
3using System.Reflection;
4using UnityEditor.UIElements;
5using UnityEngine;
6using UnityEngine.UIElements;
7
8namespace UnityEditor.ShaderGraph.Drawing.Controls
9{
10 interface IEnumConversion
11 {
12 Enum from { get; set; }
13 Enum to { get; set; }
14 }
15
16 [AttributeUsage(AttributeTargets.Property)]
17 class EnumConversionControlAttribute : Attribute, IControlAttribute
18 {
19 public VisualElement InstantiateControl(AbstractMaterialNode node, PropertyInfo propertyInfo)
20 {
21 return new EnumConversionControlView(node, propertyInfo);
22 }
23 }
24
25 class EnumConversionControlView : VisualElement
26 {
27 AbstractMaterialNode m_Node;
28 PropertyInfo m_PropertyInfo;
29
30 IEnumConversion value
31 {
32 get { return (IEnumConversion)m_PropertyInfo.GetValue(m_Node, null); }
33 set { m_PropertyInfo.SetValue(m_Node, value, null); }
34 }
35
36 public EnumConversionControlView(AbstractMaterialNode node, PropertyInfo propertyInfo)
37 {
38 if (!propertyInfo.PropertyType.GetInterfaces().Any(t => t == typeof(IEnumConversion)))
39 throw new ArgumentException("Property type must implement IEnumConversion.");
40
41 m_Node = node;
42 m_PropertyInfo = propertyInfo;
43 styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/EnumConversionControlView"));
44 var currentValue = value;
45
46 var ec = (IEnumConversion)propertyInfo.GetValue(m_Node, null);
47 propertyInfo.SetValue(m_Node, ec, null);
48
49 var fromField = new EnumField(currentValue.from);
50 fromField.RegisterValueChangedCallback(OnFromChanged);
51 Add(fromField);
52
53 var arrowLabel = new Label("➔");
54 Add(arrowLabel);
55
56 var toField = new EnumField(currentValue.to);
57 toField.RegisterValueChangedCallback(OnToChanged);
58 Add(toField);
59 }
60
61 void OnFromChanged(ChangeEvent<Enum> evt)
62 {
63 var currentValue = value;
64 if (!Equals(currentValue.from, evt.newValue))
65 {
66 m_Node.owner.owner.RegisterCompleteObjectUndo("Change Colorspace From");
67 currentValue.from = evt.newValue;
68 value = currentValue;
69 }
70 }
71
72 void OnToChanged(ChangeEvent<Enum> evt)
73 {
74 var currentValue = value;
75 if (!Equals(currentValue.to, evt.newValue))
76 {
77 m_Node.owner.owner.RegisterCompleteObjectUndo("Change Colorspace To");
78 currentValue.to = evt.newValue;
79 value = currentValue;
80 }
81 }
82 }
83}