SceneMenu/SceneMenuPanel.razor
@using Sandbox;
@using Sandbox.UI;
@using Sandbox.Network;
@using Sandbox.Diagnostics;
@inherits PanelComponent

<root>

    <div class="header">
        <div class="title">Scene Tests</div>
        <div class="explanation">The scenes below are used as tests and examples of the scene system. Press escape to leave the scene. Hold escape to leave the game.</div>
    </div>

    <div class="body">

        <div class="sidebar">

            @foreach (var group in ResourceLibrary.GetAll<SceneFile>().Where(x => x.ResourcePath.Contains("/tests/")).GroupBy(x => x.GetMetadata("Group", "None")).OrderBy(x => x.Key))
            {
                var c = SceneCategory == group.Key ? "active" : "";

                <div class="option @c" @onclick="@(() => SceneCategory = group.Key)">
                    <label class="name">@group.Key</label>
                    <label class="count">@group.Count()</label>
                </div>
            }

        </div>

        <div class="scene-list">

            @foreach (var scene in ResourceLibrary.GetAll<SceneFile>().Where(x => x.ResourcePath.Contains("/tests/") && x.GetMetadata("Group", "None") == SceneCategory).OrderBy(x => x.GetMetadata("Title")))
            {
                <SceneButton Scene="@scene" OnSelected=@OpenScene></SceneButton> 
            }

        </div>

    </div>

</root>

@code
{
    [ConVar( "testbed_category", ConVarFlags.Saved )]
    public static string SceneCategory { get; set; } = "Fog";

    [Parameter, EditorRequired] public RenderFragment Body { get; set; }


    void OpenScene( SceneFile file )
    {
        Game.ActiveScene.Load(file);

        var go = new GameObject(true, "Return To Menu");
        go.Components.Create<ReturnToMenu>();
    }
}