XGUI/Elements/RadioButton.cs
using Sandbox;
using Sandbox.UI;
using Sandbox.UI.Construct;
using System;
namespace XGUI;

[Library( "radiooption" ), Alias( "radiobutton" )]
public class RadioButton : Panel
{

	/// <summary>
	/// The radio button icon. Although no guarentees it's an icon!
	/// </summary>
	public Panel CheckMark { get; protected set; }


	/// <summary>
	/// The radio button segments. for themes that use characters that make up the radio button.
	/// </summary>
	internal Label OptionalRadioSegment1 { get; set; }
	internal Label OptionalRadioSegment2 { get; set; }
	internal Label OptionalRadioSegment3 { get; set; }

	protected bool isSelected = false;

	/// <summary>
	/// Returns true if this checkbox is checked
	/// </summary>
	public bool Selected
	{
		get => isSelected;
		set
		{
			if ( isSelected == value )
				return;

			isSelected = value;
			OnValueChanged();
		}
	}

	/// <summary>
	/// Returns true if this checkbox is checked
	/// </summary>
	public string Value;

	public Label Label { get; protected set; }

	public string LabelText
	{
		get => Label?.Text;
		set
		{
			if ( Label == null )
			{
				Label = Add.Label();
			}

			Label.Text = value;
		}
	}

	public RadioButton()
	{
		AddClass( "radiobutton" );
		CheckMark = Add.Panel( "checkpanel" );
		var b = Add.Label( "a", "checklabel" );
		CheckMark.AddChild( b );
		OptionalRadioSegment1 = Add.Label( "", "radio-seg1" );
		OptionalRadioSegment2 = Add.Label( "", "radio-seg2" );
		OptionalRadioSegment3 = Add.Label( "", "radio-seg3" );
		CheckMark.AddChild( OptionalRadioSegment1 );
		CheckMark.AddChild( OptionalRadioSegment2 );
		CheckMark.AddChild( OptionalRadioSegment3 );
	}

	public override void SetProperty( string name, string value )
	{
		base.SetProperty( name, value );

		if ( name == "checked" || name == "value" )
		{
			Selected = value.ToBool();
		}

		if ( name == "text" )
		{
			LabelText = value;
		}
	}

	public override void SetContent( string value )
	{
		LabelText = value?.Trim() ?? "";
	}

	public Action<bool> ValueChanged { get; set; }

	public virtual void OnValueChanged()
	{
		UpdateState();
		CreateEvent( "onchange", Selected );
		ValueChanged?.Invoke( Selected );

		if ( Selected )
		{
			CreateEvent( "onchecked" );
		}
		else
		{
			CreateEvent( "onunchecked" );
		}
	}

	protected virtual void UpdateState()
	{
		SetClass( "checked", Selected );
	}

	protected override void OnClick( MousePanelEvent e )
	{
		base.OnClick( e );

		if ( Parent is RadioButtons radbuttons )
		{
			if ( radbuttons.SelectedRadioOption != this )
			{
				if ( radbuttons.SelectedRadioOption != null )
				{
					radbuttons.SelectedRadioOption.Selected = false;
				}
				radbuttons.SelectedRadioOption = this;
				Selected = true;
				CreateValueEvent( "checked", Selected );
				CreateValueEvent( "value", Selected );
			}
		}
		e.StopPropagation();
	}
}