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

<root>
    <Checkbox
        Value=@((bool)Value)
        @ref=CheckboxRef/>
</root>

@code
{
    public Checkbox CheckboxRef { get; protected set; }

    [Change(nameof(OnValueChanged))]
    public object Value { get; set; }
    public object ValueImmediate => CheckboxRef?.Value;
    public Type Type => typeof(bool);
    public void OnValueChanged(object oldValue, object newValue) {
        if (newValue == null) { return; }
        Assert.AreEqual(newValue.GetType(), typeof(bool));
        CheckboxRef?.Value = (bool)newValue;
    }
    
    protected override void OnAfterTreeRender(bool firstTime) {
        Tooltip = this.ConstructTooltip();
        CheckboxRef?.Tooltip = Tooltip;
        CheckboxRef?.Children?.First()?.Tooltip = Tooltip;

        if (!firstTime) { return; }

        OnValueChanged(null, Value);

        if (!CheckboxRef.IsValid()) {
            Log.Warning("wtf");
            return;
        }

        CheckboxRef.AddEventListener("onchange", (ev) => {
            ev.StopPropagation();
            
            Value = ValueImmediate;
            CreateEvent("onchange", Value);
            CreateEvent("onsubmit", Value);

            Tooltip = this.ConstructTooltip();
            CheckboxRef?.Tooltip = Tooltip;
            CheckboxRef?.Children?.First().Tooltip = Tooltip;
        });
    }

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