| 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);	}}
 |