Code/UI/Components/Edit.razor
@using Sandbox.UI
@inherits Panel
@implements IEdit
@implements IGraphStyle
@namespace Nodebox.UI

<root>
    @if (NumericEdit.IsSupported(Type)) {
        <NumericEdit Type=@Type Value=@Value/>
    } else if (VectorEdit.IsSupported(Type)) {
        <VectorEdit Type=@Type Value=@Value/>
    } else if (Type == typeof(bool)) {
        <BoolEdit Value=@Value/>
    } else if (Type == typeof(string)) {
        <StringEdit Value=@Value/>
    }
</root>

@code
{
    public Panel SubEditRef => Children.FirstOrDefault();
    public IEdit SubEdit => (IEdit)SubEditRef;

    [Change(nameof(OnValueChanged))]
    public object Value { get; set; }
    public object ValueImmediate => SubEdit?.ValueImmediate;
    
    public void OnValueChanged(object oldValue, object newValue) {
        if (newValue == null) { return; }
        if (newValue.GetType() != Type) { return; }
        @* Assert.AreEqual(newValue.GetType(), Type); *@
        SubEdit?.Value = newValue;
    }

    public Type Type { get; set; }

    public static bool IsSupported(Type type) => type switch {
        var x when x == typeof(float) => true,
        _ => false,
    };

    protected override void OnAfterTreeRender(bool firstTime) {
        Tooltip = this.ConstructTooltip();
        
        if (!firstTime) { return; }

        OnValueChanged(null, Value);

        if (!SubEditRef.IsValid()) {
            @* Log.Warning(""); *@
            return;
        }

        SubEditRef.AddEventListener("onchange", (ev) => {
            ev.StopPropagation();
            
            CreateEvent("onchange", ValueImmediate);
        });

        SubEditRef.AddEventListener("onsubmit", (ev) => {
            ev.StopPropagation();

            Value = ValueImmediate;
            CreateEvent("onsubmit", Value);
        });

        @* SubEditRef.AddEventListener("oncancel", (ev) => {
            ev.StopPropagation();

            OnValueChanged(null, Value);
            CreateEvent("oncancel", Value);
        }); *@
    }

    protected override int BuildHash() => System.HashCode.Combine( Type );
}