コード例 #1
0
        /// <summary>
        /// This is an example of creating a button at runtime from a prefab that does NOT already have a tooltip,
        /// programmatically adding a tooltip to it that does not already exist in the scene, and modifying it to
        /// display whatever dynamic message we want.
        /// </summary>
        private void AddNewTooltip()
        {
            // Load the button from Resources.
            GameObject buttonPrefab = Resources.Load <GameObject>("DynamicObjWithoutTooltip");

            if (buttonPrefab != null)
            {
                // Assuming the prefab exists, instantiate the button and set its parent.
                GameObject button = Instantiate(buttonPrefab);
                button.transform.SetParent(transform, false);

                // Add the TooltipTrigger component to the button.
                TooltipTrigger tooltipTrigger = button.gameObject.AddComponent <TooltipTrigger>();
                TooltipStyle   tooltipStyle   = Resources.Load <TooltipStyle>("MetroSimple");
                tooltipTrigger.tooltipStyle = tooltipStyle;

                // Set the tooltip text.
                tooltipTrigger.SetText("BodyText", String.Format("This object was created at <b><color=#F3B200>runtime</color></b> from a prefab that <b><color=#F3B200>did not</color></b> already have a tooltip on it. The tooltip was added programmatically and the message and other parameters modified through code. This \"metro\" tooltip style was also added dynamically to the scene.\n\nObject created and tooltip text assigned at {0}.", DateTime.Now));

                // Set some extra style properties on the tooltip
                tooltipTrigger.maxTextWidth   = 250;
                tooltipTrigger.backgroundTint = Color.white;
                tooltipTrigger.tipPosition    = TipPosition.BottomRightCorner;
            }
        }
コード例 #2
0
        /// <summary>Triggers a tooltip immediately on the game object specified.</summary>
        /// <param name="onObject">The game object to pop a tooltip over.</param>
        public void PopupTooltip(GameObject onObject, string bodyText, string buttonText)
        {
            // Add the TooltipTrigger component to the object we want to pop a tooltip up for.
            TooltipTrigger tooltipTrigger = onObject.GetComponent <TooltipTrigger>();

            // if the tooltip trigger is already being remotely controlled by this game object, exit.
            //if (tooltipTrigger != null && tooltipTrigger.remoteTrigger == gameObject) return;

            if (tooltipTrigger == null)
            {
                tooltipTrigger = onObject.AddComponent <TooltipTrigger>();
            }

            TooltipStyle tooltipStyle = Resources.Load <TooltipStyle>("CleanSimpleCloseButton");

            tooltipTrigger.tooltipStyle = tooltipStyle;

            // Set the tooltip text and properties.
            tooltipTrigger.SetText("BodyText", bodyText);
            tooltipTrigger.SetText("ButtonText", String.IsNullOrEmpty(buttonText) ? "Continue" : buttonText);
            tooltipTrigger.tipPosition  = TipPosition.TopRightCorner;
            tooltipTrigger.maxTextWidth = 300;
            tooltipTrigger.staysOpen    = true; // make this a tooltip that stays open...
            tooltipTrigger.isBlocking   = true; // ...and is blocking (no other tooltips allowed while this one is active).

            // Popup the tooltip and give it the object that triggered it (the Canvas in this case).
            tooltipTrigger.Popup(8f, gameObject);
        }
