UI/SpawnMenu/Spawnlists/SpawnlistLayoutItem.razor
@using Sandbox;
@using Sandbox.UI;
@inherits Panel
@namespace Sandbox

<root class="@(Item.Kind == SpawnlistItemKind.Title ? "title-item" : "divider-item")">
    <SpawnlistDragHandle class="edit-only" Item=@Item />

    @if ( Item.Kind == SpawnlistItemKind.Title )
    {
        <div class="marker-line left"></div>
        <IconPanel Text="label" />
        <label>@Item.Title</label>
        <div class="marker-line right"></div>
    }
    else
    {
        <div class="marker-line divider-line"></div>
    }
</root>

@code
{
    [Parameter] public SpawnlistItem Item { get; set; }
    [Parameter] public Action<Guid, string> OnRename { get; set; }
    [Parameter] public Action<Guid> OnRemove { get; set; }

    public override void Tick()
    {
        base.Tick();
        SetClass( "editing", Ancestors.OfType<SpawnlistView>().FirstOrDefault()?.CanReorder == true );
    }

    protected override void OnMouseDown( MousePanelEvent e )
    {
        if ( e.MouseButton != MouseButtons.Right || Ancestors.OfType<SpawnlistView>().FirstOrDefault()?.CanReorder != true )
        {
            base.OnMouseDown( e );
            return;
        }

        var menu = new Sandbox.UI.Menu();
        if ( Item.Kind == SpawnlistItemKind.Title )
        {
            menu.AddOption( "#spawnmenu.spawnlist.rename_title_item", "edit", () =>
            {
                var popup = new StringQueryPopup
                {
                    Title = "#spawnmenu.spawnlist.rename_title_item",
                    Placeholder = "#spawnmenu.spawnlist.title_placeholder",
                    ConfirmLabel = "#spawnmenu.spawnlist.rename_button",
                    InitialValue = Item.Title,
                    OnConfirm = value =>
                    {
                        Item.Title = value;
                        OnRename?.Invoke( Item.Id, value );
                        StateHasChanged();
                    }
                };
                popup.Parent = FindPopupPanel();
            } );
        }

        menu.AddOption( "#spawnmenu.spawnlist.remove_item", "delete", () => OnRemove?.Invoke( Item.Id ) );
        e.StopPropagation();

        menu.Open( this, Popup.PositionMode.UnderMouse );
    }
}