using Godot; using System; using System.Collections.Generic; public partial class CodingWindow : PanelContainer { //General Robot robot; //Scripting [Export] VBoxContainer codeBlocks; [Export] VBoxContainer editorWindow; public Dictionary DSLNodes; [Export] OptionButton availableScripts; [Export] LineEdit scriptName; //Renaming [Export] LineEdit nameInput; // Called when the node enters the scene tree for the first time. public override void _Ready() { DSLNodes = ResourceLoader.LoadDSLNodes(); GenerateCodingBlocks(); } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { } public override void _Notification(int id) { if (id == NotificationVisibilityChanged) { if (Visible) LoadWindow(); } } private void LoadWindow() { nameInput.Text = robot.Name; SetupScriptOptions(); ClearWindow(); } private void SetupScriptOptions() { availableScripts.Clear(); availableScripts.AddItem("Select script to load..."); List scripts = FileHandler.LoadProgramNames(); scripts.Sort((a, b) => a.CompareTo(b)); foreach (string script in scripts) { availableScripts.AddItem(script); } } public void SaveRobotName() { robot.Name = nameInput.Text; } public void CloseWindow() { Hide(); } public void GenerateCodingBlocks() { NodeDisplay nodeDisplay; foreach (ProgramNode node in DSLNodes.Keys) { nodeDisplay = DSLNodes[node].Instantiate(); nodeDisplay.node = node; codeBlocks.AddChild(nodeDisplay); nodeDisplay.ShowListDisplay(); nodeDisplay.listDisplay.Pressed += () => { NodeDisplay editorDisplay = DSLNodes[node].Instantiate(); editorDisplay.node = node; editorWindow.AddChild(editorDisplay); editorDisplay.ShowEditorDisplay(); editorDisplay.OnDeleteNode += () => { editorWindow.RemoveChild(editorDisplay); }; }; } } public void ClearWindow() { foreach (Node node in editorWindow.GetChildren()) { editorWindow.RemoveChild(node); node.QueueFree(); } scriptName.Text = ""; } public void CompileProgram() { List nodes = new List(); for (int i = 0; i < editorWindow.GetChildCount(); i++) { editorWindow.GetChild(i).node.ReadParameters(editorWindow.GetChild(i)); nodes.Add(editorWindow.GetChild(i).node.Duplicate()); if (i != 0) { nodes[i - 1].nextNode = nodes[i]; } } if (nodes.Count > 0) robot.SetupExecution(nodes); robot.currentProgram = scriptName.Text.Length <= 0 ? $"Script{availableScripts.ItemCount}" : scriptName.Text; } public void SetRobot(Robot robot) { this.robot = robot; } public void LoadProgram(int index) { ClearWindow(); string scriptContent = FileHandler.LoadProgram(availableScripts.GetItemText(index)); string[] nodes = scriptContent.Split(";"); foreach (string node in nodes) { NodeDisplay nodeDisplay = NodeDisplay.Load(node, DSLNodes); if (nodeDisplay != null) { editorWindow.AddChild(nodeDisplay); nodeDisplay.ShowEditorDisplay(); nodeDisplay.OnDeleteNode += () => { editorWindow.RemoveChild(nodeDisplay); }; } } scriptName.Text = availableScripts.GetItemText(index); availableScripts.Select(0); } public void SaveProgram() { string result = ""; for (int i = 0; i < editorWindow.GetChildCount(); i++) { editorWindow.GetChild(i).node.ReadParameters(editorWindow.GetChild(i)); result += editorWindow.GetChild(i).node.Save(); result += ";\r\n"; } if (result.Length <= 0) return; string filename = scriptName.Text.Length <= 0 ? $"Script{availableScripts.ItemCount}" : scriptName.Text; FileHandler.SaveProgram(filename, result); SetupScriptOptions(); } }