Skip to content
Snippets Groups Projects
Commit c2f630cf authored by AlexanderP ProductEngine's avatar AlexanderP ProductEngine
Browse files

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

parent f86be5c8
No related branches found
No related tags found
No related merge requests found
...@@ -160,163 +160,150 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id, ...@@ -160,163 +160,150 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id,
void on_new_message(const LLSD& msg) void on_new_message(const LLSD& msg)
{ {
std::string action; std::string user_preferences;
LLUUID participant_id = msg["from_id"].asUUID(); LLUUID participant_id = msg["from_id"].asUUID();
LLUUID session_id = msg["session_id"].asUUID(); LLUUID session_id = msg["session_id"].asUUID();
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id); 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()) if (session_id.isNull())
{ {
action = gSavedSettings.getString("NotificationNearbyChatOptions"); user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions");
} }
else if(session->isP2PSessionType()) else if(session->isP2PSessionType())
{ {
if (LLAvatarTracker::instance().isBuddy(participant_id)) if (LLAvatarTracker::instance().isBuddy(participant_id))
{ {
action = gSavedSettings.getString("NotificationFriendIMOptions"); user_preferences = gSavedSettings.getString("NotificationFriendIMOptions");
} }
else else
{ {
action = gSavedSettings.getString("NotificationNonFriendIMOptions"); user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions");
} }
} }
else if(session->isAdHocSessionType()) else if(session->isAdHocSessionType())
{ {
action = gSavedSettings.getString("NotificationConferenceIMOptions"); user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions");
} }
else if(session->isGroupSessionType()) else if(session->isGroupSessionType())
{ {
action = gSavedSettings.getString("NotificationGroupChatOptions"); user_preferences = gSavedSettings.getString("NotificationGroupChatOptions");
} }
// do not show notification which goes from agent // actions:
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));
}
}
}
}
else if ("flash" == action) // 0. nothing - exit
if ("none" == user_preferences ||
ON_TOP_AND_ITEM_IS_SELECTED == conversations_floater_status)
{ {
if (!gAgent.isDoNotDisturb()) return;
{
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));
}
} }
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(!gAgent.isDoNotDisturb())
if(session_floater_not_focused)
{ {
//Flash line item // Open conversations floater
im_box->flashConversationItemWidget(session_id, true); LLFloaterReg::showInstance("im_container");
im_box->collapseMessagesPane(false);
if(!gAgent.isDoNotDisturb()) if (session_floater)
{ {
//Surface conversations floater if (session_floater->getHost())
LLFloaterReg::showInstance("im_container");
im_box->collapseMessagesPane(false);
if (session_floater)
{ {
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 //useMostItrusiveIMNotification will be called to notify user a message exists
if(session_id.notNull() if(session_id.notNull()
&& participant_id.notNull() && participant_id.notNull()
&& gAgent.isDoNotDisturb() && !session_floater->isShown())
&& !session_floater_is_open)
{ {
LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); 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));
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment