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); }
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); }
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); }