Big project cleanup with overhaul of file responsibilities (KISS) and code (DRY, YAGNI)
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user