CHUI-486 FIXED Update Preferences -> Chat XUI: implemented new bthavior; deleted spaghetti code

meow-7.2.2
AlexanderP ProductEngine 2013-03-22 16:06:41 +02:00
parent f86be5c85f
commit c2f630cf08
1 changed files with 112 additions and 125 deletions

View File

@ -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));
}
}
}