UI/Controls/ResourceSelectControl.razor
@using Sandbox;
@using Sandbox.UI;
@namespace Sandbox
@inherits BaseControl
@attribute [CustomEditor(typeof(string), WithAllAttributes = [typeof(ResourceSelectAttribute)])]



<root>
    <div class="preview">
        @if ( ResourcePath != null )
        {
            <div class="thumb" style="background-image: url( thumb:@ResourcePath )"></div>
        }
        else if ( ResourceAttribute != null )
        {
            <div class="ext-badge">@ResourceAttribute.Extension?.ToUpperInvariant()</div>
        }
        else
        {
            <div class="ext-badge">?</div>
        }
    </div>

    <div class="content">
        @if ( ResourceType == null )
        {
            <div class="title">Unknown Resource Type</div>
        }
        else if ( Title == null )
        {
            <div class="title empty">None Selected</div>
        }
        else
        {
            <div class="title">@Title</div>
        }

        @if ( ResourceAttribute != null )
        {
            <div class="subtitle">@ResourceAttribute.Name</div>
        }
    </div>

</root>

@code
{

    string Title;
    string ResourcePath;
    TypeDescription ResourceType;
    AssetTypeAttribute ResourceAttribute;

    public override void Rebuild()
    {
        base.Rebuild();

        if (Property.TryGetAttribute<ResourceSelectAttribute>(out var resTypeAttr))
        {
            ResourceType = AssetTypeAttribute.FindTypeByExtension(resTypeAttr.Extension);
            ResourceAttribute = ResourceType?.GetAttribute<AssetTypeAttribute>();
        }

        OnValueChanged();
    }

    public void OnValueChanged()
    {
        var path = Property.As.String;

        if (string.IsNullOrWhiteSpace(path))
        {
            Title = null;
            ResourcePath = null;
            return;
        }

        ResourcePath = path;

        var resource = ResourceLibrary.Get<GameResource>(path);
        if ( resource == null )
        {
            Title = "Unknown Resource";
            return;
        }

        Title = resource.ResourceName;

        if (resource is IDefinitionResource defRes )
        {
            Title = defRes.Title;
        }

    }

    void SelectFile( string filePath )
    {
        Property.As.String = filePath;
        OnValueChanged();
    }

    protected override void OnClick(MousePanelEvent e)
    {
        base.OnClick(e);

        var allowPackages = false;

        // TODO: this doesn't seem to work in queries?
		// if (Property.TryGetAttribute<ResourceSelectAttribute>(out var attr))
		//     allowPackages = attr.AllowPackages;

        var popup = new ResourceSelectPopup();
        popup.Extension = ResourceAttribute?.Extension;
        popup.CurrentValue = Property.As.String;
        popup.AllowPackages = allowPackages;
        popup.Parent = FindPopupPanel();
        popup.OnSelectedFile = SelectFile;
    }
}