using System.Diagnostics.CodeAnalysis; using UnityEngine; using UnityEngine.UIElements; namespace RosettaUI.UIToolkit { /// /// Color, Gradient, AnimationCurve などのプレビューを表示するフィールド。 /// [SuppressMessage("ReSharper", "StaticMemberInGenericType")] [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] public abstract class PreviewFieldBase : BaseField where TInput : VisualElement { // ReSharper disable once ConvertToConstant.Global public new static readonly string ussClassName = "rosettaui-preview-base-field"; public new static readonly string labelUssClassName = ussClassName + "__label"; public new static readonly string inputUssClassName = ussClassName + "__input"; protected readonly TInput inputField; protected PreviewFieldBase(string label, TInput visualInput) : base(label, visualInput) { AddToClassList(ussClassName); labelElement.AddToClassList(labelUssClassName); visualInput.AddToClassList(inputUssClassName); visualInput.RegisterCallback(OnClickInput); RegisterCallback(OnNavigationSubmit); inputField = visualInput; } private void OnClickInput(ClickEvent evt) { ShowEditor(evt.position); evt.StopPropagation(); } private void OnNavigationSubmit(NavigationSubmitEvent evt) { var mousePosition = Input.mousePosition; var position = new Vector2( mousePosition.x, Screen.height - mousePosition.y ); var screenRect = new Rect(0f, 0f, Screen.width, Screen.height); if (!screenRect.Contains(position)) { position = worldBound.center; } ShowEditor(position); evt.StopPropagation(); } protected abstract void ShowEditor(Vector3 position); } }