1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-26 06:28:35 +01:00
MLEM/MLEM.Ui/Elements/Image.cs

63 lines
2.8 KiB
C#
Raw Normal View History

2019-08-27 21:44:02 +02:00
using System;
2019-08-09 22:23:16 +02:00
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;
2019-09-13 11:53:28 +02:00
this.IsHidden = this.texture == null;
if (this.scaleToImage)
this.SetAreaDirty();
}
}
}
private bool scaleToImage;
public bool ScaleToImage {
get => this.scaleToImage;
set {
if (this.scaleToImage != value) {
this.scaleToImage = value;
this.SetAreaDirty();
}
}
}
2019-08-27 21:44:02 +02:00
public bool MaintainImageAspect = true;
2019-09-12 18:44:24 +02:00
public SpriteEffects ImageEffects = SpriteEffects.None;
public Vector2 ImageScale = Vector2.One;
public float ImageRotation;
2019-08-09 22:23:16 +02:00
public Image(Anchor anchor, Vector2 size, TextureRegion texture, bool scaleToImage = false) : base(anchor, size) {
this.texture = texture;
this.scaleToImage = scaleToImage;
2019-08-28 18:27:17 +02:00
this.CanBeSelected = false;
2019-09-11 20:10:28 +02:00
this.CanBeMoused = false;
2019-08-09 22:23:16 +02:00
}
protected override Point CalcActualSize(Rectangle parentArea) {
2019-09-13 11:53:28 +02:00
return this.texture != null && this.scaleToImage ? this.texture.Size : base.CalcActualSize(parentArea);
2019-08-09 22:23:16 +02:00
}
public override void Draw(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, Matrix matrix) {
2019-09-12 18:44:24 +02:00
var center = new Vector2(this.texture.Width / 2F, this.texture.Height / 2F);
2019-08-27 21:44:02 +02:00
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);
2019-09-12 18:44:24 +02:00
batch.Draw(this.texture, this.DisplayArea.Location.ToVector2() + center * scale + imageOffset, this.Color * alpha, this.ImageRotation, center, scale * this.ImageScale, this.ImageEffects, 0);
2019-08-27 21:44:02 +02:00
} else {
2019-09-12 18:44:24 +02:00
var scale = new Vector2(1F / this.texture.Width, 1F / this.texture.Height) * this.DisplayArea.Size.ToVector2();
batch.Draw(this.texture, this.DisplayArea.Location.ToVector2() + center * scale, this.Color * alpha, this.ImageRotation, center, scale * this.ImageScale, this.ImageEffects, 0);
2019-08-27 21:44:02 +02:00
}
base.Draw(time, batch, alpha, blendState, samplerState, matrix);
2019-08-09 22:23:16 +02:00
}
}
}