iFactory.Godot/BITKit/Scripts/Builder/NodeBuilder.cs

75 lines
1.5 KiB
C#

using Godot;
using System;
// ReSharper disable MemberCanBePrivate.Global
namespace BITKit;
public partial class NodeBuilder : Node
{
[Export] private bool clearOnStart = true;
[Export] private bool clearTemplateOnly = true;
[ExportCategory("UX")]
[Export] private Control emptyHints;
[ExportCategory("Template")]
[Export] private PackedScene template;
public override void _Ready()
{
if (clearOnStart)
{
Clear();
}
}
public T Build<T>() where T : Node
{
Node instance;
if (template is not null)
{
instance = template.Instantiate<T>();
AddChild(instance);
}
else
{
instance = new PanelContainer();
var margin = new MarginContainer();
AddChild(instance);
instance.AddChild(margin);
instance = margin;
margin.AddThemeConstantOverride("theme_override_constants/margin_left",16);
margin.AddThemeConstantOverride("theme_override_constants/margin_top",16);
margin.AddThemeConstantOverride("theme_override_constants/margin_right",16);
margin.AddThemeConstantOverride("theme_override_constants/margin_button",16);
}
emptyHints?.Hide();;
return instance as T;
}
public void Clear()
{
emptyHints?.Show();
if (clearTemplateOnly)
{
foreach (var x in GetChildren())
{
switch (template)
{
case null:
x.QueueFree();
break;
case (var y) when y.ResourcePath == x.SceneFilePath:
x.QueueFree();
break;
}
}
}
else
{
MathNode.ClearChild(this);
}
}
}