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