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