-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEventGraphView.cs
More file actions
143 lines (112 loc) · 4.59 KB
/
EventGraphView.cs
File metadata and controls
143 lines (112 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UIElements;
namespace EventGraph
{
public class EventGraphView : GraphView
{
public GraphData graphData = new GraphData();
public EventGraphView()
{
// Set up zoom and other basic settings
this.AddManipulator(new ContentZoomer());
this.AddManipulator(new ContentDragger());
this.AddManipulator(new SelectionDragger());
this.AddManipulator(new RectangleSelector());
// Add grid background
var grid = new GridBackground();
Insert(0, grid);
grid.StretchToParentSize();
// Add style
this.styleSheets.Add(Resources.Load<StyleSheet>("EventGraphStyle"));
// Add contextual menu for adding nodes
this.AddManipulator(new ContextualMenuManipulator(AddContextualMenu));
}
private void AddContextualMenu(ContextualMenuPopulateEvent evt)
{
evt.menu.AppendAction("Add Event Node", action => AddEventNode(evt.mousePosition));
}
public void AddEventNode(Vector2 position)
{
var node = new EventNode("New Event");
node.SetPosition(new Rect(position, new Vector2(150, 200)));
AddElement(node);
}
public override List<Port> GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter)
{
var compatiblePorts = new List<Port>();
ports.ForEach(port =>
{
if (startPort != port && startPort.node != port.node && startPort.direction != port.direction)
{
compatiblePorts.Add(port);
}
});
return compatiblePorts;
}
public void SaveGraphData()
{
graphData.nodes.Clear();
graphData.connections.Clear();
// Collect node data
foreach (var node in nodes.ToList())
{
var nodeData = new NodeData
{
nodeName = node.title,
position = node.GetPosition().position
};
graphData.nodes.Add(nodeData);
}
// Collect connection data
foreach (var edge in edges.ToList())
{
var outputNode = (edge.output.node as EventNode);
var inputNode = (edge.input.node as EventNode);
var connectionData = new ConnectionData
{
outputNodeName = outputNode.title,
inputNodeName = inputNode.title
};
graphData.connections.Add(connectionData);
}
// Save graph data to ScriptableObject
GraphDataAsset graphDataAsset = ScriptableObject.CreateInstance<GraphDataAsset>();
graphDataAsset.graphData = graphData;
string path = "Assets/GraphData.asset";
AssetDatabase.CreateAsset(graphDataAsset, path);
AssetDatabase.SaveAssets();
}
public void LoadGraphData(GraphDataAsset graphDataAsset)
{
// Clear existing nodes and edges
DeleteElements(nodes.ToList());
DeleteElements(edges.ToList());
// Load graph data from ScriptableObject
graphData = graphDataAsset.graphData;
// Create nodes
foreach (var nodeData in graphData.nodes)
{
var node = new EventNode(nodeData.nodeName);
node.SetPosition(new Rect(nodeData.position, new Vector2(150, 200)));
AddElement(node);
}
// Create connections
foreach (var connectionData in graphData.connections)
{
var outputNode = nodes.FirstOrDefault(n => (n as EventNode).title == connectionData.outputNodeName) as EventNode;
var inputNode = nodes.FirstOrDefault(n => (n as EventNode).title == connectionData.inputNodeName) as EventNode;
if (outputNode != null && inputNode != null)
{
var outputPort = outputNode.output;
var inputPort = inputNode.input;
var edge = outputPort.ConnectTo(inputPort);
AddElement(edge);
}
}
}
}
}