RelayNodeView.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using UnityEngine;
  2. using UnityEngine.UIElements;
  3. using GraphProcessor;
  4. using UnityEditor;
  5. using System.Linq;
  6. using System;
  7. using UnityEditor.Experimental.GraphView;
  8. [NodeCustomEditor(typeof(RelayNode))]
  9. public class RelayNodeView : BaseNodeView
  10. {
  11. RelayNode relay => nodeTarget as RelayNode;
  12. VisualElement input => this.Q("input");
  13. VisualElement output => this.Q("output");
  14. public override void Enable()
  15. {
  16. // Remove useless elements
  17. this.Q("title").RemoveFromHierarchy();
  18. this.Q("divider").RemoveFromHierarchy();
  19. relay.onPortsUpdated += _ => UpdateSize();
  20. }
  21. public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
  22. {
  23. // TODO: check if there is a relay node in the inputs that have pack option and toggle visibility of these options:
  24. evt.menu.AppendAction("Pack Input", TogglePackInput, PackInputStatus);
  25. evt.menu.AppendAction("Unpack Output", ToggleUnpackOutput, UnpackOutputStatus);
  26. base.BuildContextualMenu(evt);
  27. }
  28. void TogglePackInput(DropdownMenuAction action)
  29. {
  30. relay.packInput = !relay.packInput;
  31. ForceUpdatePorts();
  32. UpdateSize();
  33. MarkDirtyRepaint();
  34. }
  35. void ToggleUnpackOutput(DropdownMenuAction action)
  36. {
  37. relay.unpackOutput = !relay.unpackOutput;
  38. ForceUpdatePorts();
  39. UpdateSize();
  40. MarkDirtyRepaint();
  41. }
  42. DropdownMenuAction.Status PackInputStatus(DropdownMenuAction action)
  43. {
  44. if (relay.GetNonRelayEdges().Count != 1)
  45. return DropdownMenuAction.Status.Disabled;
  46. if (relay.packInput)
  47. return DropdownMenuAction.Status.Checked;
  48. else
  49. return DropdownMenuAction.Status.Normal;
  50. }
  51. DropdownMenuAction.Status UnpackOutputStatus(DropdownMenuAction action)
  52. {
  53. if (relay.GetNonRelayEdges().Count == 0)
  54. return DropdownMenuAction.Status.Disabled;
  55. if (relay.unpackOutput)
  56. return DropdownMenuAction.Status.Checked;
  57. else
  58. return DropdownMenuAction.Status.Normal;
  59. }
  60. public override void SetPosition(Rect newPos)
  61. {
  62. base.SetPosition(new Rect(newPos.position, new Vector2(200, 200)));
  63. UpdateSize();
  64. }
  65. void UpdateSize()
  66. {
  67. if (relay.unpackOutput)
  68. {
  69. int inputEdgeCount = relay.GetNonRelayEdges().Count + 1;
  70. style.height = Mathf.Max(30, 24 * inputEdgeCount + 5);
  71. style.width = -1;
  72. if (input != null)
  73. input.style.height = -1;
  74. if (output != null)
  75. output.style.height = -1;
  76. RemoveFromClassList("hideLabels");
  77. }
  78. else
  79. {
  80. style.height = 20;
  81. style.width = 50;
  82. if (input != null)
  83. input.style.height = 16;
  84. if (output != null)
  85. output.style.height = 16;
  86. AddToClassList("hideLabels");
  87. }
  88. }
  89. public override void OnRemoved()
  90. {
  91. // We delay the connection of the edges just in case something happens to the nodes we are trying to connect
  92. // i.e. multiple relay node deletion
  93. schedule.Execute(() => {
  94. if (!relay.unpackOutput)
  95. {
  96. var inputEdges = inputPortViews[0].GetEdges();
  97. var outputEdges = outputPortViews[0].GetEdges();
  98. if (inputEdges.Count == 0 || outputEdges.Count == 0)
  99. return;
  100. var inputEdge = inputEdges.First();
  101. foreach (var outputEdge in outputEdges.ToList())
  102. {
  103. var input = outputEdge.input as PortView;
  104. var output = inputEdge.output as PortView;
  105. owner.Connect(input, output);
  106. }
  107. }
  108. }).ExecuteLater(1);
  109. }
  110. }