Code/SvgGenerator.cs
using Sandbox.UI;
using Sandbox;
using System;
namespace JBG.UI;
/// <summary>
/// A generic panel that draws an SVG at runtime from a string
/// </summary>
[Library( "svg_generator" )]
public partial class SvgGenerator : Panel
{
/// <summary>
/// SVG File As String
/// </summary>
public string SvgAsString
{
get => _svgString;
set
{
if ( _svgString == value )
return;
_svgString = value;
ReloadTexture();
}
}
internal string _svgString;
public int? RenderWidth { get; set; } = null;
public int? RenderHeight { get; set; } = null;
public Color? RenderColor { get; set; } = null;
Texture texture;
int sizeHash;
public override void FinalLayout( Vector2 offset )
{
base.FinalLayout( offset );
if ( !IsVisible ) return;
var hash = HashCode.Combine( SvgAsString, RenderWidth, RenderHeight, RenderColor, Style );
if ( hash == sizeHash ) return;
sizeHash = hash;
ReloadTexture();
}
private async void ReloadTexture()
{
if ( string.IsNullOrEmpty( SvgAsString ) ) return;
texture?.Dispose();
texture = Texture.CreateFromSvgSource( SvgAsString, RenderWidth, RenderHeight, RenderColor );
MarkRenderDirty();
}
public override void OnDraw()
{
if ( texture == null ) return;
DrawBackgroundTexture( texture, Length.Cover );
}
}