Skip to content

Commit 5dfdc84

Browse files
committed
NodeGraph export feature added
1 parent ab2a6ea commit 5dfdc84

File tree

8 files changed

+267
-142
lines changed

8 files changed

+267
-142
lines changed

Assets/Examples/2_SimpleMathEditor/Scripts/ExampleNodeEditor.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using RuntimeNodeEditor;
1+
using System;
2+
using RuntimeNodeEditor;
23
using UnityEngine;
34
using UnityEngine.EventSystems;
45

@@ -40,7 +41,20 @@ private void OnGraphPointerClick(PointerEventData eventData)
4041
case PointerEventData.InputButton.Left: CloseContextMenu(); break;
4142
}
4243
}
43-
44+
45+
private void SaveGraph(string savePath)
46+
{
47+
CloseContextMenu();
48+
Graph.SaveFile(savePath);
49+
}
50+
51+
private void LoadGraph(string savePath)
52+
{
53+
CloseContextMenu();
54+
Graph.Clear();
55+
Graph.LoadFile(savePath);
56+
}
57+
4458
private void OnGraphPointerDrag(PointerEventData eventData)
4559
{
4660
if (eventData.button == PointerEventData.InputButton.Middle)

Assets/RuntimeNodeEditor/Scripts/ContextMenu/ContextMenu.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ public class ContextMenu : MonoBehaviour
1111
{
1212
public event Action<ContextItemData, ContextContainer> OnMenuItemClick;
1313

14-
public GameObject contextContainerPrefab;
15-
public GameObject contextItemPrefab;
16-
private RectTransform _rect;
17-
private ContextContainer _root;
14+
public GameObject contextContainerPrefab;
15+
public GameObject contextItemPrefab;
16+
private RectTransform _rect;
17+
private ContextContainer _root;
1818

1919
private List<ContextContainer> _subContainers;
2020

Assets/RuntimeNodeEditor/Scripts/ContextMenu/ContextMenuBuilder.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,18 @@ private ContextItemData BuildHierarchy(string path)
2626
{
2727
path = path.Replace("\\", "/");
2828
string[] split = path.Split('/');
29-
ContextItemData menu_item = _root;
29+
ContextItemData itemData = _root;
3030
int index = 0;
3131

3232
while (index < split.Length)
3333
{
3434
bool found = false;
3535

36-
37-
for (int i = 0; i < menu_item.children.Count; ++i)
36+
for (int i = 0; i < itemData.children.Count; ++i)
3837
{
39-
if (menu_item.children[i].name == split[index])
38+
if (itemData.children[i].name == split[index])
4039
{
41-
menu_item = menu_item.children[i];
40+
itemData = itemData.children[i];
4241
++index;
4342
found = true;
4443
break;
@@ -47,14 +46,15 @@ private ContextItemData BuildHierarchy(string path)
4746

4847
if (!found)
4948
{
50-
var new_menu_item = new ContextItemData(split[index]) { parent = menu_item };
51-
menu_item.children.Add(new_menu_item);
52-
menu_item = new_menu_item;
49+
var newItemData = new ContextItemData(split[index]) { parent = itemData };
50+
itemData.children.Add(newItemData);
51+
itemData = newItemData;
5352
++index;
5453
found = true;
5554
}
5655
}
57-
return menu_item;
56+
57+
return itemData;
5858
}
5959
}
6060

@@ -65,10 +65,9 @@ public class ContextItemData
6565
public List<ContextItemData> children;
6666
public Action callback;
6767

68-
public bool IsRoot => parent == null;
69-
public int Level => IsRoot ? 0 : parent.Level + 1;
70-
71-
public bool IsTerminal => children.Count == 0;
68+
public bool IsRoot => parent == null;
69+
public int Level => IsRoot ? 0 : parent.Level + 1;
70+
public bool IsTerminal => children.Count == 0;
7271

7372
public ContextItemData(string name)
7473
{

Assets/RuntimeNodeEditor/Scripts/Graph/NodeGraph.cs

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void Init(SignalSystem signalSystem, float minZoom, float maxZoom)
4040
_signalSystem = signalSystem;
4141

4242
_signalSystem.OnOutputSocketDragStartEvent += OnOutputDragStarted;
43-
_signalSystem.OnOutputSocketDragDrop += OnOutputDragDroppedTo;
43+
_signalSystem.OnOutputSocketDragDropEvent += OnOutputDragDroppedTo;
4444
_signalSystem.OnInputSocketClickEvent += OnInputSocketClicked;
4545
_signalSystem.OnOutputSocketClickEvent += OnOutputSocketClicked;
4646
_signalSystem.OnNodePointerDownEvent += OnNodePointerDown;
@@ -54,11 +54,8 @@ public void Create(string prefabPath)
5454
{
5555
var mousePosition = Utility.GetMousePosition();
5656
var pos = Utility.GetLocalPointIn(nodeContainer, mousePosition);
57-
var node = Utility.CreateNodePrefab<Node>(prefabPath, nodeContainer);
58-
node.Init(_signalSystem, _signalSystem, pos, NewId(), prefabPath);
59-
node.Setup();
60-
nodes.Add(node);
61-
HandleSocketRegister(node);
57+
58+
Create(prefabPath, pos);
6259
}
6360

6461
public void Create(string prefabPath, Vector2 pos)
@@ -137,7 +134,55 @@ public void ClearConnectionsOf(Node node)
137134
.ForEach(conn => Disconnect(conn));
138135
}
139136

140-
public void Save(string path)
137+
public void SaveFile(string path)
138+
{
139+
System.IO.File.WriteAllText(path, ExportJson());
140+
}
141+
142+
public void LoadFile(string path)
143+
{
144+
if (System.IO.File.Exists(path))
145+
{
146+
var file = System.IO.File.ReadAllText(path);
147+
var graph = JsonUtility.FromJson<GraphData>(file);
148+
149+
foreach (var data in graph.nodes)
150+
{
151+
LoadNode(data);
152+
}
153+
154+
foreach (var node in nodes)
155+
{
156+
var nodeData = graph.nodes.FirstOrDefault(data => data.id == node.ID);
157+
158+
for (int i = 0; i < nodeData.inputSocketIds.Length; i++)
159+
{
160+
node.Inputs[i].socketId = nodeData.inputSocketIds[i];
161+
}
162+
163+
for (int i = 0; i < nodeData.outputSocketIds.Length; i++)
164+
{
165+
node.Outputs[i].socketId = nodeData.outputSocketIds[i];
166+
}
167+
}
168+
169+
foreach (var data in graph.connections)
170+
{
171+
LoadConn(data);
172+
}
173+
}
174+
else
175+
{
176+
Debug.Log("Specified file not exist.");
177+
}
178+
}
179+
180+
public string ExportJson()
181+
{
182+
return JsonUtility.ToJson(Export(), true);
183+
}
184+
185+
public GraphData Export()
141186
{
142187
var graph = new GraphData();
143188
var nodeDatas = new List<NodeData>();
@@ -183,49 +228,10 @@ public void Save(string path)
183228
connDatas.Add(data);
184229
}
185230

186-
graph.name = "awesome graph";
187231
graph.nodes = nodeDatas.ToArray();
188232
graph.connections = connDatas.ToArray();
189233

190-
System.IO.File.WriteAllText(path, JsonUtility.ToJson(graph, true));
191-
}
192-
193-
public void Load(string path)
194-
{
195-
if (System.IO.File.Exists(path))
196-
{
197-
var file = System.IO.File.ReadAllText(path);
198-
var graph = JsonUtility.FromJson<GraphData>(file);
199-
200-
foreach (var data in graph.nodes)
201-
{
202-
LoadNode(data);
203-
}
204-
205-
foreach (var node in nodes)
206-
{
207-
var nodeData = graph.nodes.FirstOrDefault(data => data.id == node.ID);
208-
209-
for (int i = 0; i < nodeData.inputSocketIds.Length; i++)
210-
{
211-
node.Inputs[i].socketId = nodeData.inputSocketIds[i];
212-
}
213-
214-
for (int i = 0; i < nodeData.outputSocketIds.Length; i++)
215-
{
216-
node.Outputs[i].socketId = nodeData.outputSocketIds[i];
217-
}
218-
}
219-
220-
foreach (var data in graph.connections)
221-
{
222-
LoadConn(data);
223-
}
224-
}
225-
else
226-
{
227-
Debug.Log("Specified file not exist.");
228-
}
234+
return graph;
229235
}
230236

231237
public void Clear()
@@ -234,11 +240,6 @@ public void Clear()
234240
nodesToClear.ForEach(n => Delete(n));
235241
}
236242

237-
// public void OnUpdate()
238-
// {
239-
// drawer.UpdateDraw();
240-
// }
241-
242243
// event handlers
243244
protected virtual void OnInputSocketClicked(SocketInput input, PointerEventData eventData)
244245
{

Assets/RuntimeNodeEditor/Scripts/NodeEditor/NodeEditor.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,6 @@ public void SetContextMenu(ContextItemData ctx)
4949
_contextMenuData = ctx;
5050
}
5151

52-
// save and load
53-
public void SaveGraph(string path)
54-
{
55-
CloseContextMenu();
56-
_graph.Save(path);
57-
}
58-
59-
public void LoadGraph(string path)
60-
{
61-
CloseContextMenu();
62-
_graph.Clear();
63-
_graph.Load(path);
64-
}
65-
6652
// create graph in scene
6753
public TGraphComponent CreateGraph<TGraphComponent>(RectTransform holder) where TGraphComponent : NodeGraph
6854
{

Assets/RuntimeNodeEditor/Scripts/NodeEditor/SignalSystem.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ namespace RuntimeNodeEditor
55
{
66
public class SignalSystem : INodeEvents, ISocketEvents, IConnectionEvents
77
{
8-
public event Action<PointerEventData> OnGraphPointerClickEvent;
9-
public event Action<PointerEventData> OnGraphPointerDragEvent;
10-
public event Action<PointerEventData> OnGraphPointeScrollEvent;
8+
public event Action<PointerEventData> OnGraphPointerClickEvent;
9+
public event Action<PointerEventData> OnGraphPointerDragEvent;
10+
public event Action<PointerEventData> OnGraphPointeScrollEvent;
1111

1212
public void InvokeGraphPointerClick(PointerEventData eventData)
1313
{
@@ -25,9 +25,9 @@ public void InvokeGraphPointerScroll(PointerEventData eventData)
2525
}
2626

2727
// INodePointerListener
28-
public event Action<Node, PointerEventData> OnNodePointerClickEvent;
29-
public event Action<Node, PointerEventData> OnNodePointerDownEvent;
30-
public event Action<Node, PointerEventData> OnNodePointerDragEvent;
28+
public event Action<Node, PointerEventData> OnNodePointerClickEvent;
29+
public event Action<Node, PointerEventData> OnNodePointerDownEvent;
30+
public event Action<Node, PointerEventData> OnNodePointerDragEvent;
3131

3232
public void InvokeNodePointerClick(Node node, PointerEventData eventData)
3333
{
@@ -47,10 +47,10 @@ public void InvokeNodePointerDrag(Node node, PointerEventData eventData)
4747

4848

4949
// ISocketPointerListener
50-
public event Action<SocketOutput> OnOutputSocketDragStartEvent;
51-
public event Action<SocketInput> OnOutputSocketDragDrop;
52-
public event Action<SocketInput, PointerEventData> OnInputSocketClickEvent;
53-
public event Action<SocketOutput, PointerEventData> OnOutputSocketClickEvent;
50+
public event Action<SocketOutput> OnOutputSocketDragStartEvent;
51+
public event Action<SocketInput> OnOutputSocketDragDropEvent;
52+
public event Action<SocketInput, PointerEventData> OnInputSocketClickEvent;
53+
public event Action<SocketOutput, PointerEventData> OnOutputSocketClickEvent;
5454

5555
public void InvokeSocketDragFrom(SocketOutput output)
5656
{
@@ -59,7 +59,7 @@ public void InvokeSocketDragFrom(SocketOutput output)
5959

6060
public void InvokeOutputSocketDragDropTo(SocketInput input)
6161
{
62-
OnOutputSocketDragDrop?.Invoke(input);
62+
OnOutputSocketDragDropEvent?.Invoke(input);
6363
}
6464

6565
public void InvokeInputSocketClick(SocketInput input, PointerEventData eventData)
@@ -75,9 +75,9 @@ public void InvokeOutputSocketClick(SocketOutput output, PointerEventData eventD
7575

7676

7777
// IConnectionEventListener
78-
public event Action<string, PointerEventData> OnConnectionPointerClickEvent;
79-
public event Action<SocketInput, SocketOutput> OnSocketConnect;
80-
public event Action<SocketInput, SocketOutput> OnSocketDisconnect;
78+
public event Action<string, PointerEventData> OnConnectionPointerClickEvent;
79+
public event Action<SocketInput, SocketOutput> OnSocketConnect;
80+
public event Action<SocketInput, SocketOutput> OnSocketDisconnect;
8181

8282
public void InvokeConnectionPointerClick(string connId, PointerEventData eventData)
8383
{
@@ -97,9 +97,9 @@ public void InvokeSocketDisconnection(SocketInput input, SocketOutput output)
9797

9898
public interface INodeEvents
9999
{
100-
event Action<Node, PointerEventData> OnNodePointerClickEvent;
101-
event Action<Node, PointerEventData> OnNodePointerDownEvent;
102-
event Action<Node, PointerEventData> OnNodePointerDragEvent;
100+
event Action<Node, PointerEventData> OnNodePointerClickEvent;
101+
event Action<Node, PointerEventData> OnNodePointerDownEvent;
102+
event Action<Node, PointerEventData> OnNodePointerDragEvent;
103103

104104
void InvokeNodePointerClick(Node node, PointerEventData eventData);
105105
void InvokeNodePointerDown(Node node, PointerEventData eventData);
@@ -108,10 +108,10 @@ public interface INodeEvents
108108

109109
public interface ISocketEvents
110110
{
111-
event Action<SocketOutput> OnOutputSocketDragStartEvent;
112-
event Action<SocketInput> OnOutputSocketDragDrop;
113-
event Action<SocketInput, PointerEventData> OnInputSocketClickEvent;
114-
event Action<SocketOutput, PointerEventData> OnOutputSocketClickEvent;
111+
event Action<SocketOutput> OnOutputSocketDragStartEvent;
112+
event Action<SocketInput> OnOutputSocketDragDropEvent;
113+
event Action<SocketInput, PointerEventData> OnInputSocketClickEvent;
114+
event Action<SocketOutput, PointerEventData> OnOutputSocketClickEvent;
115115

116116
void InvokeSocketDragFrom(SocketOutput output);
117117
void InvokeOutputSocketDragDropTo(SocketInput input);
@@ -121,9 +121,9 @@ public interface ISocketEvents
121121

122122
public interface IConnectionEvents
123123
{
124-
event Action<string, PointerEventData> OnConnectionPointerClickEvent;
125-
event Action<SocketInput, SocketOutput> OnSocketConnect;
126-
event Action<SocketInput, SocketOutput> OnSocketDisconnect;
124+
event Action<string, PointerEventData> OnConnectionPointerClickEvent;
125+
event Action<SocketInput, SocketOutput> OnSocketConnect;
126+
event Action<SocketInput, SocketOutput> OnSocketDisconnect;
127127

128128
void InvokeConnectionPointerClick(string connId, PointerEventData eventData);
129129
void InvokeSocketConnection(SocketInput input, SocketOutput output);

Assets/RuntimeNodeEditor/Scripts/Serializer/SerializationData.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class SerializedValue
3232

3333
public class GraphData
3434
{
35-
public string name;
3635
public NodeData[] nodes;
3736
public ConnectionData[] connections;
3837
}

0 commit comments

Comments
 (0)