/// <summary>Displays the tooltip.</summary> /// <remarks> /// This method first waits a couple frames before sizing and positioning the tooltip. /// This is necessary in order to get an accurate preferredWidth property of the dynamic text field. /// </remarks> public IEnumerator Show(TooltipTrigger trigger) { if (trigger.tooltipStyle == null) { Debug.LogWarning("TooltipTrigger \"" + trigger.name + "\" has no associated TooltipStyle. Cannot show tooltip."); yield break; } Image tooltipBkgImg = trigger.Tooltip.BackgroundImage; // Replace dynamic image placeholders with the correct images. if (trigger.dynamicImageFields != null) { for (int i = 0; i < trigger.dynamicImageFields.Count; i++) { for (int j = 0; j < trigger.Tooltip.ImageFields.Count; j++) { if (trigger.Tooltip.ImageFields[j].Name == trigger.dynamicImageFields[i].name) { if (trigger.dynamicImageFields[i].replacementSprite == null) { trigger.Tooltip.ImageFields[j].Image.sprite = trigger.Tooltip.ImageFields[j].Original; } else { trigger.Tooltip.ImageFields[j].Image.sprite = trigger.dynamicImageFields[i].replacementSprite; } } } } } // Toggle dynamic sections on or off. if (trigger.dynamicSectionFields != null) { for (int i = 0; i < trigger.dynamicSectionFields.Count; i++) { for (int j = 0; j < trigger.Tooltip.SectionFields.Count; j++) { if (trigger.Tooltip.SectionFields[j].Name == trigger.dynamicSectionFields[i].name) { trigger.Tooltip.SectionFields[j].GameObject.SetActive(trigger.dynamicSectionFields[i].isOn); } } } } // Wait for 2 frames so we get an accurate PreferredWidth on the Text component. yield return(WaitFor.Frames(2)); // SET POSITION OF TOOLTIP bool useMousePosition = trigger.tipPosition == TipPosition.MouseBottomLeftCorner || trigger.tipPosition == TipPosition.MouseTopLeftCorner || trigger.tipPosition == TipPosition.MouseBottomRightCorner || trigger.tipPosition == TipPosition.MouseTopRightCorner; Vector3[] triggerCorners = new Vector3[4]; trigger.RectTransform.GetWorldCorners(triggerCorners); // Corners: // 0 = bottom left // 1 = top left // 2 = top right // 3 = bottom right RectTransform tooltipRT = trigger.Tooltip.RectTransform; SetTooltipPosition(trigger.tipPosition, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); // CHECK FOR OVERFLOW: Reposition tool tip if outside root canvas rect. Rect screenRect = new Rect(0f, 0f, Screen.width, Screen.height); Vector3[] tooltipCorners = new Vector3[4]; trigger.Tooltip.RectTransform.GetWorldCorners(tooltipCorners); bool isOverBottomLeft = !screenRect.Contains(tooltipCorners[0]); bool isOverTopLeft = !screenRect.Contains(tooltipCorners[1]); bool isOverTopRight = !screenRect.Contains(tooltipCorners[2]); bool isOverBottomRight = !screenRect.Contains(tooltipCorners[3]); switch (trigger.tipPosition) { case TipPosition.TopRightCorner: case TipPosition.MouseTopRightCorner: if (isOverTopLeft && isOverTopRight && isOverBottomRight) // if top and right edges are off the canvas, flip tooltip position to opposite corner. { SetTooltipPosition(TipPosition.BottomLeftCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverTopLeft && isOverTopRight) // if only the top edge is off the canvas, flip tooltip position to bottom. { SetTooltipPosition(TipPosition.BottomRightCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverTopRight && isOverBottomRight) // if only the right edge is off the canvas, flip tooltip position to left. { SetTooltipPosition(TipPosition.TopLeftCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } break; case TipPosition.BottomRightCorner: case TipPosition.MouseBottomRightCorner: if (isOverBottomLeft && isOverBottomRight && isOverTopRight) // if bottom and right edges are off the canvas, flip tooltip position to opposite corner. { SetTooltipPosition(TipPosition.TopLeftCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverBottomLeft && isOverBottomRight) // if only the bottom edge is off the canvas, flip tooltip position to top. { SetTooltipPosition(TipPosition.TopRightCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverTopRight && isOverBottomRight) // if only the right edge is off the canvas, flip tooltip position to left. { SetTooltipPosition(TipPosition.BottomLeftCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } break; case TipPosition.TopLeftCorner: case TipPosition.MouseTopLeftCorner: if (isOverTopLeft && isOverTopRight && isOverBottomLeft) // if top and left edges are off the canvas, flip tooltip position to opposite corner. { SetTooltipPosition(TipPosition.BottomRightCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverTopLeft && isOverTopRight) // if only the top edge is off the canvas, flip tooltip position to bottom. { SetTooltipPosition(TipPosition.BottomLeftCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverTopLeft && isOverBottomLeft) // if only the left edge is off the canvas, flip tooltip position to right. { SetTooltipPosition(TipPosition.TopRightCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } break; case TipPosition.BottomLeftCorner: case TipPosition.MouseBottomLeftCorner: if (isOverBottomLeft && isOverBottomRight && isOverTopLeft) // if bottom and left edges are off the canvas, flip tooltip position to opposite corner. { SetTooltipPosition(TipPosition.TopRightCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverBottomLeft && isOverBottomRight) // if only the bottom edge is off the canvas, flip tooltip position to top. { SetTooltipPosition(TipPosition.TopLeftCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } else if (isOverTopLeft && isOverBottomLeft) // if only the left edge is off the canvas, flip tooltip position to right. { SetTooltipPosition(TipPosition.BottomRightCorner, trigger.Tooltip.GameObject, trigger.tooltipStyle, triggerCorners, tooltipBkgImg, tooltipRT, useMousePosition); } break; } // Set the tint color of the tooltip panel and tips. tooltipBkgImg.color = trigger.backgroundTint; // Fade the tooltip in. trigger.Tooltip.FadeIn(fadeDuration); }
/// <summary>Displays the tooltip.</summary> /// <remarks> /// This method first waits a couple frames before sizing and positioning the tooltip. /// This is necessary in order to get an accurate preferredWidth property of the dynamic text field. /// </remarks> public IEnumerator Show(TooltipTrigger trigger) { if (trigger.tooltipStyle == null) { Debug.LogWarning("TooltipTrigger \"" + trigger.name + "\" has no associated TooltipStyle. Cannot show tooltip."); yield break; } Tooltip tooltip = trigger.Tooltip; Image tooltipBkgImg = tooltip.BackgroundImage; // Move the tooltip to the No Angle container if it should never be rotated. if (tooltip.NeverRotate) { tooltip.GameObject.transform.SetParent(TooltipContainerNoAngle.transform, false); } // Replace dynamic image placeholders with the correct images. if (trigger.dynamicImageFields != null) { for (int i = 0; i < trigger.dynamicImageFields.Count; i++) { for (int j = 0; j < tooltip.ImageFields.Count; j++) { if (tooltip.ImageFields[j].Name == trigger.dynamicImageFields[i].name) { if (trigger.dynamicImageFields[i].replacementSprite == null) { tooltip.ImageFields[j].Image.sprite = tooltip.ImageFields[j].Original; } else { tooltip.ImageFields[j].Image.sprite = trigger.dynamicImageFields[i].replacementSprite; } } } } } // Toggle dynamic sections on or off. if (trigger.dynamicSectionFields != null) { for (int i = 0; i < trigger.dynamicSectionFields.Count; i++) { for (int j = 0; j < tooltip.SectionFields.Count; j++) { if (tooltip.SectionFields[j].Name == trigger.dynamicSectionFields[i].name) { tooltip.SectionFields[j].GameObject.SetActive(trigger.dynamicSectionFields[i].isOn); } } } } // Wait for 2 frames so we get an accurate PreferredWidth on the Text component. yield return(WaitFor.Frames(2)); // Get the parent canvas for this tooltip trigger. GuiCanvas = trigger.GetComponentInParent <Canvas>(); // If no parent canvas is found for the trigger object, use the main canvas. if (GuiCanvas == null) { GuiCanvas = CanvasHelper.GetRootCanvas(); } // Parent the tooltip container under the correct canvas. TooltipContainer.transform.SetParent(GuiCanvas.transform, false); // Set the position of the tooltip. tooltip.SetPosition(trigger, GuiCanvas, guiCamera); // Set the tint color of the tooltip panel and tips. tooltipBkgImg.color = trigger.backgroundTint; // If this is a blocking tooltip, assign it as such. if (tooltip.IsBlocking) { BlockingTooltip = tooltip; } // Display the tooltip. tooltip.Display(fadeDuration); }