123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- using UnityEngine;
- using UnityEngine.UIElements;
- using GraphProcessor;
- using UnityEditor;
- using System.Linq;
- using System;
- using UnityEditor.Experimental.GraphView;
- [NodeCustomEditor(typeof(RelayNode))]
- public class RelayNodeView : BaseNodeView
- {
- RelayNode relay => nodeTarget as RelayNode;
- VisualElement input => this.Q("input");
- VisualElement output => this.Q("output");
- public override void Enable()
- {
- // Remove useless elements
- this.Q("title").RemoveFromHierarchy();
- this.Q("divider").RemoveFromHierarchy();
- relay.onPortsUpdated += _ => UpdateSize();
- }
- public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
- {
- // TODO: check if there is a relay node in the inputs that have pack option and toggle visibility of these options:
- evt.menu.AppendAction("Pack Input", TogglePackInput, PackInputStatus);
- evt.menu.AppendAction("Unpack Output", ToggleUnpackOutput, UnpackOutputStatus);
- base.BuildContextualMenu(evt);
- }
- void TogglePackInput(DropdownMenuAction action)
- {
- relay.packInput = !relay.packInput;
- ForceUpdatePorts();
- UpdateSize();
- MarkDirtyRepaint();
- }
- void ToggleUnpackOutput(DropdownMenuAction action)
- {
- relay.unpackOutput = !relay.unpackOutput;
- ForceUpdatePorts();
- UpdateSize();
- MarkDirtyRepaint();
- }
- DropdownMenuAction.Status PackInputStatus(DropdownMenuAction action)
- {
- if (relay.GetNonRelayEdges().Count != 1)
- return DropdownMenuAction.Status.Disabled;
- if (relay.packInput)
- return DropdownMenuAction.Status.Checked;
- else
- return DropdownMenuAction.Status.Normal;
- }
- DropdownMenuAction.Status UnpackOutputStatus(DropdownMenuAction action)
- {
- if (relay.GetNonRelayEdges().Count == 0)
- return DropdownMenuAction.Status.Disabled;
- if (relay.unpackOutput)
- return DropdownMenuAction.Status.Checked;
- else
- return DropdownMenuAction.Status.Normal;
- }
- public override void SetPosition(Rect newPos)
- {
- base.SetPosition(new Rect(newPos.position, new Vector2(200, 200)));
- UpdateSize();
- }
- void UpdateSize()
- {
- if (relay.unpackOutput)
- {
- int inputEdgeCount = relay.GetNonRelayEdges().Count + 1;
- style.height = Mathf.Max(30, 24 * inputEdgeCount + 5);
- style.width = -1;
- if (input != null)
- input.style.height = -1;
- if (output != null)
- output.style.height = -1;
- RemoveFromClassList("hideLabels");
- }
- else
- {
- style.height = 20;
- style.width = 50;
- if (input != null)
- input.style.height = 16;
- if (output != null)
- output.style.height = 16;
- AddToClassList("hideLabels");
- }
- }
- public override void OnRemoved()
- {
- // We delay the connection of the edges just in case something happens to the nodes we are trying to connect
- // i.e. multiple relay node deletion
- schedule.Execute(() => {
- if (!relay.unpackOutput)
- {
- var inputEdges = inputPortViews[0].GetEdges();
- var outputEdges = outputPortViews[0].GetEdges();
- if (inputEdges.Count == 0 || outputEdges.Count == 0)
- return;
- var inputEdge = inputEdges.First();
- foreach (var outputEdge in outputEdges.ToList())
- {
- var input = outputEdge.input as PortView;
- var output = inputEdge.output as PortView;
- owner.Connect(input, output);
- }
- }
- }).ExecuteLater(1);
- }
- }
|