コード例 #3
0
ファイル: TooltipManager.cs プロジェクト: jlavoine/DotR
        /// <summary>Sets the parameterized text fields on the tooltip.</summary>
        /// <remarks>This is separate from the Show() method because we need to wait a frame or two so the text's RectTransform has time to update its preferredWidth.</remarks>
        public void SetTextAndSize(TooltipTrigger trigger)
        {
            if (trigger.Tooltip == null || trigger.parameterizedTextFields == null) return;

            if (trigger.Tooltip.TextFields == null || trigger.Tooltip.TextFields.Count == 0) return;

            LayoutElement mainTextContainer = trigger.Tooltip.TooltipStyle.mainTextContainer;
            if (mainTextContainer == null)
                Debug.LogWarning(String.Format("No main text container defined on tooltip style \"{0}\". Note: This LayoutElement is needed in order to resize text appropriately.", trigger.Tooltip.GameObject.name));
            else
                mainTextContainer.preferredWidth = trigger.minTextWidth;

            for (int i = 0; i < trigger.Tooltip.TextFields.Count; i++)
            {
                Text txt = trigger.Tooltip.TextFields[i].Text;
                if (txt.text.Length < 3) continue; // text is too short to contain a parameter, so skip it.
                
                for (int j = 0; j < trigger.parameterizedTextFields.Count; j++)
                {
                    if (!String.IsNullOrEmpty(trigger.parameterizedTextFields[j].value))
                        txt.text = txt.text.Replace(trigger.parameterizedTextFields[j].placeholder, trigger.parameterizedTextFields[j].value);
                }
                 
                if (mainTextContainer != null)
                {
                    // if the text would be wider than allowed, constrain the main text container to that limit.
                    if (txt.preferredWidth > trigger.maxTextWidth) 
                        mainTextContainer.preferredWidth = trigger.maxTextWidth;
                    // otherwise, if it's within the allotted space but bigger than the text container's default width, expand the main text container to accommodate.
                    else if (txt.preferredWidth > trigger.minTextWidth && txt.preferredWidth > mainTextContainer.preferredWidth)
                        mainTextContainer.preferredWidth = txt.preferredWidth;
                }
            }
        }
コード例 #4
0
        /// <summary>Sets the parameterized text fields on the tooltip.</summary>
        /// <remarks>This is separate from the Show() method because we need to wait a frame or two so the text's RectTransform has time to update its preferredWidth.</remarks>
        public void SetTextAndSize(TooltipTrigger trigger)
        {
            Tooltip tooltip = trigger.Tooltip;

            if (tooltip == null || trigger.parameterizedTextFields == null)
            {
                return;
            }

            if (tooltip.TextFields == null || tooltip.TextFields.Count == 0)
            {
                return;
            }

            LayoutElement mainTextContainer = tooltip.TooltipStyle.mainTextContainer;

            if (mainTextContainer == null)
            {
                Debug.LogWarning(String.Format("No main text container defined on tooltip style \"{0}\". Note: This LayoutElement is needed in order to resize text appropriately.", trigger.Tooltip.GameObject.name));
            }
            else
            {
                mainTextContainer.preferredWidth = trigger.minTextWidth;
            }

            for (int i = 0; i < tooltip.TextFields.Count; i++)
            {
                Text txt = tooltip.TextFields[i].Text;
                if (txt.text.Length < 3)
                {
                    continue;                      // text is too short to contain a parameter, so skip it.
                }
                for (int j = 0; j < trigger.parameterizedTextFields.Count; j++)
                {
                    if (!String.IsNullOrEmpty(trigger.parameterizedTextFields[j].value))
                    {
                        txt.text = txt.text.Replace(trigger.parameterizedTextFields[j].placeholder, trigger.parameterizedTextFields[j].value);
                    }
                }

                if (mainTextContainer != null)
                {
                    // if the text would be wider than allowed, constrain the main text container to that limit.
                    if (txt.preferredWidth > trigger.maxTextWidth)
                    {
                        mainTextContainer.preferredWidth = trigger.maxTextWidth;
                    }
                    // otherwise, if it's within the allotted space but bigger than the text container's default width, expand the main text container to accommodate.
                    else if (txt.preferredWidth > trigger.minTextWidth && txt.preferredWidth > mainTextContainer.preferredWidth)
                    {
                        mainTextContainer.preferredWidth = txt.preferredWidth;
                    }
                }
            }
        }
