Demos/RadialWheel/Components/WedgeRing.cs
using System;
using Goo;
using Sandbox;
using Sandbox.UI;
namespace Sandbox.RadialWheel;
// Per-wedge control variant of Goo.Shapes.Ring; takes per-slot color + scale + corner radius.
public static class WedgeRing
{
public static Container Build(
int segments,
float innerRadius,
float wedgeCornerRadius,
ReadOnlySpan<Color> colors,
ReadOnlySpan<float> wedgeScales,
float startAngleDeg = 0f,
string? key = null )
{
if ( segments <= 0 ) throw new ArgumentException( "segments must be > 0", nameof( segments ) );
if ( colors.Length != segments )
throw new ArgumentException( $"colors.Length ({colors.Length}) must equal segments ({segments})", nameof( colors ) );
if ( wedgeScales.Length != segments )
throw new ArgumentException( $"wedgeScales.Length ({wedgeScales.Length}) must equal segments ({segments})", nameof( wedgeScales ) );
var outer = new Container
{
Key = key,
Position = PositionMode.Relative,
Width = Length.Percent( 100 ),
Height = Length.Percent( 100 ),
PointerEvents = PointerEvents.None,
};
float wedge = 360f / segments;
float halfWedge = 0.5f * wedge;
for ( int i = 0; i < segments; i++ )
{
float rot = i * wedge - halfWedge + startAngleDeg;
var wrapper = new Container
{
Key = $"ring-slot-{i}",
Position = PositionMode.Absolute,
Top = 0,
Left = 0,
Width = Length.Percent( 100 ),
Height = Length.Percent( 100 ),
PointerEvents = PointerEvents.None,
Transform = Goo.PanelTransform.Rotate( rot ).Scale( wedgeScales[i] ),
};
wrapper.Children.Add( new Sector
{
Width = Length.Percent( 100 ),
Height = Length.Percent( 100 ),
StartAngle = 0f,
EndAngle = wedge,
InnerRadius = innerRadius,
OuterRadius = 1.0f,
CornerRadius = wedgeCornerRadius,
BackgroundColor = colors[i],
} );
outer.Children.Add( wrapper );
}
return outer;
}
}