diff options
| -rwxr-xr-x | indra/newview/llavataractions.cpp | 22 | ||||
| -rw-r--r-- | indra/newview/llavataractions.h | 8 | ||||
| -rw-r--r-- | indra/newview/llconversationmodel.cpp | 49 | ||||
| -rwxr-xr-x | indra/newview/llconversationmodel.h | 1 | ||||
| -rw-r--r-- | indra/newview/llimfloater.cpp | 30 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.cpp | 9 | 
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; | 