コード例 #5
0
ファイル: EquipmentItem.cs プロジェクト: jlavoine/DotR
        /// <summary>Resets the tooltip for this equipment item. Call this function anytime the stats of the item change.</summary>
        public void ResetTooltip()
        {
            // If this item is equipped, turn off the Equipped Item section of the tooltip.
            if (isEquipped)
            {
                TooltipTrigger.TurnSectionOff("EquippedItem");
            }
            else
            {
                TooltipTrigger.TurnSectionOn("EquippedItem");
                // Get a list of all the currently equipped items on the character. In reality, you would probably keep this list elsewhere,
                // but we're just querying the items here to keep it simple.
                EquipmentItem[] equipmentItems = FindObjectsOfType <EquipmentItem>();

                for (int i = 0; i < equipmentItems.Length; i++)
                {
                    if (equipmentItems[i].isEquipped && equipmentItems[i].itemType == itemType)
                    {
                        TooltipTrigger.SetText("EquippedName", equipmentItems[i].itemName);
                        Image equippedImage = equipmentItems[i].GetComponent <Image>();
                        TooltipTrigger.SetImage("EquippedItemImage", equippedImage.sprite);
                        TooltipTrigger.SetText("EquippedStats", GetStatsText(equipmentItems[i]));
                        TooltipTrigger.SetText("EquippedValue", String.Format("<color=#888888>VALUE: </color> <size=14>{0}</size>", equipmentItems[i].value.ToString("##,000")));
                        break;
                    }
                }
            }

            // Set the Rarity colors
            string rarityColor = "bbbbbb"; // Default "Common" gray color.

            switch (rarity)
            {
            case Rarity.Rare:
                rarityColor = "FFC924";     // Amber color for "Rare".
                break;

            case Rarity.Uncommon:
                rarityColor = "25ff00";     // Green color for "Uncommon".
                break;
            }

            TooltipTrigger.SetText("TitleText", String.Format("{0} ({1})", itemName, itemType));
            TooltipTrigger.SetText("Stats", GetStatsText(this));
            TooltipTrigger.SetText("Description", "<b>NOTE:</b> This tooltip is dynamically populated at runtime with values from the item!");
            TooltipTrigger.SetText("Value", String.Format("<color=#888888>VALUE: </color> <size=16>{0}</size>", value.ToString("##,000")));
            TooltipTrigger.SetText("Rarity", String.Format("<color=#{0}>{1} {2}</color>", rarityColor, rarity, itemType));
            TooltipTrigger.SetImage("ItemImage", Image.sprite);
        }
コード例 #6
0
        /// <summary>
        /// This is an example of creating a button at runtime from a prefab that already has a tooltip on it,
        /// and modifying the tooltip to display whatever dynamic message we want.
        /// </summary>
        private void ModifyExistingTooltip()
        {
            // Load the button from Resources.
            GameObject buttonPrefab = Resources.Load <GameObject>("DynamicObjWithTooltip");

            if (buttonPrefab != null)
            {
                // Assuming the prefab exists, instantiate the button and set its parent.
                GameObject button = Instantiate(buttonPrefab);
                button.transform.SetParent(transform, false);

                // Get the TooltipTrigger component on the button.
                TooltipTrigger tooltipTrigger = button.GetComponent <TooltipTrigger>();
                if (tooltipTrigger != null) // Set the tooltip text.
                {
                    tooltipTrigger.SetText("BodyText", String.Format("This object was created at <b><color=#0049CE>runtime</color></b> from a prefab that already had a tooltip on it, and the tooltip message was modified programmatically.\n\nObject created and tooltip text assigned at {0}.", DateTime.Now));
                }
            }
        }
