using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MLEM.Graphics;
using MLEM.Misc;
using MLEM.Textures;
using MLEM.Ui.Style;
namespace MLEM.Ui.Elements {
///
/// A checkbox element to use inside of a .
/// A checkbox can be checked by pressing it and will stay checked until it is pressed again.
/// For a checkbox that causes neighboring checkboxes to be deselected automatically, use .
///
public class Checkbox : Element {
///
/// The texture that this checkbox uses for drawing.
///
public StyleProp Texture;
///
/// The texture that this checkbox uses when it is hovered.
/// If this is null, the default is used.
///
public StyleProp HoveredTexture;
///
/// The color that this checkbox uses for drawing when it is hovered.
///
public StyleProp HoveredColor;
///
/// The texture that the checkbox uses when it .
/// If this is null, it uses its default .
///
public StyleProp DisabledTexture;
///
/// The color that the checkbox uses for drawing when it .
///
public StyleProp DisabledColor;
///
/// The texture that is rendered on top of this checkbox when it is .
///
public StyleProp Checkmark;
///
/// The label that displays next to this checkbox
///
public Paragraph Label;
///
/// The width of the space between this checkbox and its
///
public StyleProp TextOffsetX {
get => this.textOffsetX;
set {
this.textOffsetX = value;
this.SetAreaDirty();
}
}
///
/// Whether or not this checkbox is currently checked.
///
public bool Checked {
get => this.isChecked;
set {
if (this.isChecked != value) {
this.isChecked = value;
this.OnCheckStateChange?.Invoke(this, this.isChecked);
}
}
}
///
/// Set this property to true to mark the checkbox as disabled.
/// A disabled checkbox cannot be moused over, selected or toggled.
///
public virtual bool IsDisabled { get; set; }
///
/// An event that is invoked when this checkbox's property changes
///
public CheckStateChange OnCheckStateChange;
///
/// Whether this checkbox should be able to be selected even if it .
/// If this is true, will be able to return true even if is true.
///
public bool CanSelectDisabled;
///
public override bool CanBeSelected => base.CanBeSelected && (this.CanSelectDisabled || !this.IsDisabled);
///
public override bool CanBePressed => base.CanBePressed && !this.IsDisabled;
private bool isChecked;
private StyleProp textOffsetX;
///
/// Creates a new checkbox with the given settings
///
/// The checkbox's anchor
/// The checkbox's size
/// The checkbox's label text
/// The default value of
public Checkbox(Anchor anchor, Vector2 size, string label, bool defaultChecked = false) : base(anchor, size) {
this.isChecked = defaultChecked;
this.OnPressed += element => this.Checked = !this.Checked;
if (label != null) {
this.Label = new Paragraph(Anchor.CenterLeft, 0, label);
this.AddChild(this.Label);
}
}
///
protected override Vector2 CalcActualSize(RectangleF parentArea) {
var size = base.CalcActualSize(parentArea);
if (this.Label != null) {
this.Label.Size = new Vector2((size.X - size.Y) / this.Scale - this.TextOffsetX, 1);
this.Label.PositionOffset = new Vector2(size.Y / this.Scale + this.TextOffsetX, 0);
}
return size;
}
///
public override void Draw(GameTime time, SpriteBatch batch, float alpha, SpriteBatchContext context) {
var tex = this.Texture;
var color = Color.White * alpha;
if (this.IsDisabled) {
tex = this.DisabledTexture.OrDefault(tex);
color = (Color) this.DisabledColor * alpha;
} else if (this.IsMouseOver) {
tex = this.HoveredTexture.OrDefault(tex);
color = (Color) this.HoveredColor * alpha;
}
var boxDisplayArea = new RectangleF(this.DisplayArea.Location, new Vector2(this.DisplayArea.Height));
batch.Draw(tex, boxDisplayArea, color, this.Scale);
if (this.Checked)
batch.Draw(this.Checkmark, boxDisplayArea, Color.White * alpha);
base.Draw(time, batch, alpha, context);
}
///
protected override void InitStyle(UiStyle style) {
base.InitStyle(style);
this.Texture = this.Texture.OrStyle(style.CheckboxTexture);
this.HoveredTexture = this.HoveredTexture.OrStyle(style.CheckboxHoveredTexture);
this.HoveredColor = this.HoveredColor.OrStyle(style.CheckboxHoveredColor);
this.DisabledTexture = this.DisabledTexture.OrStyle(style.CheckboxDisabledTexture);
this.DisabledColor = this.DisabledColor.OrStyle(style.CheckboxDisabledColor);
this.Checkmark = this.Checkmark.OrStyle(style.CheckboxCheckmark);
this.TextOffsetX = this.TextOffsetX.OrStyle(style.CheckboxTextOffsetX);
}
///
/// A delegate used for
///
/// The checkbox whose checked state changed
/// The new value of
public delegate void CheckStateChange(Checkbox box, bool checced);
}
}