Editor/Tool/ArchPreviews.cs
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;
}
}