LADXHD/Base/UI/UiNumberInput.cs
2023-12-14 17:21:22 -05:00

111 lines
4.4 KiB
C#

using System.Globalization;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using ProjectZ.InGame.Things;
namespace ProjectZ.Base.UI
{
public class UiNumberInput : UiElement
{
public float MinValue;
public float MaxValue;
public float Value;
public float OldValue;
private readonly UiFunction _onNumberUpdate;
private string _strValue;
private string _strNewValue;
private readonly float _stepSize;
private int _mouseWheel;
public UiNumberInput(Rectangle rectangle, SpriteFont font, float value, float minValue, float maxValue,
float stepSize, string elementId, string screen, UiFunction update, UiFunction onNumberUpdate)
: base(elementId, screen)
{
Rectangle = rectangle;
UpdateFunction = update;
_onNumberUpdate = onNumberUpdate;
Value = value;
_strValue = value.ToString(CultureInfo.InvariantCulture);
MinValue = minValue;
MaxValue = maxValue;
_stepSize = stepSize;
Font = font;
}
public override void Update()
{
base.Update();
OldValue = Value;
_strValue = Value.ToString(CultureInfo.InvariantCulture);
if (Selected)
{
_strNewValue = _strValue == "0" ? "" : _strValue;
var returnNumber = InputHandler.ReturnNumber();
if (returnNumber >= 0)
_strNewValue += returnNumber.ToString();
// delete last position
if (InputHandler.KeyPressed(Keys.Back) || InputHandler.MouseRightPressed(Rectangle))
_strNewValue = _strValue.Substring(0, _strValue.Length - 1);
// if everything was delete
if (_strNewValue == "")
_strNewValue = "0";
// add .
if (_stepSize % 1 > 0 && (InputHandler.KeyPressed(Keys.OemPeriod) || InputHandler.KeyPressed(Keys.OemComma)) && !_strValue.Contains("."))
_strNewValue += ".";
// change value when scrolling
if (InputHandler.MouseState.ScrollWheelValue > _mouseWheel && float.Parse(_strNewValue, CultureInfo.InvariantCulture) + _stepSize <= MaxValue)
_strNewValue = (float.Parse(_strNewValue, CultureInfo.InvariantCulture) + _stepSize).ToString(CultureInfo.InvariantCulture);
if (InputHandler.MouseState.ScrollWheelValue < _mouseWheel && float.Parse(_strNewValue, CultureInfo.InvariantCulture) - _stepSize >= MinValue)
_strNewValue = (float.Parse(_strNewValue, CultureInfo.InvariantCulture) - _stepSize).ToString(CultureInfo.InvariantCulture);
InputHandler.ResetInputState();
float.TryParse(_strNewValue, NumberStyles.Float, CultureInfo.InvariantCulture, out var newValue);
if (newValue <= MaxValue &&
(!_strNewValue.Contains(".") || _strNewValue.Split('.')[1].Length <= (_stepSize % 1).ToString(CultureInfo.InvariantCulture).Length - 2))
_strValue = _strNewValue;
float.TryParse(_strValue, NumberStyles.Float, CultureInfo.InvariantCulture, out Value);
if (OldValue != Value && Value >= MinValue)
_onNumberUpdate?.Invoke(this);
}
else
{
if (Value != (int)(Value / _stepSize) * _stepSize)
{
Value = (int)(Value / _stepSize) * _stepSize;
_strValue = Value.ToString(CultureInfo.InvariantCulture);
_onNumberUpdate(this);
}
}
_mouseWheel = InputHandler.MouseState.ScrollWheelValue;
}
public override void Draw(SpriteBatch spriteBatch)
{
// draw the background
spriteBatch.Draw(Resources.SprWhite, Rectangle, BackgroundColor);
Label = _strValue + (Selected ? "|" : "");
// draw the value
var textPosition = new Vector2(Rectangle.X + 5, (int)(Rectangle.Y + Rectangle.Height / 2 - Font.MeasureString(Label).Y / 2));
spriteBatch.DrawString(Font, Label, textPosition, FontColor);
}
}
}