Exemple #1
0
        /// <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);
        }