暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MultiIntegerSlotControlView.cs 3.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 MultiIntegerSlotControlView : 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 MultiIntegerSlotControlView(AbstractMaterialNode node, string[] labels, Func<Vector4> get, Action<Vector4> set)
  16. {
  17. styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/MultiIntegerSlotControlView"));
  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 IntegerField { userData = index, value = (int)initialValue[index] };
  32. var dragger = new FieldMouseDragger<int>(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. }, TrickleDown.TrickleDown);
  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 & update title
  71. field.Q("unity-text-input").RegisterCallback<FocusOutEvent>(evt =>
  72. {
  73. m_Node.owner.owner.isDirty = true;
  74. m_UndoGroup = -1;
  75. }, TrickleDown.TrickleDown);
  76. Add(field);
  77. }
  78. }
  79. }