mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
111 lines
4.4 KiB
C#
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);
|
|
}
|
|
}
|
|
} |