summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rwxr-xr-xindra/newview/llavataractions.cpp22
-rw-r--r--indra/newview/llavataractions.h8
-rw-r--r--indra/newview/llconversationmodel.cpp49
-rwxr-xr-xindra/newview/llconversationmodel.h1
-rw-r--r--indra/newview/llimfloater.cpp30
-rw-r--r--indra/newview/llimfloatercontainer.cpp9
6 files changed, 86 insertions, 33 deletions
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 248685b964..50697d1885 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -714,6 +714,28 @@ void LLAvatarActions::buildResidentsString(const std::vector<LLAvatarName> avata
}
}
+// static
+void LLAvatarActions::buildResidentsString(const uuid_vec_t& avatar_uuids, std::string& residents_string)
+{
+ std::vector<LLAvatarName> avatar_names;
+ uuid_vec_t::const_iterator it = avatar_uuids.begin();
+ for (; it != avatar_uuids.end(); ++it)
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(*it, &av_name))
+ {
+ avatar_names.push_back(av_name);
+ }
+ }
+
+ // We should check whether the vector is not empty to pass the assertion
+ // that avatar_names.size() > 0 in LLAvatarActions::buildResidentsString.
+ if (!avatar_names.empty())
+ {
+ LLAvatarActions::buildResidentsString(avatar_names, residents_string);
+ }
+}
+
//static
std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()
{
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 6e60f624ad..e7cef587c2 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -219,6 +219,14 @@ public:
static void buildResidentsString(const std::vector<LLAvatarName> avatar_names, std::string& residents_string);
/**
+ * Builds a string of residents' display names separated by "words_separator" string.
+ *
+ * @param avatar_uuids - a vector of given avatar uuids from which resulting string is built
+ * @param residents_string - the resulting string
+ */
+ static void buildResidentsString(const uuid_vec_t& avatar_uuids, std::string& residents_string);
+
+ /**
* Opens the chat history for avatar
*/
static void viewChatHistory(const LLUUID& id);
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index b2b768bf9a..15824704fd 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -27,6 +27,8 @@
#include "llviewerprecompiledheaders.h"
+#include "llavatarnamecache.h"
+#include "llavataractions.h"
#include "llevents.h"
#include "llsdutil.h"
#include "llconversationmodel.h"
@@ -140,9 +142,48 @@ void LLConversationItemSession::addParticipant(LLConversationItemParticipant* pa
addChild(participant);
mIsLoaded = true;
mNeedsRefresh = true;
+ updateParticipantName(participant);
postEvent("add_participant", this, participant);
}
+void LLConversationItemSession::updateParticipantName(LLConversationItemParticipant* participant)
+{
+ // We modify the session name only in the case of an ad-hoc session, exit otherwise (nothing to do)
+ if (getType() != CONV_SESSION_AD_HOC)
+ {
+ return;
+ }
+ // Avoid changing the default name if no participant present yet
+ if (mChildren.size() == 0)
+ {
+ return;
+ }
+ // Build a string containing the participants names and check if ready for display (we don't want "(waiting)" in there)
+ // *TODO: Further factor out common code with LLIMFloater::onParticipantsListChanged()
+ bool all_names_resolved = true;
+ uuid_vec_t temp_uuids; // uuids vector for building the added participants' names string
+ child_list_t::iterator iter = mChildren.begin();
+ while (iter != mChildren.end())
+ {
+ LLConversationItemParticipant* current_participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
+ temp_uuids.push_back(current_participant->getUUID());
+ LLAvatarName av_name;
+ if (!LLAvatarNameCache::get(current_participant->getUUID(), &av_name))
+ {
+ all_names_resolved = false;
+ break;
+ }
+ iter++;
+ }
+ if (all_names_resolved)
+ {
+ std::string new_session_name;
+ LLAvatarActions::buildResidentsString(temp_uuids, new_session_name);
+ renameItem(new_session_name);
+ postEvent("update_session", this, NULL);
+ }
+}
+
void LLConversationItemSession::removeParticipant(LLConversationItemParticipant* participant)
{
removeChild(participant);
@@ -340,11 +381,13 @@ void LLConversationItemParticipant::onAvatarNameCache(const LLAvatarName& av_nam
mName = (av_name.mUsername.empty() ? av_name.mDisplayName : av_name.mUsername);
mDisplayName = (av_name.mDisplayName.empty() ? av_name.mUsername : av_name.mDisplayName);
mNeedsRefresh = true;
- if (mParent)
+ LLConversationItemSession* parent_session = dynamic_cast<LLConversationItemSession*>(mParent);
+ if (parent_session)
{
- mParent->requestSort();
+ parent_session->requestSort();
+ parent_session->updateParticipantName(this);
}
- postEvent("update_participant", dynamic_cast<LLConversationItemSession*>(mParent), this);
+ postEvent("update_participant", parent_session, this);
}
void LLConversationItemParticipant::dumpDebugData()
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index d5f7e1a56b..1d082852f5 100755
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -149,6 +149,7 @@ public:
LLPointer<LLUIImage> getIcon() const { return NULL; }
void setSessionID(const LLUUID& session_id) { mUUID = session_id; mNeedsRefresh = true; }
void addParticipant(LLConversationItemParticipant* participant);
+ void updateParticipantName(LLConversationItemParticipant* participant);
void removeParticipant(LLConversationItemParticipant* participant);
void removeParticipant(const LLUUID& participant_id);
void clearParticipants();
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 99337bd5f3..467f48600a 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -60,10 +60,6 @@
#include "llnotificationmanager.h"
#include "llautoreplace.h"
-/// Helper function to resolve resident names from given uuids
-/// and form a string of names separated by "words_separator".
-static void build_names_string(const uuid_vec_t& uuids, std::string& names_string);
-
floater_showed_signal_t LLIMFloater::sIMFloaterShowedSignal;
LLIMFloater::LLIMFloater(const LLUUID& session_id)
@@ -476,7 +472,7 @@ void LLIMFloater::addP2PSessionParticipants(const LLSD& notification, const LLSD
void LLIMFloater::sendParticipantsAddedNotification(const uuid_vec_t& uuids)
{
std::string names_string;
- build_names_string(uuids, names_string);
+ LLAvatarActions::buildResidentsString(uuids, names_string);
LLStringUtil::format_map_t args;
args["[NAME]"] = names_string;
@@ -581,7 +577,7 @@ void LLIMFloater::onParticipantsListChanged(LLUICtrl* ctrl)
if (all_names_resolved)
{
std::string ui_title;
- build_names_string(temp_uuids, ui_title);
+ LLAvatarActions::buildResidentsString(temp_uuids, ui_title);
updateSessionName(ui_title, ui_title);
}
}
@@ -1334,25 +1330,3 @@ boost::signals2::connection LLIMFloater::setIMFloaterShowedCallback(const floate
{
return LLIMFloater::sIMFloaterShowedSignal.connect(cb);
}
-
-// static
-void build_names_string(const uuid_vec_t& uuids, std::string& names_string)
-{
- std::vector<LLAvatarName> avatar_names;
- uuid_vec_t::const_iterator it = uuids.begin();
- for (; it != uuids.end(); ++it)
- {
- LLAvatarName av_name;
- if (LLAvatarNameCache::get(*it, &av_name))
- {
- avatar_names.push_back(av_name);
- }
- }
-
- // We should check whether the vector is not empty to pass the assertion
- // that avatar_names.size() > 0 in LLAvatarActions::buildResidentsString.
- if (!avatar_names.empty())
- {
- LLAvatarActions::buildResidentsString(avatar_names, names_string);
- }
-}
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 4022ebdf5b..7c5aaa7d0f 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -466,7 +466,11 @@ bool LLIMFloaterContainer::onConversationModelEvent(const LLSD& event)
participant_view->refresh();
}
}
-
+ else if (type == "update_session")
+ {
+ session_view->refresh();
+ }
+
mConversationViewModel.requestSortAll();
mConversationsRoot->arrangeAll();
@@ -1111,7 +1115,7 @@ void LLIMFloaterContainer::addConversationListItem(const LLUUID& uuid)
removeConversationListItem(uuid,false);
// Create a conversation session model
- LLConversationItem* item = NULL;
+ LLConversationItemSession* item = NULL;
LLSpeakerMgr* speaker_manager = (is_nearby_chat ? (LLSpeakerMgr*)(LLLocalSpeakerMgr::getInstance()) : LLIMModel::getInstance()->getSpeakerManager(uuid));
if (speaker_manager)
{
@@ -1123,6 +1127,7 @@ void LLIMFloaterContainer::addConversationListItem(const LLUUID& uuid)
return;
}
item->renameItem(display_name);
+ item->updateParticipantName(NULL);
mConversationsItems[uuid] = item;