Editor/Road/ArchRoadSheets.cs

Editor UI sheets for road-related architecture parts. Defines sidebar builders for road part, crossing, bridge, and tunnel, wiring up UI helpers to show fields, type selectors, span controls, and update callbacks.

File Access
namespace Sunless.Architecture;

public sealed class ArchRoadPartSheet : IArchSheet
{
	public Type Payload => typeof( ArchRoadPart );

	public void Build( ToolSidebarWidget panel, ArchTool tool, ArchSelection picked, Action refresh, Action changed )
	{
		if ( picked.Item is ArchRoadPart road )
		{
			ArchRoadUi.Build( panel, road, tool.Kit, refresh, changed );
		}
	}
}

public sealed class ArchCrossingSheet : IArchSheet
{
	public Type Payload => typeof( ArchRoadCrossing );

	public void Build( ToolSidebarWidget panel, ArchTool tool, ArchSelection picked, Action refresh, Action changed )
	{
		if ( picked.Item is ArchRoadCrossing crossing )
		{
			ArchRoadUi.Crossing( panel, crossing, changed );
		}
	}
}

public sealed class ArchBridgeSheet : IArchSheet
{
	public Type Payload => typeof( ArchBridgePart );

	public void Build( ToolSidebarWidget panel, ArchTool tool, ArchSelection picked, Action refresh, Action changed )
	{
		if ( picked.Item is not ArchBridgePart bridge )
		{
			return;
		}

		Span( panel, bridge.From, bridge.To, value => bridge.From = value, value => bridge.To = value, changed );
		ArchRoadUi.Types( panel, tool, bridge.Type, type =>
		{
			tool.Picked = picked.Following( ArchRoadUi.Retype( tool, bridge, type ) );
			changed();
			refresh();
		} );
		ArchRoadUi.Bridge( panel, bridge, ArchRoadCatalogs.Bridge( bridge.Type ), refresh, changed );
	}

	internal static void Span( ToolSidebarWidget panel, float from, float to, Action<float> assignFrom, Action<float> assignTo, Action changed )
	{
		ArchSidebarSection.Show( panel, "Span.range", "Span", group =>
		{
			group.Add( ArchPartUi.Number( "Starts at", from, 0f, assignFrom, changed ) );
			group.Add( ArchPartUi.Number( "Ends at", to, 0f, assignTo, changed ) );
		} );
	}
}

public sealed class ArchTunnelSheet : IArchSheet
{
	public Type Payload => typeof( ArchTunnelPart );

	public void Build( ToolSidebarWidget panel, ArchTool tool, ArchSelection picked, Action refresh, Action changed )
	{
		if ( picked.Item is not ArchTunnelPart tunnel )
		{
			return;
		}

		ArchBridgeSheet.Span( panel, tunnel.From, tunnel.To, value => tunnel.From = value, value => tunnel.To = value, changed );
		ArchRoadUi.TunnelTypes( panel, tool, tunnel.Type, type =>
		{
			tool.Picked = picked.Following( ArchRoadUi.Retype( tool, tunnel, type ) );
			changed();
			refresh();
		} );
		ArchRoadUi.Tunnel( panel, tunnel, ArchRoadCatalogs.Tunnel( tunnel.Type ), refresh, changed );
	}
}