diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llfloater.cpp | 4 | ||||
| -rw-r--r-- | indra/llui/llscrolllistctrl.cpp | 4 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 136 | ||||
| -rw-r--r-- | indra/newview/llchathistory.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llchathistory.h | 1 | ||||
| -rw-r--r-- | indra/newview/lltoast.cpp | 5 | 
6 files changed, 92 insertions, 69 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 6babaf936b..fad98e553f 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -330,6 +330,7 @@ void LLFloater::addDragHandle()  		addChild(mDragHandle);  	}  	layoutDragHandle(); +	applyTitle();  }  void LLFloater::layoutDragHandle() @@ -348,7 +349,6 @@ void LLFloater::layoutDragHandle()  	}  	mDragHandle->setRect(rect);  	updateTitleButtons(); -	applyTitle();  }  void LLFloater::addResizeCtrls() @@ -2519,7 +2519,7 @@ LLFloater *LLFloaterView::getBackmost() const  void LLFloaterView::syncFloaterTabOrder()  { -	// look for a visible modal dialog, starting from first (should be only one) +	// look for a visible modal dialog, starting from first  	LLModalDialog* modal_dialog = NULL;  	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)  	{ diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 94eade06ad..d4d161f2c9 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -2949,7 +2949,6 @@ BOOL LLScrollListCtrl::operateOnAll(EOperation op)  //virtual   void LLScrollListCtrl::setFocus(BOOL b)  { -	mSearchString.clear();  	// for tabbing into pristine scroll lists (Finder)  	if (!getFirstSelected())  	{ @@ -2994,6 +2993,9 @@ void LLScrollListCtrl::onFocusLost()  	{  		gFocusMgr.setMouseCapture(NULL);  	} + +	mSearchString.clear(); +  	LLUICtrl::onFocusLost();  } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 78a6ab1eaa..616033f77f 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -962,18 +962,19 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)  {  	if (width != getRect().getWidth() || height != getRect().getHeight())  	{ -		//EXT-4288 -		//to keep consistance scrolling behaviour  -		//when scrolling from top and from bottom... -		bool is_scrolled_to_end = (mScroller!=NULL) && scrolledToEnd(); -		 +		bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; +  		LLUICtrl::reshape( width, height, called_from_parent ); -	 -		if (is_scrolled_to_end) + +		if (mScroller && scrolled_to_bottom && mTrackEnd)  		{ -			deselect(); -			endOfDoc(); -		}		 +			// keep bottom of text buffer visible +			// do this here as well as in reflow to handle case +			// where shrinking from top, which causes buffer to temporarily  +			// not be scrolled to the bottom, since the scroll index +			// specified the _top_ of the visible document region +			mScroller->goToBottom(); +		}  		// do this first after reshape, because other things depend on  		// up-to-date mVisibleTextRect @@ -1116,6 +1117,34 @@ void LLTextBase::reflow()  	updateSegments(); +	if (mReflowIndex == S32_MAX) +	{ +		return; +	} + +	bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; + +	LLRect cursor_rect = getLocalRectFromDocIndex(mCursorPos); +	bool follow_selection = getLocalRect().overlaps(cursor_rect); // cursor is (potentially) visible + +	// store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing +	cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop; +	cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom; + +	S32 first_line = getFirstVisibleLine(); + +	// if scroll anchor not on first line, update it to first character of first line +	if (!mLineInfoList.empty() +		&&	(mScrollIndex <  mLineInfoList[first_line].mDocIndexStart +			||	mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) +	{ +		mScrollIndex = mLineInfoList[first_line].mDocIndexStart; +	} +	LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex); +	// store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing +	first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop; +	first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom; +  	S32 reflow_count = 0;  	while(mReflowIndex < S32_MAX)  	{ @@ -1129,6 +1158,7 @@ void LLTextBase::reflow()  			lldebugs << "Breaking out of reflow due to possible infinite loop in " << getName() << llendl;  			break;  		} +	  		S32 start_index = mReflowIndex;  		mReflowIndex = S32_MAX; @@ -1136,25 +1166,6 @@ void LLTextBase::reflow()  		// to force inlined widgets with follows set to shrink  		mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); -		bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; - -		LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos); -		bool follow_selection = mVisibleTextRect.overlaps(old_cursor_rect); // cursor is visible -		old_cursor_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom); - -		S32 first_line = getFirstVisibleLine(); - -		// if scroll anchor not on first line, update it to first character of first line -		if (!mLineInfoList.empty() -			&&	(mScrollIndex <  mLineInfoList[first_line].mDocIndexStart -				||	mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) -		{ -			mScrollIndex = mLineInfoList[first_line].mDocIndexStart; -		} -		LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex); -		// subtract off effect of horizontal scrollbar from local position of first char -		first_char_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom); -  		S32 cur_top = 0;  		segment_set_t::iterator seg_iter = mSegments.begin(); @@ -1275,32 +1286,42 @@ void LLTextBase::reflow()  			segmentp->updateLayout(*this);  		} +	} -		// apply scroll constraints after reflowing text -		if (!hasMouseCapture() && mScroller) +	// apply scroll constraints after reflowing text +	if (!hasMouseCapture() && mScroller) +	{ +		if (scrolled_to_bottom && mTrackEnd)  		{ -			if (scrolled_to_bottom && mTrackEnd) -			{ -				// keep bottom of text buffer visible -				endOfDoc(); -			} -			else if (hasSelection() && follow_selection) -			{ -				// keep cursor in same vertical position on screen when selecting text -				LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos); -				mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect); -			} -			else -			{ -				// keep first line of text visible -				LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex); -				mScroller->scrollToShowRect(new_first_char_rect, first_char_rect); -			} +			// keep bottom of text buffer visible +			endOfDoc();  		} +		else if (hasSelection() && follow_selection) +		{ +			// keep cursor in same vertical position on screen when selecting text +			LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos); +			LLRect old_cursor_rect = cursor_rect; +			old_cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop; +			old_cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom; -		// reset desired x cursor position -		updateCursorXPos(); +			mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect); +		} +		else +		{ +			// keep first line of text visible +			LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex); + +			// pass in desired rect in the coordinate frame of the document viewport +			LLRect old_first_char_rect = first_char_rect; +			old_first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop; +			old_first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom; + +			mScroller->scrollToShowRect(new_first_char_rect, old_first_char_rect); +		}  	} + +	// reset desired x cursor position +	updateCursorXPos();  }  LLRect LLTextBase::getTextBoundingRect() @@ -1858,7 +1879,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  			pos = segment_line_start;  			break;  		} -		if (local_x < start_x + text_width			// cursor to left of right edge of text +		if (local_x < start_x + text_width						// cursor to left of right edge of text  			|| newline)								// or this line ends with a newline, set doc pos to newline char  		{  			// Figure out which character we're nearest to. @@ -1958,11 +1979,18 @@ LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const  LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const  { +	LLRect content_window_rect = mScroller ? mScroller->getContentWindowRect() : getLocalRect(); +	if (mBorderVisible) +	{ +		content_window_rect.stretch(-1); +	} +  	LLRect local_rect; +  	if (mLineInfoList.empty())   	{   		// return default height rect in upper left -		local_rect = mVisibleTextRect; +		local_rect = content_window_rect;  		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());  		return local_rect;  	} @@ -1973,8 +2001,8 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const  	// compensate for scrolled, inset view of doc  	LLRect scrolled_view_rect = getVisibleDocumentRect();  	local_rect = doc_rect; -	local_rect.translate(mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,  -						mVisibleTextRect.mBottom - scrolled_view_rect.mBottom); +	local_rect.translate(content_window_rect.mLeft - scrolled_view_rect.mLeft,  +						content_window_rect.mBottom - scrolled_view_rect.mBottom);  	return local_rect;  } diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index bd14732b4a..06609a1fb2 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -845,13 +845,4 @@ void LLChatHistory::draw()  	}  	LLUICtrl::draw(); -} - -void LLChatHistory::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	bool is_scrolled_to_end = mEditor->scrolledToEnd(); -	LLUICtrl::reshape( width, height, called_from_parent ); -	// update scroll -	if (is_scrolled_to_end) -		mEditor->setCursorAndScrollToEnd(); -} +}
\ No newline at end of file diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 950b32861b..fa1f2e04a4 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -122,7 +122,6 @@ class LLChatHistory : public LLUICtrl  		 */  		void appendMessage(const LLChat& chat, const LLSD &args = LLSD(), const LLStyle::Params& input_append_params = LLStyle::Params());  		/*virtual*/ void clear(); -		/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	private:  		std::string mLastFromName; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 568cd4cb19..9abfab300c 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -271,7 +271,10 @@ void LLToast::setVisible(BOOL show)  		{  			mTimer->start();  		} -		LLModalDialog::setFrontmost(FALSE); +		if (!getVisible()) +		{ +			LLModalDialog::setFrontmost(FALSE); +		}  	}  	else  	{ | 
