A game about forced loneliness, made by TACStudios
1using System;
2using System.Globalization;
3using UnityEditor.Graphing;
4using UnityEngine;
5
6using UnityEngine.UIElements;
7
8namespace UnityEditor.ShaderGraph.Drawing.Slots
9{
10 class MultiFloatSlotControlView : VisualElement
11 {
12 readonly AbstractMaterialNode m_Node;
13 readonly Func<Vector4> m_Get;
14 readonly Action<Vector4> m_Set;
15 int m_UndoGroup = -1;
16
17 public MultiFloatSlotControlView(AbstractMaterialNode node, string[] labels, Func<Vector4> get, Action<Vector4> set)
18 {
19 styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/MultiFloatSlotControlView"));
20 m_Node = node;
21 m_Get = get;
22 m_Set = set;
23 var initialValue = get();
24 for (var i = 0; i < labels.Length; i++)
25 AddField(initialValue, i, labels[i]);
26 }
27
28 void AddField(Vector4 initialValue, int index, string subLabel)
29 {
30 var dummy = new VisualElement { name = "dummy" };
31 var label = new Label(subLabel);
32 dummy.Add(label);
33 Add(dummy);
34 var field = new FloatField { userData = index, value = initialValue[index] };
35 var dragger = new FieldMouseDragger<double>(field);
36 dragger.SetDragZone(label);
37 field.Q("unity-text-input").RegisterCallback<KeyDownEvent>(evt =>
38 {
39 // Record Undo for input field edit
40 if (m_UndoGroup == -1)
41 {
42 m_UndoGroup = Undo.GetCurrentGroup();
43 m_Node.owner.owner.RegisterCompleteObjectUndo("Change " + m_Node.name);
44 }
45 // Handle scaping input field edit
46 if (evt.keyCode == KeyCode.Escape && m_UndoGroup > -1)
47 {
48 Undo.RevertAllDownToGroup(m_UndoGroup);
49 m_UndoGroup = -1;
50 evt.StopPropagation();
51 }
52 // Dont record Undo again until input field is unfocused
53 m_UndoGroup++;
54 this.MarkDirtyRepaint();
55 }, TrickleDown.TrickleDown);
56 // Called after KeyDownEvent
57 field.RegisterValueChangedCallback(evt =>
58 {
59 // Only true when setting value via FieldMouseDragger
60 // Undo recorded once per dragger release
61 if (m_UndoGroup == -1)
62 {
63 m_Node.owner.owner.RegisterCompleteObjectUndo("Change " + m_Node.name);
64 }
65 var value = m_Get();
66 if (value[index] != (float)evt.newValue)
67 {
68 value[index] = (float)evt.newValue;
69 m_Set(value);
70 m_Node.Dirty(ModificationScope.Node);
71 }
72 });
73 // Reset UndoGroup when done editing input field & update title
74 field.Q("unity-text-input").RegisterCallback<FocusOutEvent>(evt =>
75 {
76 m_Node.owner.owner.isDirty = true;
77 m_UndoGroup = -1;
78 }, TrickleDown.TrickleDown);
79 Add(field);
80 }
81 }
82}