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;
}
}