コード例 #7
0
ファイル: TooltipTriggerEditor.cs プロジェクト: jlavoine/DotR
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            TooltipTrigger tooltipTrigger = target as TooltipTrigger;

            if (tooltipTrigger != null)
            {
                // TOOLTIP STYLE
                GUI.color = tooltipStyle.objectReferenceValue == null ? Color.red : Color.white;
                EditorGUILayout.PropertyField(tooltipStyle, new GUIContent("Tooltip Style"));
                tooltipTrigger.tooltipStyle = tooltipStyle.objectReferenceValue as TooltipStyle;
                GUI.color = Color.white;

                if (tooltipTrigger.parameterizedTextFields == null)
                {
                    tooltipTrigger.parameterizedTextFields = new List <ParameterizedTextField>();
                }
                if (tooltipTrigger.dynamicImageFields == null)
                {
                    tooltipTrigger.dynamicImageFields = new List <DynamicImageField>();
                }
                if (tooltipTrigger.dynamicSectionFields == null)
                {
                    tooltipTrigger.dynamicSectionFields = new List <DynamicSectionField>();
                }

                if (tooltipTrigger.tooltipStyle != null)
                {
                    // Retrieve dynamic text and image fields on the tooltip.
                    Text[]           textFields    = tooltipTrigger.tooltipStyle.GetComponentsInChildren <Text>(true);
                    DynamicImage[]   imageFields   = tooltipTrigger.tooltipStyle.GetComponentsInChildren <DynamicImage>(true);
                    DynamicSection[] sectionFields =
                        tooltipTrigger.tooltipStyle.GetComponentsInChildren <DynamicSection>(true);

                    // Fill and configure the dynamic text and image field collections on the tooltip trigger.
                    textFields.FillParameterizedTextFields(ref tooltipTrigger.parameterizedTextFields, "%");
                    // <= if you want to use a different field delimiter, change it here.
                    imageFields.FillDynamicImageFields(ref tooltipTrigger.dynamicImageFields, "%");
                    // <= if you want to use a different field delimiter, change it here.
                    sectionFields.FillDynamicSectionFields(ref tooltipTrigger.dynamicSectionFields, "%");
                    // <= if you want to use a different field delimiter, change it here.

                    // DYNAMIC TEXT FIELDS
                    if (tooltipTrigger.parameterizedTextFields.Count > 0)
                    {
                        EditorGUILayout.BeginVertical("Box");
                        EditorGUILayout.LabelField("Dynamic Text Fields", EditorStyles.boldLabel);
                        foreach (ParameterizedTextField field in tooltipTrigger.parameterizedTextFields)
                        {
                            EditorGUILayout.LabelField(field.name);
                            EditorStyles.textField.wordWrap = true;
                            field.value = EditorGUILayout.TextArea(field.value);
                        }
                        EditorGUILayout.Space();
                        EditorGUILayout.EndVertical();
                    }

                    // DYNAMIC IMAGE FIELDS
                    if (tooltipTrigger.dynamicImageFields.Count > 0)
                    {
                        EditorGUILayout.BeginVertical("Box");
                        EditorGUILayout.LabelField("Dynamic Image Fields", EditorStyles.boldLabel);
                        foreach (DynamicImageField field in tooltipTrigger.dynamicImageFields)
                        {
                            EditorGUILayout.LabelField(field.name);
                            field.replacementSprite =
                                EditorGUILayout.ObjectField(field.replacementSprite, typeof(Sprite), false) as Sprite;
                        }
                        EditorGUILayout.Space();
                        EditorGUILayout.EndVertical();
                    }

                    // DYNAMIC SECTIONS
                    if (tooltipTrigger.dynamicSectionFields.Count > 0)
                    {
                        EditorGUILayout.BeginVertical("Box");
                        EditorGUILayout.LabelField("Dynamic Sections", EditorStyles.boldLabel);
                        foreach (DynamicSectionField field in tooltipTrigger.dynamicSectionFields)
                        {
                            EditorGUILayout.BeginHorizontal();
                            EditorGUILayout.LabelField(field.name, GUILayout.Width(166));
                            field.isOn = EditorGUILayout.Toggle(field.isOn, GUILayout.Width(11));
                            EditorGUILayout.LabelField("Visible", GUILayout.Width(40));
                            EditorGUILayout.EndHorizontal();
                        }
                        EditorGUILayout.Space();
                        EditorGUILayout.EndVertical();
                    }
                }
                else
                {
                    // Clear the fields
                    tooltipTrigger.parameterizedTextFields.Clear();
                    tooltipTrigger.dynamicImageFields.Clear();
                    tooltipTrigger.dynamicSectionFields.Clear();
                }

                // STAYS OPEN?
                EditorGUILayout.PropertyField(staysOpen, new GUIContent("Stays Open?"));
                tooltipTrigger.staysOpen = staysOpen.boolValue;

                // IS BLOCKING?
                if (tooltipTrigger.staysOpen)
                {
                    EditorGUILayout.PropertyField(isBlocking, new GUIContent("    Is Blocking?"));
                    tooltipTrigger.isBlocking = isBlocking.boolValue;
                }
                else
                {
                    isBlocking.boolValue      = false;
                    tooltipTrigger.isBlocking = false;
                }
            }

            // Draw the rest of the fields using the default inspector.
            DrawPropertiesExcluding(serializedObject, dontIncludeMe);

            if (GUI.changed)
            {
                EditorUtility.SetDirty(tooltipTrigger);
            }
            serializedObject.ApplyModifiedProperties();
        }
