using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using MLEM.Extensions; using MLEM.Textures; namespace MLEM.Ui.Elements { public class Image : Element { public Color Color = Color.White; private TextureRegion texture; public TextureRegion Texture { get => this.texture; set { if (this.texture != value) { this.texture = value; if (this.scaleToImage) this.SetAreaDirty(); } } } private bool scaleToImage; public bool ScaleToImage { get => this.scaleToImage; set { if (this.scaleToImage != value) { this.scaleToImage = value; this.SetAreaDirty(); } } } public bool MaintainImageAspect = true; public Image(Anchor anchor, Vector2 size, TextureRegion texture, bool scaleToImage = false) : base(anchor, size) { this.texture = texture; this.scaleToImage = scaleToImage; this.CanBeSelected = false; this.CanBeMoused = false; } protected override Point CalcActualSize(Rectangle parentArea) { return this.scaleToImage ? this.texture.Size : base.CalcActualSize(parentArea); } public override void Draw(GameTime time, SpriteBatch batch, float alpha) { if (this.MaintainImageAspect) { var scale = Math.Min(this.DisplayArea.Width / (float) this.texture.Width, this.DisplayArea.Height / (float) this.texture.Height); var imageOffset = new Vector2(this.DisplayArea.Width / 2F - this.texture.Width * scale / 2, this.DisplayArea.Height / 2F - this.texture.Height * scale / 2); batch.Draw(this.texture, this.DisplayArea.Location.ToVector2() + imageOffset, this.Color * alpha, 0, Vector2.Zero, scale, SpriteEffects.None, 0); } else { batch.Draw(this.texture, this.DisplayArea, this.Color * alpha); } base.Draw(time, batch, alpha); } } }