419class SCR_ScriptedWidgetTooltipPreset
421 [
Attribute(
"",
UIWidgets.Auto,
"Custom tag, used for finding this preset at run time.")]
428 protected ref SCR_TooltipPositionPreset m_MousePositionSettings;
431 protected ref SCR_TooltipPositionPreset m_GamepadPositionSettings;
433 [
Attribute(
"1",
UIWidgets.CheckBox,
"Defines if the tooltip should animate to follow mouse cursor or remain at initial position")]
434 bool m_bFollowCursor;
440 protected vector m_vFixedPosition;
444 [
Attribute(
"0",
UIWidgets.CheckBox,
desc:
"Should the proxy adapt to the content: the proxy is used to check for overflowing and contains the actual Content layout. Giving it a fixed size will prevent slide in effect for overflowing tooltips. This will NOT influence the look of the content layout, as long as it fits inside the proxy and it's not set to stretch")]
445 bool m_bSizeToContent;
450 [
Attribute(
desc:
"Fixed proxy layout size. The proxy is used to check for overflowing and contains the actual Content layout. This will NOT influence the look of the comntent layout, as long as it fits inside the proxy and it's not set to stretch")]
459 float m_fInterpolationSpeed;
462 float m_fUpdateFrequency;
465 bool m_bShowDebugBorder;
479 return m_Content.GetContentRoot();
485 bool GetGoalPosition(
Widget tooltipContent,
Widget hoverWidget, out
vector goalPosition, out
vector goalAlignment, out
vector goalAlpha,
bool force =
false)
487 vector tooltipSize = GetTooltipSize(tooltipContent);
488 SCR_TooltipPositionPreset positionSettings = GetInputPositionSettings();
490 if (!positionSettings || (positionSettings.m_eAnchor != SCR_ETooltipAnchor.CURSOR && !force))
493 positionSettings.GetGoalPosition(tooltipSize, hoverWidget, m_vFixedPosition, goalPosition, goalAlignment, goalAlpha);
504 float xTooltipSize = workspace.DPIScale(m_vSize[0]);
505 float yTooltipSize = workspace.DPIScale(m_vSize[1]);
506 if (m_bSizeToContent && tooltip)
507 tooltip.GetScreenSize(xTooltipSize, yTooltipSize);
509 size[0] = xTooltipSize;
510 size[1] = yTooltipSize;
515 SCR_TooltipPositionPreset GetInputPositionSettings()
517 bool isUsingMouse =
GetGame().GetInputManager().GetLastUsedInputDevice() == EInputDeviceType.MOUSE;
519 return m_MousePositionSettings;
521 return m_GamepadPositionSettings;
531 ref array<ref SCR_ScriptedWidgetTooltipPreset> m_aPresets;
535 SCR_ScriptedWidgetTooltipPreset FindPreset(
string tag)
537 foreach (SCR_ScriptedWidgetTooltipPreset preset : m_aPresets)
539 if (preset.m_sTag == tag)
549class SCR_TooltipPositionPreset
551 [
Attribute(
"0",
UIWidgets.ComboBox,
"Where to position the Tooltip",
"", ParamEnumArray.FromEnum(SCR_ETooltipAnchor))]
552 SCR_ETooltipAnchor m_eAnchor;
557 [
Attribute(
"0",
UIWidgets.ComboBox,
"Vertical Alignment",
"", ParamEnumArray.FromEnum(SCR_ETooltipAlignmentVertical))]
558 SCR_ETooltipAlignmentVertical m_eVerticalAlignment;
560 [
Attribute(
"8 20 0",
desc:
"Tooltip offset from cursor or desired position")]
563 [
Attribute(
"0",
UIWidgets.ComboBox,
"How to deal with overflow",
"", ParamEnumArray.FromEnum(SCR_ETooltipOverflowHandling))]
564 SCR_ETooltipOverflowHandling m_eOverflowHandling;
566 const float ALIGNMENT_CENTER = 0.5;
567 const float ALIGNMENT_LEFT_TOP = 0;
568 const float ALIGNMENT_RIGHT_DOWN = 1;
574 float xHover, yHover;
575 float xHoverSize, yHoverSize;
580 hoverWidget.GetScreenPos(xHover, yHover);
583 hoverWidget.GetScreenSize(xHoverSize, yHoverSize);
587 int xCursor, yCursor;
592 float xWorkspaceSize, yWorkspaceSize;
593 workspace.GetScreenSize(xWorkspaceSize, yWorkspaceSize);
600 float xAlignment, yAlignment;
601 float xTargetSize, yTargetSize;
605 case SCR_ETooltipAnchor.CURSOR:
610 case SCR_ETooltipAnchor.HOVERED_WIDGET:
613 xTargetSize = xHoverSize;
614 yTargetSize = yHoverSize;
617 case SCR_ETooltipAnchor.ABSOLUTE:
618 xGoal = absolutePosition[0];
619 yGoal = absolutePosition[1];
623 CalculateGoalPosition(m_eHorizontalAlignment, xTargetSize, tooltipSize[0], xWorkspaceSize, xGoal, xOffset, xAlignment);
624 CalculateGoalPosition(m_eVerticalAlignment, yTargetSize, tooltipSize[1], yWorkspaceSize, yGoal, yOffset, yAlignment);
627 if (xWorkspaceSize == 0)
630 if (yWorkspaceSize == 0)
633 goalAlpha[0] = (xGoal + workspace.DPIScale(xOffset)) / xWorkspaceSize;
634 goalAlpha[1] = (yGoal + workspace.DPIScale(yOffset)) / yWorkspaceSize;
637 goalPosition[0] = workspace.DPIUnscale(xGoal + workspace.DPIScale(xOffset));
638 goalPosition[1] = workspace.DPIUnscale(yGoal + workspace.DPIScale(yOffset));
641 goalAlignment[0] = xAlignment;
642 goalAlignment[1] = yAlignment;
646 protected void CalculateGoalPosition(
int alignmentCase,
float targetSize,
float tooltipSize,
float maxAreaSize, inout
float desiredPos, inout
float offset, inout
float alignment)
648 switch (alignmentCase)
654 desiredPos = desiredPos + (targetSize * ALIGNMENT_CENTER);
655 alignment = ALIGNMENT_CENTER;
659 desiredPos = desiredPos + targetSize;
660 alignment = ALIGNMENT_RIGHT_DOWN;
664 alignment = ALIGNMENT_RIGHT_DOWN;
668 desiredPos = desiredPos + targetSize;
672 CheckOverflow(tooltipSize, maxAreaSize, desiredPos, offset, alignment);
678 bool CheckOverflow(
float tooltipSize,
float maxAreaSize, inout
float desiredPos, inout
float offset, inout
float alignment)
680 SCR_ETooltipOverflowType overflowType;
683 if (alignment < ALIGNMENT_CENTER && desiredPos + offset + tooltipSize > maxAreaSize)
685 overflowType = SCR_ETooltipOverflowType.RIGHT;
689 else if (alignment > ALIGNMENT_CENTER && desiredPos + offset - tooltipSize < 0)
691 overflowType = SCR_ETooltipOverflowType.LEFT;
697 if (desiredPos + offset + (tooltipSize * ALIGNMENT_CENTER) > maxAreaSize)
698 overflowType = SCR_ETooltipOverflowType.CENTER_RIGHT;
700 else if (desiredPos + offset - (tooltipSize * ALIGNMENT_CENTER) < 0)
701 overflowType = SCR_ETooltipOverflowType.CENTER_LEFT;
704 if (overflowType == SCR_ETooltipOverflowType.NONE)
711 if (m_eOverflowHandling == SCR_ETooltipOverflowHandling.INVERT)
713 if (alignment == ALIGNMENT_CENTER)
714 desiredPos = Math.Clamp(desiredPos, offset + (tooltipSize * ALIGNMENT_CENTER), maxAreaSize - (offset + (tooltipSize * ALIGNMENT_CENTER)));
716 alignment = 1 - alignment;
722 switch (overflowType)
724 case SCR_ETooltipOverflowType.LEFT: desiredPos = tooltipSize + offset;
break;
725 case SCR_ETooltipOverflowType.RIGHT: desiredPos = maxAreaSize - tooltipSize - offset;
break;
726 case SCR_ETooltipOverflowType.CENTER_LEFT: desiredPos = (tooltipSize * ALIGNMENT_CENTER) + offset;
break;
727 case SCR_ETooltipOverflowType.CENTER_RIGHT: desiredPos = maxAreaSize - (tooltipSize * ALIGNMENT_CENTER) - offset;
break;
735 float GetContentAlignmentHorizontal()
737 switch (m_eHorizontalAlignment)
746 return ALIGNMENT_LEFT_TOP;
750 float GetContentAlignmentVertical()
752 switch (m_eVerticalAlignment)
754 case SCR_ETooltipAlignmentVertical.TOP:
return ALIGNMENT_LEFT_TOP;
755 case SCR_ETooltipAlignmentVertical.ABOVE:
return ALIGNMENT_RIGHT_DOWN;
756 case SCR_ETooltipAlignmentVertical.BELOW:
return ALIGNMENT_LEFT_TOP;
757 case SCR_ETooltipAlignmentVertical.BOTTOM:
return ALIGNMENT_RIGHT_DOWN;
758 case SCR_ETooltipAlignmentVertical.CENTER:
return ALIGNMENT_CENTER;
761 return ALIGNMENT_LEFT_TOP;