A game about forced loneliness, made by TACStudios
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}