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

<root>
    <TextEntry
        Value=@(Value?.ToString() ?? "")
        Placeholder=@("\"\"")
        @ref=TextEntryRef/>
</root>

@code
{
    public TextEntry TextEntryRef { get; protected set; }

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

        OnValueChanged(null, Value);

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

        TextEntryRef.AddEventListener("onchange", (ev) => {
            ev.StopPropagation();
            
            CreateEvent("onchange", ValueImmediate);
            
            Tooltip = this.ConstructTooltip();
            TextEntryRef?.Tooltip = Tooltip;
            TextEntryRef?.Children?.First()?.Tooltip = Tooltip;
        });

        TextEntryRef.AddEventListener("onblur", (ev) => {
            ev.StopPropagation();

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

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

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

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