using Sandbox.UI.Construct; namespace Sandbox.UI; /// /// A simple checkbox . /// [Library( "checkbox" )] public class Checkbox : Panel { /// /// Called when the checked state has been changed. /// [Parameter] public System.Action ValueChanged { get; set; } /// /// The checkmark icon. Although no guarantees it's an icon! /// public Panel CheckMark { get; protected set; } /// /// Use . /// private bool isChecked = false; /// /// Returns true if this checkbox is checked. /// [Parameter] public bool Checked { get => isChecked; set { if ( isChecked == value ) return; isChecked = value; OnValueChanged(); } } /// /// Returns true if this checkbox is checked. /// [Parameter] public bool Value { get => Checked; set => Checked = value; } /// /// The that displays . /// public Label Label { get; protected set; } /// /// Text for the checkbox label. /// [Parameter] public string LabelText { get => Label?.Text; set { if ( !Label.IsValid() ) { Label = Add.Label(); } Label.Text = value; } } public Checkbox() { AddClass( "checkbox" ); CheckMark = Add.Icon( "check", "checkmark" ); } public override void SetProperty( string name, string value ) { base.SetProperty( name, value ); if ( name == "checked" || name == "value" ) { Checked = value.ToBool(); } if ( name == "text" ) { LabelText = value; } } public override void SetContent( string value ) { LabelText = value?.Trim() ?? ""; } /// /// Called when changes. /// public virtual void OnValueChanged() { UpdateState(); CreateEvent( "onchange", Checked ); if ( Checked ) { CreateEvent( "onchecked" ); } else { CreateEvent( "onunchecked" ); } } /// /// Called to update visuals of the checkbox. By default this applies checked CSS class. /// protected virtual void UpdateState() { SetClass( "checked", Checked ); } protected override void OnClick( MousePanelEvent e ) { base.OnClick( e ); Checked = !Checked; CreateValueEvent( "checked", Checked ); CreateValueEvent( "value", Checked ); e.StopPropagation(); ValueChanged?.Invoke( Checked ); e.StopPropagation(); } protected override void OnMouseDown( MousePanelEvent e ) { e.StopPropagation(); } }