A game about forced loneliness, made by TACStudios
at master 2.7 kB view raw
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}