MultiFloatSlotControlView.cs 3.2 KB

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