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.
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 );
}
}