Editor/Stair/ArchStairGuardSheet.cs

Editor UI sheet for stair guard parts. It builds the inspector UI allowing the user to pick guard edge (Left, Right, Head), railing kind (Balustrade or Handrail), and set height, updating the ArchStairGuardPart and invoking refresh/changed callbacks.

File Access
using System;
using Editor;

namespace Sunless.Architecture;

public sealed class ArchStairGuardSheet : IArchSheet
{
	public Type Payload => typeof( ArchStairGuardPart );

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

		using ( var edges = ArchIconGrid.In( panel.AddGroup( "Edge" ) ) )
		{
			edges.Pick( "Left going up", "guard_left", "align_horizontal_left",
				guard.Edge == StairEdge.Left, () => { guard.Edge = StairEdge.Left; refresh?.Invoke(); changed?.Invoke(); } );

			edges.Pick( "Right going up", "guard_right", "align_horizontal_right",
				guard.Edge == StairEdge.Right, () => { guard.Edge = StairEdge.Right; refresh?.Invoke(); changed?.Invoke(); } );

			edges.Pick( "The head - the far end a turn leaves open", "guard_head", "vertical_align_top",
				guard.Edge == StairEdge.Head, () => { guard.Edge = StairEdge.Head; refresh?.Invoke(); changed?.Invoke(); } );
		}

		using ( var kinds = ArchIconGrid.In( panel.AddGroup( "Railing" ) ) )
		{
			kinds.Pick( "Balustrade — newels, balusters and a handrail over them", "opt_rails", "fence",
				guard.Railing == StairRailing.Balustrade, () => { guard.Railing = StairRailing.Balustrade; changed?.Invoke(); } );

			kinds.Pick( "Handrail — bolted to the plaster, for a side that runs against a wall", "opt_wall_rail", "handyman",
				guard.Railing == StairRailing.Handrail, () => { guard.Railing = StairRailing.Handrail; changed?.Invoke(); } );
		}

		panel.AddGroup( "Height" ).Add( ArchPartUi.Number( "Height", guard.Height, tool.Kit.HandrailHeight,
			value => guard.Height = MathF.Max( 0f, value ), changed ) );
	}
}