Commits

Anonymous committed d36d5ed

EXP-829 FIX Text Box Alignment bug
EXP-755 FIX [PUBLIC] 'Search' and 'World Map' links in Sidebar are unclickable

fixed issues with UI scaling and text layout as well as incorrect text editor rect transforms

reviewed by Callum

  • Participants
  • Parent commits 7f48fc8

Comments (0)

Files changed (2)

File indra/llrender/llfontgl.cpp

 	BOOL in_word = FALSE;
 
 	// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
-	F32 scaled_max_pixels =	ceil(max_pixels * sScaleX);
+	F32 scaled_max_pixels =	max_pixels * sScaleX;
 	F32 width_padding = 0.f;
 	
 	LLFontGlyphInfo* next_glyph = NULL;

File indra/llui/lltextbase.cpp

 	if (getLength() >= S32(mMaxTextByteLength / 4))
 	{	
 		// Have to check actual byte size
-        LLWString text(getWText());
+		LLWString text(getWText());
 		S32 utf8_byte_size = wstring_utf8_length(text);
 		if ( utf8_byte_size > mMaxTextByteLength )
 		{
 		}
 
 		LLRect text_rect(line.mRect);
-		text_rect.mRight = llmin(mDocumentView->getRect().getWidth(), text_rect.mRight); // clamp right edge to document extents
-		text_rect.translate(mVisibleTextRect.mLeft, mVisibleTextRect.mBottom); // translate into display region of text widget
+		text_rect.mRight = mDocumentView->getRect().getWidth(); // clamp right edge to document extents
 		text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position
 
 		// draw a single line of text
 	}
 
 	text.insert(pos, wstr);
-    getViewModel()->setDisplay(text);
+	getViewModel()->setDisplay(text);
 
 	if ( truncate() )
 	{
 
 S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
 {
-    LLWString text(getWText());
+	LLWString text(getWText());
 	segment_set_t::iterator seg_iter = getSegIterContaining(pos);
 	while(seg_iter != mSegments.end())
 	{
 	}
 
 	text.erase(pos, length);
-    getViewModel()->setDisplay(text);
+	getViewModel()->setDisplay(text);
 
 	// recreate default segment in case we erased everything
 	createDefaultSegment();
 	{
 		return 0;
 	}
-    LLWString text(getWText());
+	LLWString text(getWText());
 	text[pos] = wc;
-    getViewModel()->setDisplay(text);
+	getViewModel()->setDisplay(text);
 
 	onValueChange(pos, pos + 1);
 	needsReflow(pos);
 		// Did we just click on a link?
 		if (mURLClickSignal
 			&& cur_segment->getStyle()
-		    && cur_segment->getStyle()->isLink())
+			&& cur_segment->getStyle()->isLink())
 		{
 			// *TODO: send URL here?
 			(*mURLClickSignal)(this, LLSD() );
 		gl_rect_2d(text_rect, bg_color % alpha, TRUE);
 	}
 
- 	bool should_clip = mClip || mScroller != NULL;
- 	{ LLLocalClipRect clip(text_rect, should_clip);
+	bool should_clip = mClip || mScroller != NULL;
+	{ LLLocalClipRect clip(text_rect, should_clip);
  
- 		// draw document view
- 		if (mScroller)
+		// draw document view
+		if (mScroller)
 		{
- 			drawChild(mScroller);
- 		}
- 		else
- 		{
- 			drawChild(mDocumentView);
- 		}
+			drawChild(mScroller);
+		}
+		else
+		{
+			drawChild(mDocumentView);
+		}
  
 		drawSelectionBackground();
 		drawText();
 		drawCursor();
 	}
  
- 	mDocumentView->setVisible(FALSE);
- 	LLUICtrl::draw();
- 	mDocumentView->setVisible(TRUE);
+	mDocumentView->setVisible(FALSE);
+	LLUICtrl::draw();
+	mDocumentView->setVisible(TRUE);
 }
 
 
 
 	// scroll so that the cursor is at the top of the page
 	LLRect scroller_doc_window = getVisibleDocumentRect();
