LADXHD/Base/UI/UiScrollableList.cs

91 lines
3.9 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.Things;
namespace ProjectZ.Base.UI
{
public class UiScrollableList : UiElement
{
public string[] ItemList = new string[0];
public int SelectionListItemHeight = 20;
public int? Selection;
public int? MouseOverSelection;
public int MaxLength;
public int ListLength;
public int ListPositionY;
public int SelectionListState
{
get => MathHelper.Clamp(_selectionListState, 0, ItemList.Length - (Rectangle.Height) / SelectionListItemHeight);
set => _selectionListState = value;
}
private int _selectionListState;
public UiScrollableList(Rectangle rectangle, string elementId, string screen, UiFunction update)
: base(elementId, screen)
{
Rectangle = rectangle;
UpdateFunction = update;
}
public override void Update()
{
base.Update();
Selection = null;
MouseOverSelection = null;
var scrollDirection = MathHelper.Clamp(InputHandler.LastMousState.ScrollWheelValue - InputHandler.MouseState.ScrollWheelValue, -1, 1);
if (InputHandler.MouseIntersect(Rectangle))
SelectionListState += scrollDirection;
MaxLength = Rectangle.Height / SelectionListItemHeight;
ListLength = MathHelper.Min(ItemList.Length, MaxLength);
ListPositionY = Rectangle.Height / 2 - (MaxLength * SelectionListItemHeight) / 2;
if (InputHandler.MouseIntersect(new Rectangle(Rectangle.X, Rectangle.Y + ListPositionY, Rectangle.Width, ListLength * SelectionListItemHeight)))
{
var selection = (InputHandler.MousePosition().Y - Rectangle.Y - ListPositionY) / SelectionListItemHeight;
if (!(selection == 0 && selection + SelectionListState > 0) && !(selection == ListLength - 1 && selection + SelectionListState != ItemList.Length - 1))
MouseOverSelection = selection + SelectionListState;
if (InputHandler.MouseLeftPressed())
{
MouseOverSelection = null;
if (selection == 0 && selection + SelectionListState > 0)
SelectionListState = 0;
else if (selection == ListLength - 1 && selection + SelectionListState != ItemList.Length - 1)
SelectionListState = ItemList.Length - Rectangle.Height / SelectionListItemHeight;
else
Selection = selection + SelectionListState;
}
}
}
public override void Draw(SpriteBatch spriteBatch)
{
for (var i = 0; i < ListLength; i++)
{
string strText;
if (i == 0 && i + SelectionListState > 0)
strText = "▲";
else if (i == ListLength - 1 && i + SelectionListState != ItemList.Length - 1)
strText = "▼";
else
strText = ItemList[i + SelectionListState];
var drawRectangle = new Rectangle(Rectangle.X, Rectangle.Y +
i * SelectionListItemHeight + ListPositionY, Rectangle.Width, SelectionListItemHeight);
//mark if the mouse is over
if (InputHandler.MouseIntersect(drawRectangle))
spriteBatch.Draw(Resources.SprWhite, drawRectangle, Color.Black * 0.25f);
Basics.DrawStringCenter(Font, strText,
new Rectangle(Rectangle.X, Rectangle.Y + i * SelectionListItemHeight + ListPositionY, Rectangle.Width, SelectionListItemHeight), Color.White);
}
}
}
}