//---------------------------------------------------------------------- public void DrawWithOffset(Point _pOffset) { if (WrapText) { for (int i = 0; i < mlWrappedText.Count; i++) { float fX = mpTextPosition.X + _pOffset.X; float fTextWidth = mFont.MeasureString(mlWrappedText[i].Item1).X; if (Anchor == UI.Anchor.Center) { fX += ContentWidth / 2 - Padding.Left - fTextWidth / 2f; } Screen.Game.DrawBlurredText(OutlineRadius, mFont, mlWrappedText[i].Item1, new Vector2((int)fX, mpTextPosition.Y + (int)(Font.LineSpacing * i) + Font.YOffset + _pOffset.Y), Color, OutlineColor); if (Underline) { var vBottomLeft = new Vector2(fX, mpTextPosition.Y + (int)(Font.LineSpacing * (i + 1)) + Font.YOffset + _pOffset.Y); Screen.Game.DrawLine(vBottomLeft, vBottomLeft + new Vector2(fTextWidth, 0), Color); } } } else { Screen.Game.DrawBlurredText(OutlineRadius, mFont, mstrDisplayedText, new Vector2(mpTextPosition.X + _pOffset.X, mpTextPosition.Y + Font.YOffset + _pOffset.Y), Color, OutlineColor); if (Underline) { var vBottomLeft = new Vector2(mpTextPosition.X + _pOffset.X, mpTextPosition.Y + Font.YOffset + _pOffset.Y + Font.LineSpacing); Screen.Game.DrawLine(vBottomLeft, vBottomLeft + new Vector2(miEllipsizedTextWidth - Padding.Horizontal, 0), Color); } } }
//---------------------------------------------------------------------- protected internal override void UpdateContentSize() { UIFont uiFont = Screen.Style.MediumFont; int iMaxWidth = 0; foreach (DropDownItem _item in Items) { iMaxWidth = Math.Max(iMaxWidth, (int)uiFont.MeasureString(_item.Text).X); } ContentWidth = iMaxWidth + Padding.Horizontal + TextPadding.Horizontal + Screen.Style.DropDownArrow.Width; ContentHeight = (int)(uiFont.LineSpacing * 0.9f) + Padding.Vertical + TextPadding.Vertical; base.UpdateContentSize(); }
//---------------------------------------------------------------------- public override void Draw() { if (mfTooltipTimer < sfTooltipDelay || string.IsNullOrEmpty(Text)) { return; } UIFont font = Screen.Style.MediumFont; Vector2 vSize = font.MeasureString(Text); int iWidth = (int)vSize.X; int iHeight = (int)vSize.Y; Point topLeft = new Point( Math.Min(Screen.Game.InputMgr.MouseState.X, Screen.Width - iWidth - Padding.Horizontal), Math.Min(Screen.Game.InputMgr.MouseState.Y + 20, Screen.Height - iHeight - Padding.Vertical)); Screen.DrawBox(Screen.Style.TooltipFrame, new Rectangle(topLeft.X, topLeft.Y, iWidth + Padding.Horizontal, iHeight + Padding.Vertical), Screen.Style.TooltipCornerSize, Color.White); Screen.Game.SpriteBatch.DrawString(font, Text, new Vector2(topLeft.X + Padding.Left, topLeft.Y + Padding.Top + font.YOffset), Screen.Style.TooltipTextColor); }
int ComputeCaretOffsetAtX( int _iX, string _strText, UIFont _font ) { // FIXME: This does many calls to Font.MeasureString // We should do a binary search instead! int iIndex = 0; float fPreviousX = 0f; while( iIndex < _strText.Length ) { iIndex++; float fX = _font.MeasureString( _strText.Substring( 0, iIndex ) ).X; if( fX > _iX ) { bool bAfter = ( fX - _iX ) < ( ( fX - fPreviousX ) / 2f ); return bAfter ? iIndex : ( iIndex - 1 ); } fPreviousX = fX; } return _strText.Length; }