A game about forced loneliness, made by TACStudios
at master 3.4 kB view raw
1using System; 2using System.Collections.Generic; 3using System.Reflection; 4using UnityEngine; 5using UnityEditor.Graphing; 6 7using UnityEditor.UIElements; 8using UnityEngine.UIElements; 9 10namespace UnityEditor.ShaderGraph.Drawing.Controls 11{ 12 [AttributeUsage(AttributeTargets.Property)] 13 class ChannelEnumControlAttribute : Attribute, IControlAttribute 14 { 15 string m_Label; 16 int m_SlotId; 17 18 public ChannelEnumControlAttribute(string label = null, int slotId = 0) 19 { 20 m_Label = label; 21 m_SlotId = slotId; 22 } 23 24 public VisualElement InstantiateControl(AbstractMaterialNode node, PropertyInfo propertyInfo) 25 { 26 return new ChannelEnumControlView(m_Label, m_SlotId, node, propertyInfo); 27 } 28 } 29 30 class ChannelEnumControlView : VisualElement, AbstractMaterialNodeModificationListener 31 { 32 AbstractMaterialNode m_Node; 33 PropertyInfo m_PropertyInfo; 34 int m_SlotId; 35 36 PopupField<string> m_PopupField; 37 string[] m_ValueNames; 38 39 int m_PreviousChannelCount = -1; 40 41 public ChannelEnumControlView(string label, int slotId, AbstractMaterialNode node, PropertyInfo propertyInfo) 42 { 43 styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/ChannelEnumControlView")); 44 m_Node = node; 45 m_PropertyInfo = propertyInfo; 46 m_SlotId = slotId; 47 if (!propertyInfo.PropertyType.IsEnum) 48 throw new ArgumentException("Property must be an enum.", "propertyInfo"); 49 Add(new Label(label ?? ObjectNames.NicifyVariableName(propertyInfo.Name))); 50 51 var value = (Enum)m_PropertyInfo.GetValue(m_Node, null); 52 m_ValueNames = Enum.GetNames(value.GetType()); 53 54 CreatePopup(); 55 } 56 57 void OnValueChanged(ChangeEvent<string> evt) 58 { 59 var index = m_PopupField.index; 60 var value = (int)m_PropertyInfo.GetValue(m_Node, null); 61 if (!index.Equals(value)) 62 { 63 m_Node.owner.owner.RegisterCompleteObjectUndo("Change " + m_Node.name); 64 m_PropertyInfo.SetValue(m_Node, index, null); 65 } 66 67 CreatePopup(); 68 } 69 70 public void OnNodeModified(ModificationScope scope) 71 { 72 if (scope == ModificationScope.Node) 73 { 74 CreatePopup(); 75 m_PopupField.MarkDirtyRepaint(); 76 } 77 } 78 79 void CreatePopup() 80 { 81 int channelCount = SlotValueHelper.GetChannelCount(m_Node.FindSlot<MaterialSlot>(m_SlotId).concreteValueType); 82 83 if (m_PopupField != null) 84 { 85 if (channelCount == m_PreviousChannelCount) 86 return; 87 88 Remove(m_PopupField); 89 } 90 91 m_PreviousChannelCount = channelCount; 92 List<string> popupEntries = new List<string>(); 93 for (int i = 0; i < channelCount; i++) 94 popupEntries.Add(m_ValueNames[i]); 95 96 var value = (int)m_PropertyInfo.GetValue(m_Node, null); 97 if (value >= channelCount) 98 value = 0; 99 100 m_PopupField = new PopupField<string>(popupEntries, value); 101 m_PopupField.RegisterValueChangedCallback(OnValueChanged); 102 Add(m_PopupField); 103 } 104 } 105}