using System; using System.Globalization; using System.Xml.Linq; using Barotrauma.LuaCs.Data; using Microsoft.Toolkit.Diagnostics; using Microsoft.Xna.Framework; using OneOf; namespace Barotrauma.LuaCs.Data; public abstract class SettingRangeBase : SettingEntry, ISettingRangeBase where T : IEquatable, IConvertible { public SettingRangeBase(IConfigInfo configInfo, Func, bool> valueChangePredicate) : base(configInfo, valueChangePredicate) { } public T MinValue { get; protected init; } public T MaxValue { get; protected init; } public int IncrementalSteps { get; protected init; } } public class SettingRangeFloat : SettingRangeBase { public class RangeFactory : ISettingBase.IFactory { public SettingRangeFloat CreateInstance(IConfigInfo configInfo, Func, bool> valueChangePredicate) { Guard.IsNotNull(configInfo, nameof(configInfo)); return new SettingRangeFloat(configInfo, valueChangePredicate); } } public SettingRangeFloat(IConfigInfo configInfo, Func, bool> valueChangePredicate) : base(configInfo, valueChangePredicate) { // funny values in case they forget to set them in the config. MinValue = configInfo.Element.GetAttributeFloat("Min", float.MinValue); MaxValue = configInfo.Element.GetAttributeFloat("Max", float.MaxValue); IncrementalSteps = configInfo.Element.GetAttributeInt("Steps", 3); } public override bool TrySetValue(float value) { if (value > MaxValue || value < MinValue) { return false; } return base.TrySetValue(value); } #if CLIENT public override void AddDisplayComponent(GUILayoutGroup layoutGroup, Vector2 relativeSize, Action onSerializedValue) { GUIUtil.Slider(layoutGroup, new Vector2(MinValue, MaxValue), IncrementalSteps, labelFunc: val => { return val.ToString("G4", CultureInfo.InvariantCulture); }, Value, setter: val => { onSerializedValue?.Invoke(val.ToString()); }, TextManager.Get(this.GetDisplayInfo().Tooltip), relativeSize); } #endif } public class SettingRangeInt : SettingRangeBase { public class RangeFactory : ISettingBase.IFactory { public SettingRangeInt CreateInstance(IConfigInfo configInfo, Func, bool> valueChangePredicate) { Guard.IsNotNull(configInfo, nameof(configInfo)); return new SettingRangeInt(configInfo, valueChangePredicate); } } public SettingRangeInt(IConfigInfo configInfo, Func, bool> valueChangePredicate) : base(configInfo, valueChangePredicate) { // funny values in case they forget to set them in the config. MinValue = configInfo.Element.GetAttributeInt("Min", int.MinValue); MaxValue = configInfo.Element.GetAttributeInt("Max", int.MaxValue); IncrementalSteps = configInfo.Element.GetAttributeInt("Steps", 3); } public override bool TrySetValue(int value) { if (value > MaxValue || value < MinValue) { return false; } return base.TrySetValue(value); } #if CLIENT public override void AddDisplayComponent(GUILayoutGroup layoutGroup, Vector2 relativeSize, Action onSerializedValue) { GUIUtil.Slider(layoutGroup, new Vector2(MinValue, MaxValue), IncrementalSteps, labelFunc: val => { return ((int)val).ToString(); }, Value, setter: val => { onSerializedValue?.Invoke(((int)val).ToString()); }, TextManager.Get(this.GetDisplayInfo().Tooltip), relativeSize); } #endif }