using UnityEngine;
using UnityEngine.UIElements;
namespace RosettaUI.UIToolkit.AnimationCurveEditor
{
///
/// Parameter display popup shown when moving a ControlPoint
///
public class ControlPointDisplayPositionPopup : Label
{
private const string ParameterPopupClassName = "rosettaui-animation-curve-editor__control-point-display-position-popup";
public Vector2 positionOffset = new(2f, -2f);
private readonly PreviewTransform _previewTransform;
public ControlPointDisplayPositionPopup(PreviewTransform previewTransform)
{
_previewTransform = previewTransform;
AddToClassList(ParameterPopupClassName);
Hide();
}
public void Show()
{
style.display = DisplayStyle.Flex;
}
public void Hide()
{
style.display = DisplayStyle.None;
}
public void Update(Vector2 positionLeftTop, Vector2 keyframePosition)
{
SetKeyframePosition(keyframePosition);
SetPosition(positionLeftTop);
}
public void SetKeyframePosition(Vector2 keyframePosition)
{
const int maxPrecision = 4;
var gridViewport = _previewTransform.PreviewGridViewport;
var orderX = Mathf.Max(0, maxPrecision - Mathf.CeilToInt(gridViewport.XOrder));
var orderY = Mathf.Max(0, maxPrecision - Mathf.CeilToInt(gridViewport.YOrder));
var timeString = keyframePosition.x.ToString($"N{orderX}");
var valueString = keyframePosition.y.ToString($"N{orderY}");
text = $"{timeString}, {valueString}";
}
public void SetPosition(Vector2 positionLeftTop)
{
var positionWithOffset = positionLeftTop + positionOffset;
style.left = positionWithOffset.x;
style.top = positionWithOffset.y;
this.RegisterCallbackOnce(_ =>
{
this.ClampElementToParent();
});
}
}
}