@@ -63,12 +63,13 @@ public static void ControlDeleted(Base control)
6363 /// <param name="skin"></param>
6464 public static void RenderToolTip ( Skin . Base skin )
6565 {
66- if ( _activeTooltipParent ? . Tooltip == default )
66+ var activeTooltipParent = _activeTooltipParent ;
67+ if ( activeTooltipParent ? . Tooltip == default )
6768 {
6869 return ;
6970 }
7071
71- var canvas = _activeTooltipParent . Canvas ;
72+ var canvas = activeTooltipParent . Canvas ;
7273 if ( canvas == default )
7374 {
7475 return ;
@@ -78,23 +79,47 @@ public static void RenderToolTip(Skin.Base skin)
7879
7980 var oldRenderOffset = render . RenderOffset ;
8081 var mousePos = Input . InputHandler . MousePosition ;
81- var bounds = _activeTooltipParent . Tooltip . Bounds ;
82+ var tooltipBounds = activeTooltipParent . Tooltip . Bounds ;
8283
8384 var offset = Util . FloatRect (
84- mousePos . X - bounds . Width * 0.5f ,
85- mousePos . Y - bounds . Height ,
86- bounds . Width ,
87- bounds . Height
85+ mousePos . X - tooltipBounds . Width * 0.5f ,
86+ mousePos . Y - tooltipBounds . Height ,
87+ tooltipBounds . Width ,
88+ tooltipBounds . Height
8889 ) ;
8990
90- offset = Util . ClampRectToRect ( offset , canvas . Bounds ) ;
91+ var textContainerMatch = activeTooltipParent . FindMatchingNodes < ITextContainer > ( ) ;
92+
93+ if ( textContainerMatch is { Highest : { } highest , Closest : { } closest } )
94+ {
95+ var closestBounds = closest . BoundsGlobal ;
96+ var highestBounds = highest . BoundsGlobal ;
97+ if ( highestBounds . Top > tooltipBounds . Height )
98+ {
99+ offset . Y = highestBounds . Top - tooltipBounds . Height ;
100+ }
101+ else
102+ {
103+ // TODO: check if we have enough space below
104+ offset . Y = highestBounds . Bottom ;
105+ }
106+
107+ offset . X = highestBounds . X + ( highestBounds . Width - tooltipBounds . Width ) / 2 ;
108+ var closestBoundsX = closestBounds . X + closestBounds . Width * 0.25f ;
109+ if ( offset . X > closestBoundsX )
110+ {
111+ offset . X = closestBounds . X + ( closestBounds . Width - tooltipBounds . Width ) / 2 ;
112+ }
113+ }
114+
115+ var clampedOffset = Util . ClampRectToRect ( offset , canvas . Bounds ) ;
91116
92117 //Calculate offset on screen bounds
93- render . AddRenderOffset ( offset ) ;
118+ render . AddRenderOffset ( clampedOffset ) ;
94119 render . EndClip ( ) ;
95120
96- skin . DrawToolTip ( _activeTooltipParent . Tooltip ) ;
97- _activeTooltipParent . Tooltip . DoRender ( skin ) ;
121+ skin . DrawToolTip ( activeTooltipParent . Tooltip ) ;
122+ activeTooltipParent . Tooltip . DoRender ( skin ) ;
98123
99124 render . RenderOffset = oldRenderOffset ;
100125 }
0 commit comments