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