using System;
using System.Numerics;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Maths;
namespace Robust.Client.UserInterface
{
///
/// Utilities for working with tooltips.
///
public static class Tooltips
{
///
/// Positions the provided control as a tooltip within the bounds of its parent UserInterfaceManager screen
/// under the current mouse position. Sizing Based on its current combined minimum size.
/// Defaults to the top left corner
/// of the control being placed at the mouse position but
/// adjusting to a different corner if the control would go beyond the edge of the bounds.
///
/// control to position (current size will be used to determine bounds)
public static void PositionTooltip(Control tooltip)
{
PositionTooltip(tooltip.Root!.Size,
tooltip.UserInterfaceManager.MousePositionScaled.Position,
tooltip);
}
///
/// Positions the provided control as a tooltip within the provided screenBounds based on its current
/// combined minimum size.
/// Defaults to the top left corner
/// of the control being placed at the indicated position but
/// adjusting to a different corner if the control would go beyond the edge of the bounds.
///
/// max x and y screen coordinates for the tooltip to occupy, tooltip
/// will be shifted to avoid exceeding these bounds.
/// position to place the tooltip at, in screen coordinates
/// control to position (current size will be used to determine bounds)
public static void PositionTooltip(Vector2 screenBounds, Vector2 screenPosition, Control tooltip)
{
tooltip.Measure(Vector2Helpers.Infinity);
var combinedMinSize = tooltip.DesiredSize;
// If it overflows right bounds then just place left on the edge.
var right = MathF.Min(screenPosition.X + combinedMinSize.X, screenBounds.X);
// However, better to clamp the end of the tooltip instead of the start.
var left = MathF.Max(0f, right - combinedMinSize.X);
var bottom = MathF.Min(screenPosition.Y, screenBounds.Y);
var top = MathF.Max(0f, bottom - combinedMinSize.Y);
LayoutContainer.SetPosition(tooltip, new Vector2(left, top));
}
}
}