UI/Inventory/HotbarPresetsButton.razor
@using Sandbox;
@using Sandbox.UI;
@namespace Sandbox
@inherits Panel

<root>

    <div class="presets-toggle" @onclick=@OnToggleClick>
        <i>expand_less</i>
    </div>

</root>

@code
{
    public PlayerInventory Inventory { get; set; }

    void OnToggleClick()
    {
        var menu = new Sandbox.UI.Menu();

        var presets = PlayerLoadout.GetLoadoutPresets();
        foreach ( var preset in presets )
        {
            var name = preset.Name;
            var json = preset.LoadoutJson;
            var sub = menu.AddMenu( name, "bookmark" );
            sub.AddOption( "Load", "play_arrow", () => OnLoadPreset( json ) );
            sub.AddOption( "Overwrite with current", "save", () => OnOverwritePreset( name ) );
            sub.AddOption( "Delete", "close", () => OnDeletePreset( name ) );
        }

        if ( presets.Any() )
        {
            menu.AddSeparator();
        }

        menu.AddOption( "Reset to Default", "refresh", ResetToDefault );
        menu.AddOption( "New Preset", "add", OnSaveNew );

        menu.Open( this, Popup.PositionMode.AboveLeft, 4 );
    }

    void OnLoadPreset( string json )
    {
        var loadout = GetLoadout();
        if ( !loadout.IsValid() ) return;
        loadout.SwitchToPreset( json );
    }

    void OnOverwritePreset( string name )
    {
        var json = LocalData.Get<string>( "hotbar" );
        if ( string.IsNullOrEmpty( json ) ) return;

        PlayerLoadout.SaveLoadoutPreset( name, json );
    }

    void OnDeletePreset( string name )
    {
        PlayerLoadout.DeleteLoadoutPreset( name );
    }

    void ResetToDefault()
    {
        var loadout = GetLoadout();
        if ( !loadout.IsValid() ) return;
        loadout.ResetToDefault();
    }

    void OnSaveNew()
    {
        var popup = new StringQueryPopup
        {
            Title = "New Inventoy Preset",
            Placeholder = "Enter a name...",
            ConfirmLabel = "Save",
            OnConfirm = OnSaveConfirmed,
            Parent = FindRootPanel()
        };
    }

    void OnSaveConfirmed( string name )
    {
        var json = LocalData.Get<string>( "hotbar" );
        if ( string.IsNullOrEmpty( json ) ) return;

        PlayerLoadout.SaveLoadoutPreset( name, json );
    }

    PlayerLoadout GetLoadout()
    {
        return Inventory?.GetComponent<PlayerLoadout>();
    }
}