summaryrefslogtreecommitdiff
path: root/Other/NodeEditorExamples/Assets/xNode-examples/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Other/NodeEditorExamples/Assets/xNode-examples/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs')
-rw-r--r--Other/NodeEditorExamples/Assets/xNode-examples/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs132
1 files changed, 132 insertions, 0 deletions
diff --git a/Other/NodeEditorExamples/Assets/xNode-examples/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs b/Other/NodeEditorExamples/Assets/xNode-examples/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs
new file mode 100644
index 00000000..1ed72589
--- /dev/null
+++ b/Other/NodeEditorExamples/Assets/xNode-examples/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs
@@ -0,0 +1,132 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.UI;
+using XNode;
+
+namespace XNode.Examples.RuntimeMathNodes {
+ public class UGUIPort : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler {
+
+ public string fieldName;
+ [HideInInspector] public XNode.Node node;
+
+ private NodePort port;
+ private Connection tempConnection;
+ private NodePort startPort;
+ private UGUIPort tempHovered;
+ private RuntimeMathGraph graph;
+ private Vector2 startPos;
+ private List<Connection> connections = new List<Connection>();
+
+ void Start() {
+ port = node.GetPort(fieldName);
+ graph = GetComponentInParent<RuntimeMathGraph>();
+ if (port.IsOutput && port.IsConnected) {
+ for (int i = 0; i < port.ConnectionCount; i++) {
+ AddConnection();
+ }
+ }
+ }
+
+ void Reset() {
+ fieldName = name;
+ }
+
+ private void OnDestroy() {
+ // Also destroy connections
+ for (int i = connections.Count - 1; i >= 0; i--) {
+ Destroy(connections[i].gameObject);
+ }
+ connections.Clear();
+ }
+
+ public void UpdateConnectionTransforms() {
+ if (port.IsInput) return;
+
+ while (connections.Count < port.ConnectionCount) AddConnection();
+ while (connections.Count > port.ConnectionCount) {
+ Destroy(connections[0].gameObject);
+ connections.RemoveAt(0);
+ }
+
+ // Loop through connections
+ for (int i = 0; i < port.ConnectionCount; i++) {
+ NodePort other = port.GetConnection(i);
+ UGUIMathBaseNode otherNode = graph.GetRuntimeNode(other.node);
+ if (!otherNode) Debug.LogWarning(other.node.name + " node not found", this);
+ Transform port2 = otherNode.GetPort(other.fieldName).transform;
+ if (!port2) Debug.LogWarning(other.fieldName + " not found", this);
+ connections[i].SetPosition(transform.position, port2.position);
+ }
+ }
+
+ private void AddConnection() {
+ Connection connection = Instantiate(graph.runtimeConnectionPrefab);
+ connection.transform.SetParent(graph.scrollRect.content);
+ connections.Add(connection);
+ }
+
+ public void OnBeginDrag(PointerEventData eventData) {
+ if (port.IsOutput) {
+ tempConnection = Instantiate(graph.runtimeConnectionPrefab);
+ tempConnection.transform.SetParent(graph.scrollRect.content);
+ tempConnection.SetPosition(transform.position, eventData.position);
+ startPos = transform.position;
+ startPort = port;
+ } else {
+ if (port.IsConnected) {
+ NodePort output = port.Connection;
+ Debug.Log("has " + port.ConnectionCount + " connections");
+ Debug.Log(port.GetConnection(0));
+ UGUIMathBaseNode otherNode = graph.GetRuntimeNode(output.node);
+ UGUIPort otherUGUIPort = otherNode.GetPort(output.fieldName);
+ Debug.Log("Disconnect");
+ output.Disconnect(port);
+ tempConnection = Instantiate(graph.runtimeConnectionPrefab);
+ tempConnection.transform.SetParent(graph.scrollRect.content);
+ tempConnection.SetPosition(otherUGUIPort.transform.position, eventData.position);
+ startPos = otherUGUIPort.transform.position;
+ startPort = otherUGUIPort.port;
+ graph.GetRuntimeNode(node).UpdateGUI();
+ }
+ }
+ }
+
+ public void OnDrag(PointerEventData eventData) {
+ if (tempConnection == null) return;
+ UGUIPort otherPort = FindPortInStack(eventData.hovered);
+ tempHovered = otherPort;
+ tempConnection.SetPosition(startPos, eventData.position);
+ }
+
+ public void OnEndDrag(PointerEventData eventData) {
+ if (tempConnection == null) return;
+ if (tempHovered) {
+ startPort.Connect(tempHovered.port);
+ graph.GetRuntimeNode(tempHovered.node).UpdateGUI();
+ }
+ Destroy(tempConnection.gameObject);
+ }
+
+ public UGUIPort FindPortInStack(List<GameObject> stack) {
+ for (int i = 0; i < stack.Count; i++) {
+ UGUIPort port = stack[i].GetComponent<UGUIPort>();
+ if (port) return port;
+ }
+ return null;
+ }
+
+ public void OnPointerEnter(PointerEventData eventData) {
+ graph.tooltip.Show();
+ object obj = node.GetInputValue<object>(port.fieldName, null);
+ if (obj != null) graph.tooltip.label.text = obj.ToString();
+ else graph.tooltip.label.text = "n/a";
+ }
+
+ public void OnPointerExit(PointerEventData eventData) {
+ graph.tooltip.Hide();
+ }
+ }
+} \ No newline at end of file