// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; using System.Globalization; using FlaxEditor.Utilities; using FlaxEngine; namespace FlaxEditor.GUI.Input { /// /// Floating point value editor. /// /// [HideInEditor] public class FloatValueBox : ValueBox { /// public override float Value { get => _value; set { value = Mathf.Clamp(value, _min, _max); if (Math.Abs(_value - value) > Mathf.Epsilon) { _value = value; UpdateText(); OnValueChanged(); } } } /// public override float MinValue { get => _min; set { if (!Mathf.NearEqual(_min, value)) { if (value > _max) throw new ArgumentException(); _min = value; Value = Value; } } } /// public override float MaxValue { get => _max; set { if (!Mathf.NearEqual(_max, value)) { if (value < _min) throw new ArgumentException(); _max = value; Value = Value; } } } /// /// Initializes a new instance of the class. /// /// The value. /// The x location. /// The y location. /// The width. /// The minimum value. /// The maximum value. /// The slide speed. public FloatValueBox(float value, float x = 0, float y = 0, float width = 120, float min = float.MinValue, float max = float.MaxValue, float slideSpeed = 1) : base(Mathf.Clamp(value, min, max), x, y, width, min, max, slideSpeed) { TryUseAutoSliderSpeed(); UpdateText(); } private void TryUseAutoSliderSpeed() { var range = _max - _min; if (Mathf.IsOne(_slideSpeed) && range > Mathf.Epsilon * 200.0f && range < 1000000.0f) { _slideSpeed = range * 0.01f; } } /// /// Sets the value limits. /// /// The minimum value (bottom range). /// The maximum value (upper range). public void SetLimits(float min, float max) { _min = min; _max = Mathf.Max(_min, max); Value = Value; } /// /// Sets the limits from the attribute. /// /// The limits. public void SetLimits(RangeAttribute limits) { _min = limits.Min; _max = Mathf.Max(_min, limits.Max); TryUseAutoSliderSpeed(); Value = Value; } /// /// Sets the limits from the attribute. /// /// The limits. public void SetLimits(LimitAttribute limits) { _min = limits.Min; _max = Mathf.Max(_min, limits.Max); _slideSpeed = limits.SliderSpeed; TryUseAutoSliderSpeed(); Value = Value; } /// /// Sets the limits from the other . /// /// The other. public void SetLimits(FloatValueBox other) { _min = other._min; _max = other._max; _slideSpeed = other._slideSpeed; Value = Value; } /// protected sealed override void UpdateText() { SetText(Utilities.Utils.FormatFloat(_value)); } /// protected override void TryGetValue() { try { var value = ShuntingYard.Parse(Text); Value = (float)value; } catch (Exception ex) { // Fall back to previous value Editor.LogWarning(ex); } } /// protected override void ApplySliding(float delta) { Value = _startSlideValue + delta; } } }