diff options
| author | Tofu Linden <tofu.linden@lindenlab.com> | 2010-02-17 18:02:35 +0000 | 
|---|---|---|
| committer | Tofu Linden <tofu.linden@lindenlab.com> | 2010-02-17 18:02:35 +0000 | 
| commit | 2490f50ce1bc7ffe1e53a99e4081bee13253f09a (patch) | |
| tree | 1f2de35440c436795e68c118634a5ab0b2321c72 | |
| parent | 29dd5afaa8a85f0b57ddb3e9e281e1e6f5b43e29 (diff) | |
| parent | f52e7036940a015a405ae94aa016612c4160df9e (diff) | |
PE merge.
| -rw-r--r-- | indra/llui/llfloater.cpp | 39 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 1 | ||||
| -rw-r--r-- | indra/newview/llcallfloater.h | 4 | ||||
| -rw-r--r-- | indra/newview/llchathistory.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/lllogchat.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/llnearbychathandler.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llnotificationhandlerutil.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llscreenchannel.cpp | 25 | ||||
| -rw-r--r-- | indra/newview/llsidetray.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/lltoast.cpp | 159 | ||||
| -rw-r--r-- | indra/newview/lltoast.h | 26 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_toast.xml | 34 | 
13 files changed, 271 insertions, 88 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index a55915af35..0199fe3f57 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1565,25 +1565,13 @@ void LLFloater::draw()  	// draw background  	if( isBackgroundVisible() )  	{ +		drawShadow(this); +  		S32 left = LLPANEL_BORDER_WIDTH;  		S32 top = getRect().getHeight() - LLPANEL_BORDER_WIDTH;  		S32 right = getRect().getWidth() - LLPANEL_BORDER_WIDTH;  		S32 bottom = LLPANEL_BORDER_WIDTH; -		static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0); -		static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow"); -		LLColor4 shadow_color = shadow_color_cached; -		F32 shadow_offset = (F32)shadow_offset_S32; - -		if (!isBackgroundOpaque()) -		{ -			shadow_offset *= 0.2f; -			shadow_color.mV[VALPHA] *= 0.5f; -		} -		gl_drop_shadow(left, top, right, bottom,  -			shadow_color % alpha,  -			llround(shadow_offset)); -  		LLUIImage* image = NULL;  		LLColor4 color;  		if (isBackgroundOpaque()) @@ -1666,6 +1654,29 @@ void LLFloater::draw()  	}  } +void	LLFloater::drawShadow(LLPanel* panel) +{ +	F32 alpha = panel->getDrawContext().mAlpha; +	S32 left = LLPANEL_BORDER_WIDTH; +	S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH; +	S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH; +	S32 bottom = LLPANEL_BORDER_WIDTH; + +	static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0); +	static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow"); +	LLColor4 shadow_color = shadow_color_cached; +	F32 shadow_offset = (F32)shadow_offset_S32; + +	if (!panel->isBackgroundOpaque()) +	{ +		shadow_offset *= 0.2f; +		shadow_color.mV[VALPHA] *= 0.5f; +	} +	gl_drop_shadow(left, top, right, bottom,  +		shadow_color % alpha,  +		llround(shadow_offset)); +} +  void	LLFloater::setCanMinimize(BOOL can_minimize)  {  	// if removing minimize/restore button programmatically, diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 2166d8db8a..19e8288807 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -222,6 +222,7 @@ public:  	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 mask);  	virtual void	draw(); +	virtual void	drawShadow(LLPanel* panel);  	virtual void	onOpen(const LLSD& key) {}  	virtual void	onClose(bool app_quitting) {} diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index dac4390fa7..0a8ea7de39 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -260,6 +260,10 @@ private:  	 * @see sOnCurrentChannelChanged()  	 */  	static LLVoiceChannel* sCurrentVoiceCanel; + +	/* virtual */ +	LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; } +  	boost::signals2::connection mVoiceChannelStateChangeConnection;  }; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 81cc52528c..cf5ac6b2e6 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -122,7 +122,7 @@ public:  	BOOL handleToolTip(S32 x, S32 y, MASK mask)  	{  		LLTextBase* name = getChild<LLTextBase>("user_name"); -		if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom) +		if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && mFrom.size() && SYSTEM_FROM != mFrom)  		{  			// Spawn at right side of the name textbox. @@ -179,12 +179,7 @@ public:  		}  		else if (level == "add")  		{ -			std::string name; -			name.assign(getFirstName()); -			name.append(" "); -			name.append(getLastName()); - -			LLAvatarActions::requestFriendshipDialog(getAvatarId(), name); +			LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom);  		}  		else if (level == "remove")  		{ @@ -253,8 +248,6 @@ public:  	}  	const LLUUID&		getAvatarId () const { return mAvatarID;} -	const std::string&	getFirstName() const { return mFirstName; } -	const std::string&	getLastName	() const { return mLastName; }  	void setup(const LLChat& chat,const LLStyle::Params& style_params)   	{ @@ -264,7 +257,7 @@ public:  		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));  		//*TODO overly defensive thing, source type should be maintained out there -		if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM) +		if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM)  		{  			mSourceType = CHAT_SOURCE_SYSTEM;  		} @@ -275,9 +268,11 @@ public:  		userName->setColor(style_params.color());  		userName->setValue(chat.mFromName); +		mFrom = chat.mFromName;  		if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)  		{ -			userName->setValue(LLTrans::getString("SECOND_LIFE")); +			mFrom = LLTrans::getString("SECOND_LIFE"); +			userName->setValue(mFrom);  		} @@ -337,8 +332,7 @@ public:  	{  		if (id != mAvatarID)  			return; -		mFirstName = first; -		mLastName = last; +		mFrom = first + " " + last;  	}  protected:  	static const S32 PADDING = 20; @@ -423,8 +417,6 @@ protected:  	LLUUID			    mAvatarID;  	EChatSourceType		mSourceType; -	std::string			mFirstName; -	std::string			mLastName;  	std::string			mFrom;  	LLUUID				mSessionID; @@ -796,6 +788,12 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  			}  		} +		if (irc_me && !use_plain_text_chat_history) +		{ +			message = chat.mFromName + message; +		} +		 +  		mEditor->appendText(message, FALSE, style_params);  	}  	mEditor->blockUndo(); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 2f248f3596..db7998fe6e 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -39,6 +39,7 @@  #include "llavatariconctrl.h"  #include "llgroupiconctrl.h"  #include "llagent.h" +#include "lltransientfloatermgr.h"  //  // LLIMFloaterContainer @@ -47,9 +48,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)  :	LLMultiFloater(seed)  {  	mAutoResize = FALSE; +	LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);  } -LLIMFloaterContainer::~LLIMFloaterContainer(){} +LLIMFloaterContainer::~LLIMFloaterContainer() +{ +	LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this); +}  BOOL LLIMFloaterContainer::postBuild()  { diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 96ce01c05f..f13445fa5d 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -69,6 +69,8 @@ const static std::string MULTI_LINE_PREFIX(" ");   *  Katar Ivercourt is Offline   *  [3:00]  Katar Ivercourt is Offline   *  [2009/11/20 3:01]  Corba ProductEngine is Offline + * + * Note: "You" was used as an avatar names in viewers of previous versions   */  const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); @@ -78,6 +80,9 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+   */  const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)"); +//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st" +const static std::string NAME_TEXT_DIVIDER(": "); +  const static int IDX_TIMESTAMP = 1;  const static int IDX_STUFF = 2;  const static int IDX_NAME = 1; @@ -160,10 +165,19 @@ void LLLogChat::saveHistory(const std::string& filename,  	if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))  		 item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate")); -	item["from"]	= from;  	item["from_id"]	= from_id;  	item["message"]	= line; +	//adding "Second Life:" for all system messages to make chat log history parsing more reliable +	if (from.empty() && from_id.isNull()) +	{ +		item["from"] = SYSTEM_FROM;  +	} +	else +	{ +		item["from"] = from; +	} +  	file << LLChatLogFormatter(item) << std::endl;  	file.close(); @@ -398,6 +412,18 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)  		im[IM_FROM_ID] = LLUUID::null;  	} +	//possibly a case of complex object names consisting of 3+ words +	if (!has_name) +	{ +		U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER); +		if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length())) +		{ +			im[IM_FROM] = stuff.substr(0, divider_pos); +			im[IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length()); +			return true; +		} +	} +  	if (!has_name)  	{  		//text is mandatory diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 29e3c66684..3c390c0281 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -282,7 +282,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()  				gFloaterView->sendChildToBack(toast);  			} -			bottom = toast->getRect().mTop; +			bottom = toast->getRect().mTop - toast->getTopPad();  		}		  	}  } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index b8e0892b02..35569cffac 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -220,6 +220,7 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat  	{  		LLChat chat_msg(notification->getMessage());  		chat_msg.mSourceType = type; +		chat_msg.mFromName = SYSTEM_FROM;  		nearby_chat->addMessage(chat_msg);  	}  } diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 7c2e7e3319..c75d90be6f 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -79,17 +79,12 @@ LLScreenChannelBase::~LLScreenChannelBase()  bool  LLScreenChannelBase::isHovering()  { -	bool res = mHoveredToast != NULL; -	if (!res) +	if (!mHoveredToast)  	{ -		return res; +		return false;  	} -	S32 x, y; -	mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), -			gViewerWindow->getCurrentMouseY(), &x, &y); -	res = mHoveredToast->pointInView(x, y) == TRUE; -	return res; +	return mHoveredToast->isHovered();  }  void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) @@ -479,7 +474,8 @@ void LLScreenChannel::showToastsBottom()  	{  		if(it != mToastList.rbegin())  		{ -			bottom = (*(it-1)).toast->getRect().mTop; +			LLToast* toast = (*(it-1)).toast; +			bottom = toast->getRect().mTop - toast->getTopPad();  			toast_margin = gSavedSettings.getS32("ToastGap");  		} @@ -777,23 +773,16 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)  {  	// because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave  	// we must check hovering directly to prevent incorrect setting for hovering in a channel -	S32 x,y;  	if (mouse_enter)  	{ -		toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), -				gViewerWindow->getCurrentMouseY(), &x, &y); -		bool hover = toast->pointInView(x, y) == TRUE; -		if (hover) +		if (toast->isHovered())  		{  			mHoveredToast = toast;  		}  	}  	else if (mHoveredToast != NULL)  	{ -		mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), -				gViewerWindow->getCurrentMouseY(), &x, &y); -		bool hover = mHoveredToast->pointInView(x, y) == TRUE; -		if (!hover) +		if (!mHoveredToast->isHovered())  		{  			mHoveredToast = NULL;  		} diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 50c47e293e..fba1503b4a 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -248,6 +248,11 @@ LLSideTray::LLSideTray(Params& params)  	// panel_name should be specified via "parameter" attribute.  	commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));  	LLTransientFloaterMgr::getInstance()->addControlView(this); +	LLView* side_bar_tabs  = gViewerWindow->getRootView()->getChildView("side_bar_tabs"); +	if (side_bar_tabs != NULL) +	{ +		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); +	}  	LLPanel::Params p;  	p.name = "buttons_panel"; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 110d158e2d..60a89c02e4 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -68,12 +68,17 @@ LLToast::LLToast(const LLToast::Params& p)  	mNotification(p.notification),  	mIsHidden(false),  	mHideBtnPressed(false), -	mIsTip(p.is_tip) +	mIsTip(p.is_tip), +	mWrapperPanel(NULL)  {  	LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);  	setCanDrag(FALSE); +	mWrapperPanel = getChild<LLPanel>("wrapper_panel"); +	mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this)); +	mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this)); +  	if(mPanel)  	{  		insertPanel(mPanel); @@ -83,6 +88,8 @@ LLToast::LLToast(const LLToast::Params& p)  	{  		mHideBtn = getChild<LLButton>("hide_btn");  		mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this)); +		mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this)); +		mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));  	}  	// init callbacks if present @@ -174,6 +181,42 @@ void LLToast::hide()  	mOnFadeSignal(this);   } +void LLToast::onFocusLost() +{ +	if(mWrapperPanel && !isBackgroundVisible()) +	{ +		// Lets make wrapper panel behave like a floater +		setBackgroundOpaque(FALSE); +	} +} + +void LLToast::onFocusReceived() +{ +	if(mWrapperPanel && !isBackgroundVisible()) +	{ +		// Lets make wrapper panel behave like a floater +		setBackgroundOpaque(TRUE); +	} +} + +S32 LLToast::getTopPad() +{ +	if(mWrapperPanel) +	{ +		return getRect().getHeight() - mWrapperPanel->getRect().getHeight(); +	} +	return 0; +} + +S32 LLToast::getRightPad() +{ +	if(mWrapperPanel) +	{ +		return getRect().getWidth() - mWrapperPanel->getRect().getWidth(); +	} +	return 0; +} +  //--------------------------------------------------------------------------  void LLToast::setCanFade(bool can_fade)   {  @@ -199,22 +242,21 @@ void LLToast::reshapeToPanel()  	if(!panel)  		return; -	LLRect panel_rect; +	LLRect panel_rect = panel->getRect(); -	panel_rect = panel->getRect(); -	reshape(panel_rect.getWidth(), panel_rect.getHeight());  	panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight()); -	panel->setRect(panel_rect); +	panel->setShape(panel_rect);  	LLRect toast_rect = getRect(); -	toast_rect.setLeftTopAndSize(toast_rect.mLeft,toast_rect.mTop,panel_rect.getWidth(), panel_rect.getHeight()); -	setRect(toast_rect); +	toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, +		panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad()); +	setShape(toast_rect);  }  void LLToast::insertPanel(LLPanel* panel)  { -	addChild(panel);	 +	mWrapperPanel->addChild(panel);	  	reshapeToPanel();  } @@ -227,6 +269,19 @@ void LLToast::draw()  	}  	LLFloater::draw(); + +	if(!isBackgroundVisible()) +	{ +		// Floater background is invisible, lets make wrapper panel look like a  +		// floater - draw shadow. +		drawShadow(mWrapperPanel); + +		// Shadow will probably overlap close button, lets redraw the button +		if(mHideBtn) +		{ +			drawChild(mHideBtn); +		} +	}  }  //-------------------------------------------------------------------------- @@ -261,43 +316,78 @@ void LLToast::setVisible(BOOL show)  	}  } -//-------------------------------------------------------------------------- -void LLToast::onMouseEnter(S32 x, S32 y, MASK mask) +void LLToast::onToastMouseEnter()  { -	mOnToastHoverSignal(this, MOUSE_ENTER); +	LLRect panel_rc = mWrapperPanel->calcScreenRect(); +	LLRect button_rc; +	if(mHideBtn) +	{ +		button_rc = mHideBtn->calcScreenRect(); +	} -	setBackgroundOpaque(TRUE); +	S32 x, y; +	LLUI::getMousePositionScreen(&x, &y); -	//toasts fading is management by Screen Channel -	 -	sendChildToFront(mHideBtn); -	if(mHideBtn && mHideBtn->getEnabled()) -		mHideBtn->setVisible(TRUE); -	mOnMouseEnterSignal(this); +	if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y)) +	{ +		mOnToastHoverSignal(this, MOUSE_ENTER); + +		setBackgroundOpaque(TRUE); + +		//toasts fading is management by Screen Channel -	LLModalDialog::onMouseEnter(x, y, mask); +		sendChildToFront(mHideBtn); +		if(mHideBtn && mHideBtn->getEnabled()) +		{ +			mHideBtn->setVisible(TRUE); +		} +		mOnMouseEnterSignal(this); +		mToastMouseEnterSignal(this, getValue()); +	}  } -//-------------------------------------------------------------------------- -void LLToast::onMouseLeave(S32 x, S32 y, MASK mask) -{	 -	mOnToastHoverSignal(this, MOUSE_LEAVE); +void LLToast::onToastMouseLeave() +{ +	LLRect panel_rc = mWrapperPanel->calcScreenRect(); +	LLRect button_rc; +	if(mHideBtn) +	{ +		button_rc = mHideBtn->calcScreenRect(); +	} -	//toasts fading is management by Screen Channel +	S32 x, y; +	LLUI::getMousePositionScreen(&x, &y); -	if(mHideBtn && mHideBtn->getEnabled()) +	if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))  	{ -		if( mHideBtnPressed ) +		mOnToastHoverSignal(this, MOUSE_LEAVE); + +		//toasts fading is management by Screen Channel + +		if(mHideBtn && mHideBtn->getEnabled())  		{ -			mHideBtnPressed = false; -			return; +			if( mHideBtnPressed ) +			{ +				mHideBtnPressed = false; +				return; +			} +			mHideBtn->setVisible(FALSE);		  		} -		mHideBtn->setVisible(FALSE);		 +		mToastMouseLeaveSignal(this, getValue());  	} - -	LLModalDialog::onMouseLeave(x, y, mask);  } +void LLToast::setBackgroundOpaque(BOOL b) +{ +	if(mWrapperPanel && !isBackgroundVisible()) +	{ +		mWrapperPanel->setBackgroundOpaque(b); +	} +	else +	{ +		LLModalDialog::setBackgroundOpaque(b); +	} +}  void LLNotificationsUI::LLToast::stopFading()  { @@ -315,6 +405,13 @@ void LLNotificationsUI::LLToast::startFading()  	}  } +bool LLToast::isHovered() +{ +	S32 x, y; +	LLUI::getMousePositionScreen(&x, &y); +	return mWrapperPanel->calcScreenRect().pointInRect(x, y); +} +  //--------------------------------------------------------------------------  BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask) diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 3d25fd4f02..64855020a9 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -86,8 +86,6 @@ public:  	// Toast handlers  	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); -	virtual void onMouseEnter(S32 x, S32 y, MASK mask); -	virtual void onMouseLeave(S32 x, S32 y, MASK mask);  	//Fading @@ -97,6 +95,7 @@ public:  	/** Start fading timer */  	virtual void startFading(); +	bool isHovered();  	// Operating with toasts  	// insert a panel to a toast @@ -118,10 +117,22 @@ public:  	virtual void draw();  	//  	virtual void setVisible(BOOL show); + +	/*virtual*/ void setBackgroundOpaque(BOOL b);  	//  	virtual void hide(); +	/*virtual*/ void onFocusLost(); + +	/*virtual*/ void onFocusReceived(); +	/** +	 * Returns padding between floater top and wrapper_panel top. +	 * This padding should be taken into account when positioning or reshaping toasts +	 */ +	S32 getTopPad(); + +	S32 getRightPad();  	// get/set Toast's flags or states  	// get information whether the notification corresponding to the toast is valid or not @@ -154,9 +165,15 @@ public:  	toast_hover_check_signal_t mOnToastHoverSignal;	  	boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); } +	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); }; +	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };  private: +	void onToastMouseEnter(); + +	void onToastMouseLeave(); +  	void handleTipToastClick(S32 x, S32 y, MASK mask);  	// check timer @@ -168,6 +185,8 @@ private:  	LLUUID				mSessionID;  	LLNotificationPtr	mNotification; +	LLPanel* mWrapperPanel; +  	// timer counts a lifetime of a toast  	LLTimer		mTimer;  	F32			mToastLifetime; // in seconds @@ -184,6 +203,9 @@ private:  	bool		mHideBtnPressed;  	bool		mIsHidden;  // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)  	bool		mIsTip; + +	commit_signal_t mToastMouseEnterSignal; +	commit_signal_t mToastMouseLeaveSignal;  };  } diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index bfe3cce7d0..11069b3ac3 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -3,17 +3,25 @@  <!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!--> +<!--  +     This floater is invisible. To make toast look like a floater we render wrapper_panel +     like a floater(draw shadows and so on). This is done with one purpose - make close button +     look like it is positioned out of floater and able to accept mouse clicks (see EXT-4246) +--> +  <floater - legacy_header_height="18" + legacy_header_height="0" + header_height="0"   name="toast"   title=""   visible="false"   layout="topleft" - height="40"   - width="305" + height="47"   + width="310"   left="0"   top="0"   follows="right|bottom" + background_visible="false"   bg_opaque_image="Toast_Over"   bg_alpha_image="Toast_Background"   can_minimize="false" @@ -27,6 +35,21 @@   drop_shadow_visible = "false"   border = "false"  > + <panel +  background_opaque="false" +  border_visible="false" +  background_visible="true" +  bg_opaque_image="Toast_Over" +  bg_alpha_image="Toast_Background" +  label="wrapper_panel" +  layout="topleft" +  left="0" +  name="wrapper_panel" +  top="7" +  height="40" +  follows="all"  +  translate="false" +  width="305">    <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->    <text      clip_partial="true"  @@ -46,10 +69,11 @@     width="260">      Toast text;    </text> + </panel>    <button      layout="topleft" -    top="-14" -    left="293" +    top="0" +    right="310"      width="17"      height="17"      follows="top|right" | 