-	LLRect cursor_rect_doc = getLocalRectFromDocIndex(mCursorPos);
-	cursor_rect_doc.translate(scroller_doc_window.mLeft, scroller_doc_window.mBottom);
+	LLRect cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
 	mScroller->scrollToShowRect(cursor_rect_doc, LLRect(0, scroller_doc_window.getHeight() - 5, scroller_doc_window.getWidth(), 5));
 }
 
 {
 	S32 num_lines = getLineCount();
 	if (num_lines == 0)
-    {
+	{
 		return 0;
-    }
+	}
 
 	line = llclamp(line, 0, num_lines-1);
 	return mLineInfoList[line].mDocIndexStart;
 {
 	S32 num_lines = getLineCount();
 	if (num_lines == 0)
-    {
+	{
 		return 0;
-    }
+	}
 
 	line = llclamp(line, 0, num_lines-1);
 	return mLineInfoList[line].mDocIndexEnd;
 		LLUrlMatch match;
 		std::string text = new_text;
 		while ( LLUrlRegistry::instance().findUrl(text, match,
-		        boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
+				boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
 		{
 			start = match.getStart();
 			end = match.getEnd()+1;
 
 const LLWString& LLTextBase::getWText() const
 {
-    return getViewModel()->getDisplay();
+	return getViewModel()->getDisplay();
 }
 
 // If round is true, if the position is on the right half of a character, the cursor
 {
 	// Figure out which line we're nearest to.
 	LLRect visible_region = getVisibleDocumentRect();
+	LLRect doc_rect = mDocumentView->getRect();
+
+	S32 doc_y = local_y - doc_rect.mBottom;
 	
 	// binary search for line that starts before local_y
-	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
+	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_y, compare_bottom());
 
 	if (line_iter == mLineInfoList.end())
 	{
 	}
 	
 	S32 pos = getLength();
-	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;
+	S32 start_x = line_iter->mRect.mLeft + doc_rect.mLeft;
 
 	segment_set_t::iterator line_seg_iter;
 	S32 line_seg_offset;
 		}
 
 		// if we've reached a line of text *below* the mouse cursor, doc index is first character on that line
-		if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop)
+		if (hit_past_end_of_line && doc_y > line_iter->mRect.mTop)
 		{
 			pos = segment_line_start;
 			break;
 		LLRect doc_rect = mDocumentView->getLocalRect();
 		doc_rect.mLeft -= mDocumentView->getRect().mLeft;
 		// adjust for height of text above widget baseline
-		doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mVisibleTextRect.getHeight());
+		doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight();
 		return doc_rect;
 	}
 }
 
 	LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor())  % alpha;
 
-  	if( selection_start > seg_start )
+	if( selection_start > seg_start )
 	{
 		// Draw normally
 		S32 start = seg_start;
 		S32 end = llmin( selection_start, seg_end );
 		S32 length =  end - start;
 		font->render(text, start, 
-			     rect, 
-			     color, 
-			     LLFontGL::LEFT, mEditor.mVAlign, 
-			     LLFontGL::NORMAL, 
-			     mStyle->getShadowType(), 
-			     length,
-			     &right_x, 
-			     mEditor.getUseEllipses());
+				 rect, 
+				 color, 
+				 LLFontGL::LEFT, mEditor.mVAlign, 
+				 LLFontGL::NORMAL, 
+				 mStyle->getShadowType(), 
+				 length,
+				 &right_x, 
+				 mEditor.getUseEllipses());
 	}
 	rect.mLeft = (S32)ceil(right_x);
 	
 		S32 length = end - start;
 
 		font->render(text, start, 
-			     rect,
-			     mStyle->getSelectedColor().get(),
-			     LLFontGL::LEFT, mEditor.mVAlign, 
-			     LLFontGL::NORMAL, 
-			     LLFontGL::NO_SHADOW, 
-			     length,
-			     &right_x, 
-			     mEditor.getUseEllipses());
+				 rect,
+				 mStyle->getSelectedColor().get(),
+				 LLFontGL::LEFT, mEditor.mVAlign, 
+				 LLFontGL::NORMAL, 
+				 LLFontGL::NO_SHADOW, 
+				 length,
+				 &right_x, 
+				 mEditor.getUseEllipses());
 	}
 	rect.mLeft = (S32)ceil(right_x);
 	if( selection_end < seg_end )
 		S32 end = seg_end;
 		S32 length = end - start;
 		font->render(text, start, 
-			     rect, 
-			     color, 
-			     LLFontGL::LEFT, mEditor.mVAlign, 
-			     LLFontGL::NORMAL, 
-			     mStyle->getShadowType(), 
-			     length,
-			     &right_x, 
-			     mEditor.getUseEllipses());
+				 rect, 
+				 color, 
+				 LLFontGL::LEFT, mEditor.mVAlign, 
+				 LLFontGL::NORMAL, 
+				 mStyle->getShadowType(), 
+				 length,
+				 &right_x, 
+				 mEditor.getUseEllipses());
 	}
 	return right_x;
 }