MehCode/Nodes/Core/Drive/Drive.cs
namespace Nodebox.Nodes;


[Register(typeof(Library.All))]
[Description("Continuously writes to a property")]
[Tag("Core")]
[Writer]
[Initialized]
public class Drive<T> : Node
{
    public Drive() {
        Reference = null;
        SetInput<T>(0, default);
    }

    public Drive(Reference reference) {
        Reference = reference;
        SetInput(0, reference.Read<T>());
    }

    public Drive(Reference<T> reference) {
        Reference = reference;
        SetInput(0, reference.Read());
    }

	public override (Pin[] In, Pin[] Out) InitialPins => (
        new Pin[] {
            Pin.New<T>("*")
        },

        new Pin[] {
        }
    );

    public Reference Reference { get; set; }

	public DisplayPanel DisplayPanel { get; private set; }
	public override void Render(Panel panel)
	{
        if (DisplayPanel == null) {
		    DisplayPanel = new DisplayPanel();
            Assert.NotNull(panel);
	        DisplayPanel.Parent = panel;
            DisplayPanel.Style.FontSize = 12;
            DisplayPanel.Style.Height = Sandbox.UI.Length.Percent(130f);
        }

	    DisplayPanel.Value = $"on {Reference?.Target ?? "null"}";
	}

	public override void Evaluate() {
        RenamePin(PinType.Input, 0, Reference?.PropertyName ?? "???");
        if (Reference == null) return;
		var value = GetInput<T>(0);
        Reference.Write(value);
	}
}