r2mods/ilspy_dump/ror2_csproj/RoR2.UI/SettingsSlider.cs

154 lines
3.4 KiB
C#

using System.Globalization;
using UnityEngine;
using UnityEngine.UI;
namespace RoR2.UI;
[RequireComponent(typeof(MPEventSystemLocator))]
public class SettingsSlider : BaseSettingsControl
{
public Slider slider;
public HGTextMeshProUGUI valueText;
public float minValue;
public float maxValue;
[Tooltip("When this setting is turned 'on' as part of a subsection, set the value to defaultEnabledValue. maxValue is used otherwise ")]
public bool overrideDefaultEnabledValue;
public float defaultEnabledValue = 1f;
public string formatString = "{0:0.00}";
private bool listenerAdded;
private MPEventSystemLocator systemLocator;
private MPInputModule inputModule;
private float sliderSpeed = 1f;
private float prevTimestamp;
private float accumulatedTime;
private float prevDirection;
private const float timePerSpeedLevel = 1f;
private const float boostPerSpeedLevel = 4f;
private const float maxSpeedLevel = 10f;
protected new void Awake()
{
base.Awake();
if ((bool)slider)
{
slider.minValue = minValue;
slider.maxValue = maxValue;
if (!listenerAdded)
{
slider.onValueChanged.AddListener(OnSliderValueChanged);
}
}
listenerAdded = true;
systemLocator = GetComponent<MPEventSystemLocator>();
}
private new void OnEnable()
{
UpdateControls();
if ((bool)slider)
{
slider.minValue = minValue;
slider.maxValue = maxValue;
if (!listenerAdded)
{
slider.onValueChanged.AddListener(OnSliderValueChanged);
}
}
listenerAdded = true;
}
private void OnSliderValueChanged(float newValue)
{
if (!base.inUpdateControls)
{
SubmitSetting(TextSerialization.ToStringInvariant(newValue));
}
}
private void OnInputFieldSubmit(string newString)
{
if (!base.inUpdateControls && TextSerialization.TryParseInvariant(newString, out float result))
{
SubmitSetting(TextSerialization.ToStringInvariant(result));
}
}
public override void SetSettingState(bool turnedOn)
{
if (!turnedOn && !Mathf.Approximately(slider.value, minValue))
{
defaultEnabledValue = slider.value;
}
slider.value = ((!turnedOn) ? minValue : (overrideDefaultEnabledValue ? defaultEnabledValue : maxValue));
}
public override bool IsSettingEnabled()
{
return slider.normalizedValue > 0f;
}
protected override void OnUpdateControls()
{
base.OnUpdateControls();
if (TextSerialization.TryParseInvariant(GetCurrentValue(), out float result))
{
float num = Mathf.Clamp(result, minValue, maxValue);
if ((bool)slider)
{
slider.value = num;
}
if ((bool)valueText)
{
valueText.text = string.Format(CultureInfo.InvariantCulture, formatString, num);
}
}
}
private float CalculateSliderSpeed(float deltaTime, float direction)
{
if (inputModule == null)
{
inputModule = systemLocator.eventSystem.GetComponent<MPInputModule>();
}
float num = 1.5f / inputModule.inputActionsPerSecond;
if (deltaTime <= num * 2f && direction == prevDirection)
{
accumulatedTime += deltaTime;
}
else
{
accumulatedTime = 0f;
}
prevDirection = direction;
return Mathf.Min(10f, 1f + Mathf.Floor(accumulatedTime / 1f) * 4f);
}
public void MoveSlider(float delta)
{
float timeSinceLevelLoad = Time.timeSinceLevelLoad;
float deltaTime = timeSinceLevelLoad - prevTimestamp;
prevTimestamp = timeSinceLevelLoad;
sliderSpeed = CalculateSliderSpeed(deltaTime, Mathf.Sign(delta));
if ((bool)slider)
{
slider.normalizedValue += delta * sliderSpeed;
}
}
}