Ejemplo n.º 1
0
        internal string ElideText(string drawText, string ellipsisText, float width, TextOverflowPosition textOverflowPosition)
        {
            float   num    = 1f / base.scaledPixelsPerPoint;
            Vector2 vector = this.MeasureTextSize(drawText, 0f, VisualElement.MeasureMode.Undefined, 0f, VisualElement.MeasureMode.Undefined);
            bool    flag   = vector.x - num <= width || string.IsNullOrEmpty(ellipsisText);
            string  result;

            if (flag)
            {
                result = drawText;
            }
            else
            {
                string  text    = (drawText.Length > 1) ? ellipsisText : drawText;
                Vector2 vector2 = this.MeasureTextSize(text, 0f, VisualElement.MeasureMode.Undefined, 0f, VisualElement.MeasureMode.Undefined);
                bool    flag2   = vector2.x >= width;
                if (flag2)
                {
                    result = text;
                }
                else
                {
                    int    num2  = drawText.Length - 1;
                    int    num3  = -1;
                    string text2 = drawText;
                    int    i     = (textOverflowPosition == TextOverflowPosition.Start) ? 1 : 0;
                    int    num4  = (textOverflowPosition == TextOverflowPosition.Start || textOverflowPosition == TextOverflowPosition.Middle) ? num2 : (num2 - 1);
                    int    num5  = (i + num4) / 2;
                    while (i <= num4)
                    {
                        bool flag3 = textOverflowPosition == TextOverflowPosition.Start;
                        if (flag3)
                        {
                            text2 = ellipsisText + drawText.Substring(num5, num2 - (num5 - 1));
                        }
                        else
                        {
                            bool flag4 = textOverflowPosition == TextOverflowPosition.End;
                            if (flag4)
                            {
                                text2 = drawText.Substring(0, num5) + ellipsisText;
                            }
                            else
                            {
                                bool flag5 = textOverflowPosition == TextOverflowPosition.Middle;
                                if (flag5)
                                {
                                    text2 = drawText.Substring(0, num5 - 1) + ellipsisText + drawText.Substring(num2 - (num5 - 1));
                                }
                            }
                        }
                        vector = this.MeasureTextSize(text2, 0f, VisualElement.MeasureMode.Undefined, 0f, VisualElement.MeasureMode.Undefined);
                        bool flag6 = Math.Abs(vector.x - width) < Mathf.Epsilon;
                        if (flag6)
                        {
                            result = text2;
                            return(result);
                        }
                        bool flag7 = textOverflowPosition == TextOverflowPosition.Start;
                        if (flag7)
                        {
                            bool flag8 = vector.x > width;
                            if (flag8)
                            {
                                bool flag9 = num3 == num5 - 1;
                                if (flag9)
                                {
                                    result = ellipsisText + drawText.Substring(num3, num2 - (num3 - 1));
                                    return(result);
                                }
                                i = num5 + 1;
                            }
                            else
                            {
                                num4 = num5 - 1;
                                num3 = num5;
                            }
                        }
                        else
                        {
                            bool flag10 = textOverflowPosition == TextOverflowPosition.End || textOverflowPosition == TextOverflowPosition.Middle;
                            if (flag10)
                            {
                                bool flag11 = vector.x > width;
                                if (flag11)
                                {
                                    bool flag12 = num3 == num5 - 1;
                                    if (flag12)
                                    {
                                        bool flag13 = textOverflowPosition == TextOverflowPosition.End;
                                        if (flag13)
                                        {
                                            result = drawText.Substring(0, num3) + ellipsisText;
                                            return(result);
                                        }
                                        result = drawText.Substring(0, num3 - 1) + ellipsisText + drawText.Substring(num2 - (num3 - 1));
                                        return(result);
                                    }
                                    else
                                    {
                                        num4 = num5 - 1;
                                    }
                                }
                                else
                                {
                                    i    = num5 + 1;
                                    num3 = num5;
                                }
                            }
                        }
                        num5 = (i + num4) / 2;
                    }
                    result = text2;
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        internal string ElideText(string drawText, string ellipsisText, float width, TextOverflowPosition textOverflowPosition)
        {
            // The pixelOffset represent the maximum value that could be removed from the measured with by the layout when scaling is not 100%.
            // the offset is caused by alining the borders+spacing+padding on the grid.
            // We still want the text to render without being elided even when there is a small gap missing.  https://fogbugz.unity3d.com/f/cases/1268016/
            float pixelOffset = 1 / scaledPixelsPerPoint;

            // Try full size first
            var size = MeasureTextSize(drawText, 0, MeasureMode.Undefined, 0, MeasureMode.Undefined);

            if (size.x - pixelOffset <= width || string.IsNullOrEmpty(ellipsisText))
            {
                return(drawText);
            }

            var minText = drawText.Length > 1 ? ellipsisText : drawText;
            var minSize = MeasureTextSize(minText, 0, MeasureMode.Undefined, 0, MeasureMode.Undefined);

            if (minSize.x >= width)
            {
                return(minText);
            }

            // Text will need to be truncated somehow
            var drawTextMax   = drawText.Length - 1;
            var prevFitMid    = -1;
            var truncatedText = drawText;

            // Don't assume that k_EllipsisText takes as much space as any other string of the same length;
            // we will start by removing one character at a time
            var min = textOverflowPosition == TextOverflowPosition.Start ? 1 : 0;
            var max = (textOverflowPosition == TextOverflowPosition.Start ||
                       textOverflowPosition == TextOverflowPosition.Middle) ? drawTextMax : drawTextMax - 1;
            var mid = (min + max) / 2;

            while (min <= max)
            {
                if (textOverflowPosition == TextOverflowPosition.Start)
                {
                    truncatedText = ellipsisText + drawText.Substring(mid, drawTextMax - (mid - 1));
                }
                else if (textOverflowPosition == TextOverflowPosition.End)
                {
                    truncatedText = drawText.Substring(0, mid) + ellipsisText;
                }
                else if (textOverflowPosition == TextOverflowPosition.Middle)
                {
                    truncatedText = drawText.Substring(0, mid - 1) + ellipsisText +
                                    drawText.Substring(drawTextMax - (mid - 1));
                }

                size = MeasureTextSize(truncatedText, 0, MeasureMode.Undefined,
                                       0, MeasureMode.Undefined);

                if (Math.Abs(size.x - width) < Mathf.Epsilon)
                {
                    return(truncatedText);
                }

                if (textOverflowPosition == TextOverflowPosition.Start)
                {
                    if (size.x > width)
                    {
                        if (prevFitMid == mid - 1)
                        {
                            return(ellipsisText + drawText.Substring(prevFitMid, drawTextMax - (prevFitMid - 1)));
                        }
                        min = mid + 1;
                    }
                    else
                    {
                        max        = mid - 1;
                        prevFitMid = mid;
                    }
                }
                else if (textOverflowPosition == TextOverflowPosition.End || textOverflowPosition == TextOverflowPosition.Middle)
                {
                    if (size.x > width)
                    {
                        if (prevFitMid == mid - 1)
                        {
                            if (textOverflowPosition == TextOverflowPosition.End)
                            {
                                return(drawText.Substring(0, prevFitMid) + ellipsisText);
                            }
                            else
                            {
                                return(drawText.Substring(0, prevFitMid - 1) + ellipsisText + drawText.Substring(drawTextMax - (prevFitMid - 1)));
                            }
                        }
                        max = mid - 1;
                    }
                    else
                    {
                        min        = mid + 1;
                        prevFitMid = mid;
                    }
                }

                mid = (min + max) / 2;
            }

            return(truncatedText);
        }
Ejemplo n.º 3
0
        internal string ElideText(string drawText, string ellipsisText, float width, TextOverflowPosition textOverflowPosition)
        {
            // Try full size first
            var size = MeasureTextSize(drawText, 0, MeasureMode.Undefined, 0, MeasureMode.Undefined);

            if (size.x <= width || string.IsNullOrEmpty(ellipsisText))
            {
                return(drawText);
            }

            var minText = drawText.Length > 1 ? ellipsisText : drawText;
            var minSize = MeasureTextSize(minText, 0, MeasureMode.Undefined, 0, MeasureMode.Undefined);

            if (minSize.x >= width)
            {
                return(minText);
            }

            // Text will need to be truncated somehow
            var drawTextMax   = drawText.Length - 1;
            var prevFitMid    = -1;
            var truncatedText = drawText;

            // Don't assume that k_EllipsisText takes as much space as any other string of the same length;
            // we will start by removing one character at a time
            var min = textOverflowPosition == TextOverflowPosition.Start ? 1 : 0;
            var max = (textOverflowPosition == TextOverflowPosition.Start ||
                       textOverflowPosition == TextOverflowPosition.Middle) ? drawTextMax : drawTextMax - 1;
            var mid = (min + max) / 2;

            while (min <= max)
            {
                if (textOverflowPosition == TextOverflowPosition.Start)
                {
                    truncatedText = ellipsisText + drawText.Substring(mid, drawTextMax - (mid - 1));
                }
                else if (textOverflowPosition == TextOverflowPosition.End)
                {
                    truncatedText = drawText.Substring(0, mid) + ellipsisText;
                }
                else if (textOverflowPosition == TextOverflowPosition.Middle)
                {
                    truncatedText = drawText.Substring(0, mid - 1) + ellipsisText +
                                    drawText.Substring(drawTextMax - (mid - 1));
                }

                size = MeasureTextSize(truncatedText, 0, MeasureMode.Undefined,
                                       0, MeasureMode.Undefined);

                if (Math.Abs(size.x - width) < Mathf.Epsilon)
                {
                    return(truncatedText);
                }

                if (textOverflowPosition == TextOverflowPosition.Start)
                {
                    if (size.x > width)
                    {
                        if (prevFitMid == mid - 1)
                        {
                            return(ellipsisText + drawText.Substring(prevFitMid, drawTextMax - (prevFitMid - 1)));
                        }
                        min = mid + 1;
                    }
                    else
                    {
                        max        = mid - 1;
                        prevFitMid = mid;
                    }
                }
                else if (textOverflowPosition == TextOverflowPosition.End || textOverflowPosition == TextOverflowPosition.Middle)
                {
                    if (size.x > width)
                    {
                        if (prevFitMid == mid - 1)
                        {
                            if (textOverflowPosition == TextOverflowPosition.End)
                            {
                                return(drawText.Substring(0, prevFitMid) + ellipsisText);
                            }
                            else
                            {
                                return(drawText.Substring(0, prevFitMid - 1) + ellipsisText + drawText.Substring(drawTextMax - (prevFitMid - 1)));
                            }
                        }
                        max = mid - 1;
                    }
                    else
                    {
                        min        = mid + 1;
                        prevFitMid = mid;
                    }
                }

                mid = (min + max) / 2;
            }

            return(truncatedText);
        }