diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llcombobox.cpp | 7 | ||||
| -rw-r--r-- | indra/llui/llscrollcontainer.cpp | 36 | ||||
| -rw-r--r-- | indra/llui/llscrollcontainer.h | 1 | ||||
| -rw-r--r-- | indra/llui/llscrolllistcolumn.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llscrolllistctrl.cpp | 12 | ||||
| -rw-r--r-- | indra/llui/lluictrl.cpp | 32 | ||||
| -rw-r--r-- | indra/llui/llview.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 11 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 94 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.h | 2 | ||||
| -rw-r--r-- | indra/newview/llworldmapview.cpp | 11 | 
11 files changed, 88 insertions, 127 deletions
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 5dfca4be16..5caad1919a 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -738,12 +738,7 @@ BOOL LLComboBox::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_re  		msg = tool_tip;  		// Convert rect local to screen coordinates -		localPointToScreen(  -			0, 0,  -			&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) ); -		localPointToScreen( -			getRect().getWidth(), getRect().getHeight(), -			&(sticky_rect_screen->mRight), &(sticky_rect_screen->mTop) ); +		*sticky_rect_screen = calcScreenRect();  	}  	return TRUE;  } diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index ea4bd2526e..402c050d2e 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -333,34 +333,6 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,  	return TRUE;  } - -BOOL LLScrollContainer::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect) -{ -	S32 local_x, local_y; -	for( S32 i = 0; i < SCROLLBAR_COUNT; i++ ) -	{ -		local_x = x - mScrollbar[i]->getRect().mLeft; -		local_y = y - mScrollbar[i]->getRect().mBottom; -		if( mScrollbar[i]->handleToolTip(local_x, local_y, msg, sticky_rect) ) -		{ -			return TRUE; -		} -	} -	// Handle 'child' view. -	if( mScrolledView ) -	{ -		local_x = x - mScrolledView->getRect().mLeft; -		local_y = y - mScrolledView->getRect().mBottom; -		if( mScrolledView->handleToolTip(local_x, local_y, msg, sticky_rect) ) -		{ -			return TRUE; -		} -	} - -	// Opaque -	return TRUE; -} -  void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const  {  	const LLRect& rect = mScrolledView->getRect(); @@ -500,12 +472,8 @@ bool LLScrollContainer::addChild(LLView* view, S32 tab_group)  {  	if (!mScrolledView)  	{ -		//*TODO: Move LLFolderView to llui and enable this check -// 		if (dynamic_cast<LLPanel*>(view) || dynamic_cast<LLContainerView*>(view) || dynamic_cast<LLScrollingPanelList*>(view) || dynamic_cast<LLFolderView*>(view)) -		{ -			// Use the first panel or container as the scrollable view (bit of a hack) -			mScrolledView = view; -		} +		// Use the first panel or container as the scrollable view (bit of a hack) +		mScrolledView = view;  	}  	bool ret_val = LLView::addChild(view, tab_group); diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h index 9cbfbc94a1..c2d4d2c861 100644 --- a/indra/llui/llscrollcontainer.h +++ b/indra/llui/llscrollcontainer.h @@ -105,7 +105,6 @@ public:  								   EAcceptance* accept,  								   std::string& tooltip_msg); -	virtual BOOL	handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect);  	virtual void	draw();  	virtual bool	addChild(LLView* view, S32 tab_group = 0); diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp index 686e0b6cb7..073e14386f 100644 --- a/indra/llui/llscrolllistcolumn.cpp +++ b/indra/llui/llscrolllistcolumn.cpp @@ -65,8 +65,6 @@ LLScrollColumnHeader::LLScrollColumnHeader(const LLScrollColumnHeader::Params& p  	resize_bar_p.enabled(false);  	mResizeBar = LLUICtrlFactory::create<LLResizeBar>(resize_bar_p);  	addChild(mResizeBar); - -	setToolTip(p.label());  }  LLScrollColumnHeader::~LLScrollColumnHeader() diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 75afbffc11..84a725ce02 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1512,19 +1512,12 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sti  		if (hit_cell   			&& hit_cell->isText())  		{ -  			S32 rect_left = getColumnOffsetFromIndex(column_index) + mItemListRect.mLeft;  			S32 rect_bottom = getRowOffsetFromIndex(getItemIndex(hit_item));  			LLRect cell_rect;  			cell_rect.setOriginAndSize(rect_left, rect_bottom, rect_left + columnp->getWidth(), mLineHeight);  			// Convert rect local to screen coordinates -			localPointToScreen(  -				cell_rect.mLeft, cell_rect.mBottom,  -				&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) ); -			localPointToScreen( -				cell_rect.mRight, cell_rect.mTop,  -				&(sticky_rect_screen->mRight), &(sticky_rect_screen->mTop) ); - +			localRectToScreen(cell_rect, sticky_rect_screen);  			msg = hit_cell->getValue().asString();  		}  		handled = TRUE; @@ -1849,8 +1842,7 @@ S32 LLScrollListCtrl::getColumnOffsetFromIndex(S32 index)  S32 LLScrollListCtrl::getRowOffsetFromIndex(S32 index)  { -	S32 row_bottom = ((mItemListRect.mTop - (index - mScrollLines)) * mLineHeight)  -						- mLineHeight; +	S32 row_bottom = (mItemListRect.mTop - ((index - mScrollLines + 1) * mLineHeight) );  	return row_bottom;  } diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 43430cba24..7d33a5ad1a 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -806,38 +806,6 @@ LLUICtrl* LLUICtrl::findRootMostFocusRoot()  	return focus_root;  } - -/* -// Don't let the children handle the tool tip.  Handle it here instead. -BOOL LLUICtrl::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) -{ -	BOOL handled = FALSE; -	if (getVisible() && pointInView( x, y ) )  -	{ -		if( !mToolTipMsg.empty() ) -		{ -			msg = mToolTipMsg; - -			// Convert rect local to screen coordinates -			localPointToScreen(  -				0, 0,  -				&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) ); -			localPointToScreen( -				getRect().getWidth(), getRect().getHeight(), -				&(sticky_rect_screen->mRight), &(sticky_rect_screen->mTop) ); - -			handled = TRUE; -		} -	} - -	if (!handled) -	{ -		return LLView::handleToolTip(x, y, msg, sticky_rect_screen); -	} - -	return handled; -}*/ -  // Skip over any parents that are not LLUICtrl's  //  Used in focus logic since only LLUICtrl elements can have focus  LLUICtrl* LLUICtrl::getParentUICtrl() const diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 777cf096ac..f01aacb797 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -743,12 +743,7 @@ BOOL LLView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_s  		msg = tool_tip;  		// Convert rect local to screen coordinates -		localPointToScreen( -			0, 0, -			&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) ); -		localPointToScreen( -			mRect.getWidth(), mRect.getHeight(), -			&(sticky_rect_screen->mRight), &(sticky_rect_screen->mTop) ); +		*sticky_rect_screen = calcScreenRect();  	}  	// don't allow any siblings to handle this event  	// even if we don't have a tooltip diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d328a3856f..bc2466d81b 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7609,6 +7609,17 @@        <key>Value</key>        <real>0.699999988079</real>      </map> +    <key>ToolTipFadeTime</key> +    <map> +      <key>Comment</key> +      <string>Seconds over which tooltip fades away</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.2</real> +    </map>      <key>ToolboxAutoMove</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e690ae5f6f..6f094e4b01 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -601,11 +601,11 @@ bool LLViewerWindow::shouldShowToolTipFor(LLMouseHandler *mh)  	{  		LLMouseHandler::EShowToolTip showlevel = mh->getShowToolTip(); -		return ( -			showlevel == LLMouseHandler::SHOW_ALWAYS || -			(showlevel == LLMouseHandler::SHOW_IF_NOT_BLOCKED && -			 !mToolTipBlocked) -			); +		bool tool_tip_allowed = (showlevel == LLMouseHandler::SHOW_ALWAYS  +								|| (showlevel == LLMouseHandler::SHOW_IF_NOT_BLOCKED  +									&& !mToolTipBlocked)); + +		return tool_tip_allowed;  	}  	return false;  } @@ -2617,57 +2617,91 @@ void LLViewerWindow::updateUI()  	// Show a new tool tip (or update one that is alrady shown)  	BOOL tool_tip_handled = FALSE;  	std::string tool_tip_msg; -	F32 tooltip_delay = gSavedSettings.getF32( "ToolTipDelay" ); -	//HACK: hack for tool-based tooltips which need to pop up more quickly -	//Also for show xui names as tooltips debug mode -	if ((mouse_captor && !mouse_captor->isView()) || LLUI::sShowXUINames) -	{ -		tooltip_delay = gSavedSettings.getF32( "DragAndDropToolTipDelay" ); -	} -	if( handled &&  -	    gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay && -	    !mWindow->isCursorHidden() ) +	if( handled  +		&& !mWindow->isCursorHidden() +		&& mToolTip)  	{  		LLRect screen_sticky_rect; -		LLMouseHandler *mh; +		LLMouseHandler *tooltip_source = NULL;  		S32 local_x, local_y;  		if (mouse_captor)  		{  			mouse_captor->screenPointToLocal(x, y, &local_x, &local_y); -			mh = mouse_captor; +			tooltip_source = mouse_captor;  		}  		else if (handled_by_top_ctrl)  		{  			top_ctrl->screenPointToLocal(x, y, &local_x, &local_y); -			mh = top_ctrl; +			tooltip_source = top_ctrl;  		}  		else  		{  			local_x = x; local_y = y; -			mh = mRootView; +			tooltip_source = mRootView;  		} +		F32 tooltip_delay = gSavedSettings.getF32( "ToolTipDelay" ); +		//HACK: hack for tool-based tooltips which need to pop up more quickly +		//Also for show xui names as tooltips debug mode +		if ((gFocusMgr.getMouseCapture()  +				&& !gFocusMgr.getMouseCapture()->isView())  +			|| LLUI::sShowXUINames) +		{ +			tooltip_delay = gSavedSettings.getF32( "DragAndDropToolTipDelay" ); +		} + +  		BOOL tooltip_vis = FALSE; -		if (shouldShowToolTipFor(mh)) +		if (shouldShowToolTipFor(tooltip_source))  		{ -			tool_tip_handled = mh->handleToolTip(local_x, local_y, tool_tip_msg, &screen_sticky_rect ); +			tool_tip_handled = tooltip_source->handleToolTip(local_x, local_y, tool_tip_msg, &screen_sticky_rect ); +			// if we actually got a tooltip back...  			if( tool_tip_handled && !tool_tip_msg.empty() )  			{ -				mToolTipStickyRect = screen_sticky_rect; -				mToolTip->setWrappedText( tool_tip_msg, 200 ); -				mToolTip->reshapeToFitText(); -				mToolTip->setOrigin( x, y ); -				LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0); -				mToolTip->translateIntoRect( virtual_window_rect, FALSE ); -				tooltip_vis = TRUE; +				if (mToolTip->getVisible()										// already showing a tooltip +					|| gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay)		// mouse has been still long enough to show the tooltip +				{ +					// if tooltip has changed or mouse has moved outside of "sticky" rectangle... +					if (mLastToolTipMessage != tool_tip_msg +						|| !mToolTipStickyRect.pointInRect(x, y)) +					{ +						//...update "sticky" rect and tooltip position +						mToolTipStickyRect = screen_sticky_rect; +						mToolTip->setOrigin( x, y ); +					} + +					// remember this tooltip so we know when it changes +					mLastToolTipMessage = tool_tip_msg; +					mToolTip->setWrappedText( tool_tip_msg, 200 ); +					mToolTip->reshapeToFitText(); +					LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0); +					mToolTip->translateIntoRect( virtual_window_rect, FALSE ); +					tooltip_vis = TRUE; +				}  			}  		} -		if (mToolTip) +		// HACK: assuming tooltip background is in ToolTipBGColor, perform fade out +		LLColor4 bg_color = LLUIColorTable::instance().getColor( "ToolTipBgColor" ); +		if (tooltip_vis) +		{ +			mToolTipFadeTimer.stop(); +			mToolTip->setBackgroundColor(bg_color); +		} +		else   		{ -			mToolTip->setVisible( tooltip_vis ); +			if (!mToolTipFadeTimer.getStarted()) +			{ +				mToolTipFadeTimer.start(); +			} +			F32 tool_tip_fade_time = gSavedSettings.getF32("ToolTipFadeTime"); +			bg_color.mV[VALPHA] = clamp_rescale(mToolTipFadeTimer.getElapsedTimeF32(), 0.f, tool_tip_fade_time, bg_color.mV[VALPHA], 0.f); +			mToolTip->setBackgroundColor(bg_color);  		} + +		// above interpolation of bg_color alpha is guaranteed to reach 0.f exactly +		mToolTip->setVisible( bg_color.mV[VALPHA] != 0.f );  	}		  	updateLayout(); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index ef7e30e8b9..a1120b303b 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -414,7 +414,9 @@ protected:  	LLProgressView	*mProgressView; +	LLFrameTimer	mToolTipFadeTimer;  	LLTextBox*		mToolTip; +	std::string		mLastToolTipMessage;  	BOOL			mToolTipBlocked;			// True after a key press or a mouse button event.  False once the mouse moves again.  	LLRect			mToolTipStickyRect;			// Once a tool tip is shown, it will stay visible until the mouse leaves this rect. diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 9e04c14beb..3deddf40ac 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1228,12 +1228,11 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic  			msg += region_flags;  		} -		S32 SLOP = 4; -		localPointToScreen(  -			x - SLOP, y - SLOP,  -			&(sticky_rect_screen->mLeft), &(sticky_rect_screen->mBottom) ); -		sticky_rect_screen->mRight = sticky_rect_screen->mLeft + 2 * SLOP; -		sticky_rect_screen->mTop = sticky_rect_screen->mBottom + 2 * SLOP; +		const S32 SLOP = 9; +		S32 screen_x, screen_y; + +		localPointToScreen(x, y, &screen_x, &screen_y); +		sticky_rect_screen->setCenterAndSize(screen_x, screen_y, SLOP, SLOP);  	}  	return TRUE;  }  | 
