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)); } } }