Editor/Tool/ArchPreviews.cs

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.

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