using System; using System.Linq; using UnityEngine; using UnityEngine.UIElements; namespace UnityEditor.VFX.UI { abstract class NumericPropertyRM : SimpleUIPropertyRM { protected NumericPropertyRM(IPropertyRMProvider controller, float labelWidth) : base(controller, labelWidth) { } public override float GetPreferredControlWidth() { var range = m_Provider.attributes.FindRange(); return HasValidRange(range) ? 120 : 60; } protected override void UpdateIndeterminate() { if (field is IMixedValueSupport mixedValueSupport) { mixedValueSupport.showMixedValue = indeterminate; } if (m_Slider != null) { m_Slider.isIndeterminate = indeterminate; } } private bool HasValidRange(Vector2 range) { return range != Vector2.zero && !float.IsPositiveInfinity(range.y) && range.x < range.y; } private VFXBaseSliderField m_Slider; private VisualElement m_TextField; protected abstract VisualElement CreateSimpleField(string label); protected abstract VFXBaseSliderField CreateSliderField(string label); protected abstract T FilterValue(Vector2 range, T value); public override INotifyValueChanged CreateField() { Vector2 range = m_Provider.attributes.FindRange(); VisualElement createdField; if (!HasValidRange(range)) { createdField = CreateSimpleField(string.IsNullOrEmpty(provider.name) ? " " : ObjectNames.NicifyVariableName(provider.name)); m_TextField = createdField.Q(null, "unity-text-element__selectable"); if (m_TextField != null) { m_TextField.RegisterCallback(OnKeyDown, TrickleDown.TrickleDown); m_TextField.RegisterCallback(OnFocusLost, TrickleDown.TrickleDown); } } else { m_Slider = CreateSliderField(ObjectNames.NicifyVariableName(m_Provider.name)); m_Slider.SetOnValueDragStarted(ValueDragStarted); m_Slider.SetOnValueDragFinished(ValueDragFinished); m_Slider.RegisterCallback(OnFocusLost); m_Slider.range = range; if (IsLogarithmic() && m_Provider.attributes.FindLogarithmicBase() is var logBase and > 0) { bool snapToPower = m_Provider.attributes.FindSnapToPower(); if (range.x > 0) { m_Slider.scale = new LogarithmicSliderScale(range, logBase, snapToPower); } else { Debug.LogWarning($"Property `{this.provider.name}`: logarithmic scale does not support range minimum value <=0\nFallback to linear scale"); } } createdField = m_Slider; } if (createdField.Q