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