summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llui/llscrolllistctrl.cpp27
-rw-r--r--indra/llui/llscrolllistctrl.h3
-rw-r--r--indra/newview/llimview.cpp221
3 files changed, 133 insertions, 118 deletions
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 8b9fb47d5c..7f04c92b27 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -1801,6 +1801,9 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
// (N.B. callbacks don't take const refs as id is local scope)
bool is_group = (mContextMenuType == MENU_GROUP);
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("Url.ShowProfile", boost::bind(&LLScrollListCtrl::showProfile, id, is_group));
+ registrar.add("Url.SendIM", boost::bind(&LLScrollListCtrl::sendIM, id));
+ registrar.add("Url.AddFriend", boost::bind(&LLScrollListCtrl::addFriend, id));
registrar.add("Url.Execute", boost::bind(&LLScrollListCtrl::showNameDetails, id, is_group));
registrar.add("Url.CopyLabel", boost::bind(&LLScrollListCtrl::copyNameToClipboard, id, is_group));
registrar.add("Url.CopyUrl", boost::bind(&LLScrollListCtrl::copySLURLToClipboard, id, is_group));
@@ -1821,11 +1824,33 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
return FALSE;
}
-void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)
+void LLScrollListCtrl::showProfile(std::string id, bool is_group)
{
// show the resident's profile or the group profile
std::string sltype = is_group ? "group" : "agent";
std::string slurl = "secondlife:///app/" + sltype + "/" + id + "/about";
+ LLUrlAction::showProfile(slurl);
+}
+
+void LLScrollListCtrl::sendIM(std::string id)
+{
+ // send im to the resident
+ std::string slurl = "secondlife:///app/agent/" + id + "/about";
+ LLUrlAction::sendIM(slurl);
+}
+
+void LLScrollListCtrl::addFriend(std::string id)
+{
+ // add resident to friends list
+ std::string slurl = "secondlife:///app/agent/" + id + "/about";
+ LLUrlAction::addFriend(slurl);
+}
+
+void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)
+{
+ // open the resident's details or the group details
+ std::string sltype = is_group ? "group" : "agent";
+ std::string slurl = "secondlife:///app/" + sltype + "/" + id + "/about";
LLUrlAction::clickAction(slurl);
}
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 38450b6313..8fa06cc499 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -430,6 +430,9 @@ private:
BOOL setSort(S32 column, BOOL ascending);
S32 getLinesPerPage();
+ static void showProfile(std::string id, bool is_group);
+ static void sendIM(std::string id);
+ static void addFriend(std::string id);
static void showNameDetails(std::string id, bool is_group);
static void copyNameToClipboard(std::string id, bool is_group);
static void copySLURLToClipboard(std::string id, bool is_group);
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));
+ }
}
}