70 lines
1.8 KiB
C#
70 lines
1.8 KiB
C#
using Godot;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
public class RunningProgramGraphBuilder
|
|
{
|
|
private readonly Dictionary<ProgramNode, PackedScene> dslNodes;
|
|
private readonly Action<NodeDisplay> addNode;
|
|
private readonly Action<StringName, int, StringName, int> connectNodes;
|
|
|
|
public RunningProgramGraphBuilder(
|
|
Dictionary<ProgramNode, PackedScene> dslNodes,
|
|
Action<NodeDisplay> addNode,
|
|
Action<StringName, int, StringName, int> connectNodes
|
|
)
|
|
{
|
|
this.dslNodes = dslNodes;
|
|
this.addNode = addNode;
|
|
this.connectNodes = connectNodes;
|
|
}
|
|
|
|
public void Load(ProgramNode startNode)
|
|
{
|
|
Dictionary<ProgramNode, NodeDisplay> loadedNodes =
|
|
new Dictionary<ProgramNode, NodeDisplay>();
|
|
LoadNode(startNode, loadedNodes);
|
|
}
|
|
|
|
private NodeDisplay LoadNode(
|
|
ProgramNode programNode,
|
|
Dictionary<ProgramNode, NodeDisplay> loadedNodes
|
|
)
|
|
{
|
|
if (programNode == null) return null;
|
|
if (loadedNodes.ContainsKey(programNode)) return loadedNodes[programNode];
|
|
|
|
NodeDisplay nodeDisplay = NodeDisplay.Load(
|
|
programNode.DisplayText,
|
|
programNode.Save(),
|
|
dslNodes
|
|
);
|
|
if (nodeDisplay == null) return null;
|
|
if (programNode.EditorNodeId != null && programNode.EditorNodeId.Length > 0)
|
|
{
|
|
nodeDisplay.Name = programNode.EditorNodeId;
|
|
}
|
|
|
|
addNode(nodeDisplay);
|
|
loadedNodes.Add(programNode, nodeDisplay);
|
|
|
|
ConnectNode(nodeDisplay, 0, programNode.nextNode, loadedNodes);
|
|
ConnectNode(nodeDisplay, 1, programNode.NegativeNode, loadedNodes);
|
|
|
|
return nodeDisplay;
|
|
}
|
|
|
|
private void ConnectNode(
|
|
NodeDisplay fromDisplay,
|
|
int fromPort,
|
|
ProgramNode targetNode,
|
|
Dictionary<ProgramNode, NodeDisplay> loadedNodes
|
|
)
|
|
{
|
|
NodeDisplay toDisplay = LoadNode(targetNode, loadedNodes);
|
|
if (toDisplay == null) return;
|
|
|
|
connectNodes(fromDisplay.Name, fromPort, toDisplay.Name, 0);
|
|
}
|
|
}
|