Editor/Road/ArchRoadSheets.cs
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 );
	}
}