CHUI-486 FIXED Update Preferences -> Chat XUI: implemented new bthavior; deleted spaghetti code
parent
f86be5c85f
commit
c2f630cf08
|
|
@ -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
|
||||
|
||||
if (session_id.isNull())
|
||||
{
|
||||
action = gSavedSettings.getString("NotificationNearbyChatOptions");
|
||||
}
|
||||
else if(session->isP2PSessionType())
|
||||
{
|
||||
if (LLAvatarTracker::instance().isBuddy(participant_id))
|
||||
{
|
||||
action = gSavedSettings.getString("NotificationFriendIMOptions");
|
||||
}
|
||||
else
|
||||
{
|
||||
action = gSavedSettings.getString("NotificationNonFriendIMOptions");
|
||||
}
|
||||
}
|
||||
else if(session->isAdHocSessionType())
|
||||
{
|
||||
action = gSavedSettings.getString("NotificationConferenceIMOptions");
|
||||
}
|
||||
else if(session->isGroupSessionType())
|
||||
{
|
||||
action = gSavedSettings.getString("NotificationGroupChatOptions");
|
||||
}
|
||||
|
||||
// do not show notification which goes from agent
|
||||
if (gAgent.getID() == participant_id)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// execution of the action
|
||||
// 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 (im_box->isFrontmost() && im_box->getSelectedSession() == session_id
|
||||
&& !(session_floater->getHost() ? im_box->isMinimized() : session_floater->isMinimized()))
|
||||
|
||||
if (!LLFloater::isVisible(im_box) || im_box->isMinimized())
|
||||
{
|
||||
return;
|
||||
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;
|
||||
}
|
||||
|
||||
//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)
|
||||
// determine user prefs for this session
|
||||
if (session_id.isNull())
|
||||
{
|
||||
//User is not focused on conversation containing the message
|
||||
if(session_floater_not_focused || conversation_floater_collapsed)
|
||||
user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");
|
||||
}
|
||||
else if(session->isP2PSessionType())
|
||||
{
|
||||
if (LLAvatarTracker::instance().isBuddy(participant_id))
|
||||
{
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
user_preferences = gSavedSettings.getString("NotificationFriendIMOptions");
|
||||
}
|
||||
else
|
||||
{
|
||||
user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions");
|
||||
}
|
||||
}
|
||||
else if(session->isAdHocSessionType())
|
||||
{
|
||||
user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions");
|
||||
}
|
||||
else if(session->isGroupSessionType())
|
||||
{
|
||||
user_preferences = gSavedSettings.getString("NotificationGroupChatOptions");
|
||||
}
|
||||
|
||||
else if ("flash" == action)
|
||||
// actions:
|
||||
|
||||
// 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)
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. open floater and [optional] surface it
|
||||
if ("openconversations" == user_preferences &&
|
||||
(CLOSED == conversations_floater_status
|
||||
|| NOT_ON_TOP == conversations_floater_status))
|
||||
{
|
||||
if(!gAgent.isDoNotDisturb())
|
||||
{
|
||||
// Open conversations floater
|
||||
LLFloaterReg::showInstance("im_container");
|
||||
im_box->collapseMessagesPane(false);
|
||||
if (session_floater)
|
||||
{
|
||||
//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));
|
||||
}
|
||||
}
|
||||
|
||||
else if("openconversations" == action)
|
||||
{
|
||||
//User is not focused on conversation containing the message
|
||||
if(session_floater_not_focused)
|
||||
{
|
||||
//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)
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue