Editor tool code that defines a preview system for architecture elements. It declares ArchPreviewContext record, IArchPreview interface, and a registry ArchPreviews that enumerates concrete preview types and routes draw calls based on ArchKind.
namespace Sunless.Architecture;
public readonly record struct ArchPreviewContext(
object Payload,
ArchRoom Room,
ArchBuilding Building,
float Lift,
bool Selected,
ArchTool Tool = null );
public interface IArchPreview
{
ArchKind Kind { get; }
void Draw( ArchPreviewContext context );
}
public sealed class ArchPreviews : ArchTable<ArchPreviews, ArchKind, IArchPreview>
{
protected override IEnumerable<IArchPreview> Standing()
{
yield return new ArchStairPreview();
yield return new ArchCarvedStairPreview();
yield return new ArchPillarPreview();
yield return new ArchPipePreview();
yield return new ArchBracketPreview();
yield return new ArchWalkwayPreview();
yield return new ArchRoadPreview();
yield return new ArchBridgePreview();
yield return new ArchTunnelPreview();
}
protected override ArchKind KeyOf( IArchPreview preview ) => preview.Kind;
protected override bool Accepts( IArchPreview preview ) => preview.Kind.Known;
protected override string Collision( IArchPreview standing, IArchPreview preview )
{
return $"{preview.Kind.Ident} preview is claimed by both {standing.GetType().Name} and {preview.GetType().Name}";
}
public IArchPreview For( ArchKind kind ) => Held( kind );
public bool Draw( ArchKind kind, ArchPreviewContext context )
{
if ( For( kind ) is not IArchPreview preview )
{
return false;
}
preview.Draw( context );
return true;
}
}