using System; using UnityEngine.UIElements; namespace RosettaUI.UIToolkit { public interface IClampFreeSlider where TValue : IComparable { BaseSlider Slider { get; } VisualElement InputField { get; } } public static class SliderInFieldExtension { private const string UssClassName = "rosettaui-slider-in-field"; public static void SetShowInputField(this IClampFreeSlider clampFreeSlider, bool showInputField) where TValue : IComparable { clampFreeSlider.InputField.style.display = showInputField ? DisplayStyle.Flex : DisplayStyle.None; } public static void Initialize(this TClampFreeSlider sliderInField) where TClampFreeSlider : BaseField, IClampFreeSlider where TValue : IComparable { sliderInField.AddToClassList(UssClassName); var slider = sliderInField.Slider; slider.RegisterValueChangedCallback(evt => sliderInField.value = evt.newValue); // 矢印キーでスライダーを動かしたときにフォーカスも左右のエレメントに移動するのを抑制 slider.RegisterCallback(evt => { if (evt.direction is NavigationMoveEvent.Direction.Left or NavigationMoveEvent.Direction.Right) { evt.StopPropagationAndFocusControllerIgnoreEvent(); } }); sliderInField.Insert(0, slider); } } }