diff options
| -rw-r--r-- | indra/newview/llimview.cpp | 221 | 
1 files changed, 104 insertions, 117 deletions
| diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 8c862548bb..a84dbcd84a 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -160,163 +160,150 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id,  void on_new_message(const LLSD& msg)  { -    std::string action; +    std::string user_preferences;      LLUUID participant_id = msg["from_id"].asUUID();      LLUUID session_id = msg["session_id"].asUUID();      LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id); -    //  determine action for this session +    // do not show notification which goes from agent +    if (gAgent.getID() == participant_id) +    { +        return; +    } + +    // determine state of conversations floater +    enum {CLOSED, NOT_ON_TOP, ON_TOP, ON_TOP_AND_ITEM_IS_SELECTED} conversations_floater_status; + +    LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); +	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); + +	if (!LLFloater::isVisible(im_box) || im_box->isMinimized()) +	{ +		conversations_floater_status = CLOSED; +	} +	else if (!im_box->isFrontmost() && +			(!session_floater || !LLFloater::isVisible(session_floater) +	            || session_floater->isMinimized() || !session_floater->isFrontmost())) +	{ +		conversations_floater_status = NOT_ON_TOP; +	} +	else if (im_box->getSelectedSession() != session_id) +	{ +		conversations_floater_status = ON_TOP; +    } +	else +	{ +		conversations_floater_status = ON_TOP_AND_ITEM_IS_SELECTED; +	} +    //  determine user prefs for this session      if (session_id.isNull())      { -        action = gSavedSettings.getString("NotificationNearbyChatOptions"); +    	user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");      }      else if(session->isP2PSessionType())      {          if (LLAvatarTracker::instance().isBuddy(participant_id))          { -            action = gSavedSettings.getString("NotificationFriendIMOptions"); +        	user_preferences = gSavedSettings.getString("NotificationFriendIMOptions");          }          else          { -            action = gSavedSettings.getString("NotificationNonFriendIMOptions"); +        	user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions");          }      }      else if(session->isAdHocSessionType())      { -        action = gSavedSettings.getString("NotificationConferenceIMOptions"); +    	user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions");      }      else if(session->isGroupSessionType())      { -        action = gSavedSettings.getString("NotificationGroupChatOptions"); +    	user_preferences = gSavedSettings.getString("NotificationGroupChatOptions");      } -    // do not show notification which goes from agent -    if (gAgent.getID() == participant_id) -    { -        return; -    } - -    // execution of the action - -    LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); -	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); -	 -	if (im_box->isFrontmost() && im_box->getSelectedSession() == session_id -		&& !(session_floater->getHost() ? im_box->isMinimized() : session_floater->isMinimized())) -	{ -		return; -	} -	 -    //session floater not focused (visible or not) -    bool session_floater_not_focused = session_floater && !session_floater->hasFocus(); - -    //conv. floater is closed -    bool conversation_floater_is_closed = -    		!(  im_box -    		    && im_box->isInVisibleChain() -                && !im_box->isMinimized()); - -    //conversation floater not focused (visible or not) -    bool conversation_floater_not_focused = -    		conversation_floater_is_closed || !im_box->hasFocus(); -    // sess. floater is open -    bool session_floater_is_open = -            session_floater -            && session_floater->isInVisibleChain() -            && !session_floater->isMinimized() -            && !(session_floater->getHost() && session_floater->getHost()->isMinimized()); - -    bool conversation_floater_collapsed = !session_floater->isMessagePaneExpanded(); -    if (("toast" == action && !session_floater_is_open) || conversation_floater_collapsed) -    { -        //User is not focused on conversation containing the message -        if(session_floater_not_focused || conversation_floater_collapsed) -        { -        	if(!LLMuteList::getInstance()->isMuted(participant_id)) -        	{ -        		im_box->flashConversationItemWidget(session_id, true); -        	} -            //The conversation floater isn't focused/open -            if(conversation_floater_not_focused || conversation_floater_collapsed) -            { -            	if(!LLMuteList::getInstance()->isMuted(participant_id)  -                    && !gAgent.isDoNotDisturb()) -            	{ -            		gToolBarView->flashCommand(LLCommandId("chat"), true); -            	} - -                //Show IM toasts (upper right toasts) -                // Skip toasting for system messages and for nearby chat -                if(session_id.notNull() && participant_id.notNull()) -                { -                    LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); -                } -            } -		} -    } +    // actions: -    else if ("flash" == action) +    // 0. nothing - exit +    if ("none" == user_preferences || +    		ON_TOP_AND_ITEM_IS_SELECTED == conversations_floater_status)      { -    	if (!gAgent.isDoNotDisturb()) -    	{ -			im_box->flashConversationItemWidget(session_id, true); -			if(conversation_floater_not_focused) -			{ -				//User is not focused on conversation containing the message -				gToolBarView->flashCommand(LLCommandId("chat"), true); -			} -		} -		else if(session_id.notNull() && participant_id.notNull()) -		{ -			//If a DND message, allow notification to be stored so upon DND exit  -			//useMostItrusiveIMNotification will be called to notify user a message exists -			LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); -		} +    	return;      } -    else if("openconversations" == action) +    // 1. open floater and [optional] surface it +    if ("openconversations" == user_preferences && +    		(CLOSED == conversations_floater_status +    				|| NOT_ON_TOP == conversations_floater_status))      { -        //User is not focused on conversation containing the message -        if(session_floater_not_focused) +    	if(!gAgent.isDoNotDisturb())          { -            //Flash line item -            im_box->flashConversationItemWidget(session_id, true); - -            if(!gAgent.isDoNotDisturb()) -            { -				//Surface conversations floater -				LLFloaterReg::showInstance("im_container"); -				im_box->collapseMessagesPane(false); -				if (session_floater) +			// Open conversations floater +			LLFloaterReg::showInstance("im_container"); +			im_box->collapseMessagesPane(false); +			if (session_floater) +			{ +				if (session_floater->getHost())  				{ -					if (session_floater->getHost()) +					if (NULL != im_box && im_box->isMinimized())  					{ -						if (NULL != im_box && im_box->isMinimized()) -						{ -							LLFloater::onClickMinimize(im_box); -						} +						LLFloater::onClickMinimize(im_box);  					} -					else +				} +				else +				{ +					if (session_floater->isMinimized())  					{ -						if (session_floater->isMinimized()) -						{ -							LLFloater::onClickMinimize(session_floater); -						} +						LLFloater::onClickMinimize(session_floater);  					}  				}  			} - -            //If in DND mode, allow notification to be stored so upon DND exit  +		} +        else +        { +            //If in DND mode, allow notification to be stored so upon DND exit              //useMostItrusiveIMNotification will be called to notify user a message exists -            if(session_id.notNull()  -                && participant_id.notNull() -                && gAgent.isDoNotDisturb() -				&& !session_floater_is_open) +            if(session_id.notNull() +               && participant_id.notNull() +		       && !session_floater->isShown())              {                  LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); -			} -		} +	        } +        } +    } + +    // 2. Flash line item +    if ("openconversations" == user_preferences +    		|| NOT_ON_TOP == conversations_floater_status) +    { +    	if(!LLMuteList::getInstance()->isMuted(participant_id)) +    	{ +    		im_box->flashConversationItemWidget(session_id, true); +    	} +    } + +    // 3. Flash FUI button +    if ("flash" == user_preferences && +    		(CLOSED == conversations_floater_status +    		    || NOT_ON_TOP == conversations_floater_status)) +    { +    	if(!LLMuteList::getInstance()->isMuted(participant_id) +            && !gAgent.isDoNotDisturb()) +    	{ +    		gToolBarView->flashCommand(LLCommandId("chat"), true); +    	} +    } + +    // 4. Toast +    if ("toast" == user_preferences && +    		(CLOSED == conversations_floater_status +    		    || NOT_ON_TOP == conversations_floater_status)) +    { +        //Show IM toasts (upper right toasts) +        // Skip toasting for system messages and for nearby chat +        if(session_id.notNull() && participant_id.notNull()) +        { +            LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); +        }      }  } | 