コード例 #8
0
ファイル: TooltipManager.cs プロジェクト: jlavoine/DotR
        /// <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);
        }
コード例 #9
0
ファイル: TooltipManager.cs プロジェクト: jlavoine/DotR
        /// <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);
        }
コード例 #10
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;
            }

            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);
        }
コード例 #11
0
        /// <summary>Sets the position of the tooltip container.</summary>
        public static void SetPosition(this Tooltip tooltip, TooltipTrigger trigger, Canvas canvas, Camera camera)
        {
            Vector3[]     triggerCorners   = new Vector3[4];
            RectTransform triggerRectTrans = trigger.gameObject.GetComponent <RectTransform>();

            if (triggerRectTrans != null)
            {
                triggerRectTrans.GetWorldCorners(triggerCorners);
            }
            else
            {
                // We're not using a trigger from a Canvas, so that means it's a regular world space game object.
                // So, find the collider bounds of the object and use that for the four corners.
                Collider coll    = trigger.GetComponent <Collider>();
                Vector3  center  = coll.bounds.center;
                Vector3  extents = coll.bounds.extents;

                Vector3 frontBottomLeftCorner  = new Vector3(center.x - extents.x, center.y - extents.y, center.z - extents.z);
                Vector3 frontTopLeftCorner     = new Vector3(center.x - extents.x, center.y + extents.y, center.z - extents.z);
                Vector3 frontTopRightCorner    = new Vector3(center.x + extents.x, center.y + extents.y, center.z - extents.z);
                Vector3 frontBottomRightCorner = new Vector3(center.x + extents.x, center.y - extents.y, center.z - extents.z);

                triggerCorners[0] = camera.WorldToScreenPoint(frontBottomLeftCorner);
                triggerCorners[1] = camera.WorldToScreenPoint(frontTopLeftCorner);
                triggerCorners[2] = camera.WorldToScreenPoint(frontTopRightCorner);
                triggerCorners[3] = camera.WorldToScreenPoint(frontBottomRightCorner);
            }

            // Set the initial tooltip position.
            tooltip.SetPosition(trigger.tipPosition, trigger.tooltipStyle, triggerCorners, tooltip.BackgroundImage, tooltip.RectTransform, canvas, camera);

            // If overflow protection is disabled, exit.
            if (!TooltipManager.Instance.overflowProtection)
            {
                return;
            }

            // Check for overflow.
            Vector3[] tooltipCorners = new Vector3[4];
            tooltip.RectTransform.GetWorldCorners(tooltipCorners);

            if (canvas.renderMode == RenderMode.ScreenSpaceCamera || canvas.renderMode == RenderMode.WorldSpace)
            {
                for (int i = 0; i < tooltipCorners.Length; i++)
                {
                    tooltipCorners[i] = RectTransformUtility.WorldToScreenPoint(camera, tooltipCorners[i]);
                }
            }
            else if (canvas.renderMode == RenderMode.ScreenSpaceOverlay)
            {
                for (int i = 0; i < tooltipCorners.Length; i++)
                {
                    tooltipCorners[i] = RectTransformUtility.WorldToScreenPoint(null, tooltipCorners[i]);
                }
            }

            Rect            screenRect = new Rect(0, 0, Screen.width, Screen.height);
            TooltipOverflow overflow   = new TooltipOverflow
            {
                BottomLeftCorner = !screenRect.Contains(tooltipCorners[0]),
                // is the tooltip out of bounds on the Bottom Left?
                TopLeftCorner = !screenRect.Contains(tooltipCorners[1]),
                // is the tooltip out of bounds on the Top Left?
                TopRightCorner = !screenRect.Contains(tooltipCorners[2]),
                // is the tooltip out of bounds on the Top Right?
                BottomRightCorner = !screenRect.Contains(tooltipCorners[3])
                                    // is the tooltip out of bounds on the Bottom Right?
            };

            // If the tooltip overflows its boundary rectange, reposition it.
            if (overflow.IsAny)
            {
                tooltip.SetPosition(overflow.SuggestNewPosition(trigger.tipPosition), trigger.tooltipStyle,
                                    triggerCorners, tooltip.BackgroundImage, tooltip.RectTransform, canvas, camera);
            }
        }