using System; using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace Ichni.UI { public partial class ValueModifier : SettingsUIElementBase { public int intValue; public int intStep; public int intMin; public int intMax; public ModifyValueButton increaseButton; public ModifyValueButton decreaseButton; public TMP_Text valueText; public Image barImage; public string prefix; public string suffix; public bool showPositiveMark; public void SetUp(int initialValue, int step) { intStep = step; intMin = int.MinValue; intMax = int.MaxValue; base.SetUp(); increaseButton.SetUpButton(IncreaseValue, IncreaseValue); decreaseButton.SetUpButton(DecreaseValue, DecreaseValue); SetValue(initialValue); UpdateValueText(); } public void SetMinMax(int min, int max) { intMin = Convert.ToInt32(min); intMax = Convert.ToInt32(max); UpdateValueText(); } public void SetPrefixAndSuffix(string prefix, string suffix, bool showPositiveMark) { this.showPositiveMark = showPositiveMark; this.prefix = prefix; this.suffix = suffix; UpdateValueText(); } } public partial class ValueModifier { public int GetNearestValue(float percentage) { int valueRange = intMax - intMin; int stepCount = Mathf.RoundToInt(percentage * valueRange / intStep); int nearestValue = intMin + stepCount * intStep; return nearestValue; } } public partial class ValueModifier { public void SetValue(int value, bool usingAnimation = false) { intValue = Convert.ToInt32(value); intValue = Mathf.Clamp(intValue, intMin, intMax); if (usingAnimation) UpdateValueTextTween(); else UpdateValueText(); } public void IncreaseValue() { SetValue(intValue + 1, true); } public void DecreaseValue() { SetValue(intValue - 1, true); } public void UpdateValueText() { valueText.text = prefix + (showPositiveMark && intValue > 0 ? "+" : "") + intValue.ToString() + suffix; var target = new Vector2((float)(intValue - intMin) / (intMax - intMin) * 560, 20); barImage.rectTransform.sizeDelta = target; updateValueAction?.Invoke(); } private Tween tween; private int LastValue = -1; public void UpdateValueTextTween() { if (LastValue == intValue) return; tween?.Complete(); valueText.text = prefix + (showPositiveMark && intValue > 0 ? "+" : "") + intValue.ToString() + suffix; var target = new Vector2((float)(intValue - intMin) / (intMax - intMin) * 560, 20); tween = barImage.rectTransform.DOSizeDelta(target, 0.2f).SetEase(Ease.OutExpo).Play(); LastValue = intValue; updateValueAction?.Invoke(); } public int GetValue() { return intValue; } } }