diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llfolderviewmodel.h | 9 | ||||
| -rw-r--r-- | indra/newview/llconversationmodel.cpp | 84 | ||||
| -rw-r--r-- | indra/newview/llconversationmodel.h | 37 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.cpp | 312 | 
4 files changed, 310 insertions, 132 deletions
| diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 41660c6e1e..16d9c86fd7 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -262,6 +262,15 @@ public:  		child->setParent(NULL);   		dirtyFilter();  	} +	 +	virtual void clearChildren() +	{ +		// As this is cleaning the whole list of children wholesale, we do need to delete the pointed objects +		// This is different and not equivalent to calling removeChild() on each child +		std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); +		mChildren.clear(); +		dirtyFilter(); +	}  	void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0)  	{ diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index a5c0244bd4..d7f9093a4a 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -88,7 +88,8 @@ bool LLConversationSort::operator()(const LLConversationItem* const& a, const LL  //   LLConversationItemSession::LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) : -	LLConversationItem(display_name,uuid,root_view_model) +	LLConversationItem(display_name,uuid,root_view_model), +	mIsLoaded(false)  {  } @@ -97,12 +98,87 @@ LLConversationItemSession::LLConversationItemSession(const LLUUID& uuid, LLFolde  {  } +void LLConversationItemSession::addParticipant(LLConversationItemParticipant* participant) +{ +	addChild(participant); +	mIsLoaded = true; +} + +void LLConversationItemSession::removeParticipant(LLConversationItemParticipant* participant) +{ +	removeChild(participant); +} + +void LLConversationItemSession::removeParticipant(const LLUUID& participant_id) +{ +	LLConversationItemParticipant* participant = findParticipant(participant_id); +	if (participant) +	{ +		removeParticipant(participant); +	} +} + +void LLConversationItemSession::clearParticipants() +{ +	clearChildren(); +	mIsLoaded = false; +} + +LLConversationItemParticipant* LLConversationItemSession::findParticipant(const LLUUID& participant_id) +{ +	// This is *not* a general tree parsing algorithm. It assumes that a session contains only  +	// items (LLConversationItemParticipant) that have themselve no children. +	LLConversationItemParticipant* participant = NULL; +	child_list_t::iterator iter; +	for (iter = mChildren.begin(); iter != mChildren.end(); iter++) +	{ +		participant = dynamic_cast<LLConversationItemParticipant*>(*iter); +		if (participant->hasSameValue(participant_id)) +		{ +			break; +		} +	} +	return (iter == mChildren.end() ? NULL : participant); +} + +void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_id, bool is_muted) +{ +	LLConversationItemParticipant* participant = findParticipant(participant_id); +	if (participant) +	{ +		participant->setIsMuted(is_muted); +	} +} + +void LLConversationItemSession::setParticipantIsModerator(const LLUUID& participant_id, bool is_moderator) +{ +	LLConversationItemParticipant* participant = findParticipant(participant_id); +	if (participant) +	{ +		participant->setIsModerator(is_moderator); +	} +} + +void LLConversationItemSession::dumpDebugData() +{ +	llinfos << "Merov debug : session, uuid = " << mUUID << ", name = " << mName << ", is loaded = " << mIsLoaded << llendl; +	LLConversationItemParticipant* participant = NULL; +	child_list_t::iterator iter; +	for (iter = mChildren.begin(); iter != mChildren.end(); iter++) +	{ +		participant = dynamic_cast<LLConversationItemParticipant*>(*iter); +		participant->dumpDebugData(); +	} +} +  //  // LLConversationItemParticipant  //   LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) : -	LLConversationItem(display_name,uuid,root_view_model) +	LLConversationItem(display_name,uuid,root_view_model), +	mIsMuted(false), +	mIsModerator(false)  {  } @@ -111,4 +187,8 @@ LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid,  {  } +void LLConversationItemParticipant::dumpDebugData() +{ +	llinfos << "Merov debug : participant, uuid = " << mUUID << ", name = " << mName << ", muted = " << mIsMuted << ", moderator = " << mIsModerator << llendl; +}	  // EOF diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 1a63230e41..af3756c45d 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -33,6 +33,8 @@  // Implementation of conversations list  class LLConversationItem; +class LLConversationItemSession; +class LLConversationItemParticipant;  typedef std::map<LLUUID, LLConversationItem*> conversations_items_map;  typedef std::map<LLUUID, LLFolderViewItem*> conversations_widgets_map; @@ -100,9 +102,10 @@ public:  //	bool hasSameValues(std::string name, const LLUUID& uuid) { return ((name == mName) && (uuid == mUUID)); }  	bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); } -private: -	std::string mName; -	const LLUUID mUUID; + +protected: +	std::string mName;	// Name of the session or the participant +	LLUUID mUUID;		// UUID of the session or the participant  };  class LLConversationItemSession : public LLConversationItem @@ -111,6 +114,23 @@ public:  	LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);  	LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);  	virtual ~LLConversationItemSession() {} +	 +	void setSessionID(const LLUUID& session_id) { mUUID = session_id; } +	void addParticipant(LLConversationItemParticipant* participant); +	void removeParticipant(LLConversationItemParticipant* participant); +	void removeParticipant(const LLUUID& participant_id); +	void clearParticipants(); +	LLConversationItemParticipant* findParticipant(const LLUUID& participant_id); + +	void setParticipantIsMuted(const LLUUID& participant_id, bool is_muted); +	void setParticipantIsModerator(const LLUUID& participant_id, bool is_moderator); +	 +	bool isLoaded() { return mIsLoaded; } +	 +	void dumpDebugData(); + +private: +	bool mIsLoaded;		// true if at least one participant has been added to the session, false otherwise  };  class LLConversationItemParticipant : public LLConversationItem @@ -119,6 +139,17 @@ public:  	LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);  	LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);  	virtual ~LLConversationItemParticipant() {} +	 +	bool isMuted() { return mIsMuted; } +	bool isModerator() {return mIsModerator; } +	void setIsMuted(bool is_muted) { mIsMuted = is_muted; } +	void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; } +	 +	void dumpDebugData(); + +private: +	bool mIsMuted;		// default is false +	bool mIsModerator;	// default is false  };  // We don't want to ever filter conversations but we need to declare that class to create a conversation view model. diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 552ae196dd..35c1a34a26 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -29,6 +29,8 @@  // common includes  #include "lltrans.h"  #include "llavataractions.h" +#include "llavatarnamecache.h" +#include "llavatarname.h"  #include "llagent.h"  #include "llimview.h" @@ -50,11 +52,14 @@ static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;  // helper function to update AvatarList Item's indicator in the voice participant list  static void update_speaker_indicator(const LLAvatarList* const avatar_list, const LLUUID& avatar_uuid, bool is_muted)  { -	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid)); -	if (item) +	if (avatar_list)  	{ -		LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); -		indicator->setIsMuted(is_muted); +		LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid)); +		if (item) +		{ +			LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); +			indicator->setIsMuted(is_muted); +		}  	}  } @@ -226,29 +231,34 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,  	mSpeakerMgr->addListener(mSpeakerClearListener, "clear");  	mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator"); -	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); -	LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL; -	mAvatarList->setSessionID(mSpeakerMgr->getSessionID()); -	mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1)); -	mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); -    // Set onAvatarListDoubleClicked as default on_return action. -	mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); - -	if (use_context_menu) -	{ -		//mParticipantListMenu = new LLParticipantListMenu(*this); -		//mAvatarList->setContextMenu(mParticipantListMenu); -		mAvatarList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); -	} -	else +	setSessionID(mSpeakerMgr->getSessionID()); +	 +	if (mAvatarList)  	{ -		mAvatarList->setContextMenu(NULL); -	} +		mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); +		LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL; +		mAvatarList->setSessionID(mSpeakerMgr->getSessionID()); +		mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1)); +		mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); +		// Set onAvatarListDoubleClicked as default on_return action. +		mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); + +		if (use_context_menu) +		{ +			//mParticipantListMenu = new LLParticipantListMenu(*this); +			//mAvatarList->setContextMenu(mParticipantListMenu); +			mAvatarList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); +		} +		else +		{ +			mAvatarList->setContextMenu(NULL); +		} -	if (use_context_menu && can_toggle_icons) -	{ -		mAvatarList->setShowIcons("ParticipantListShowIcons"); -		mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList)); +		if (use_context_menu && can_toggle_icons) +		{ +			mAvatarList->setShowIcons("ParticipantListShowIcons"); +			mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList)); +		}  	}  	//Lets fill avatarList with existing speakers @@ -274,10 +284,13 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,  LLParticipantList::~LLParticipantList()  { -	mAvatarListDoubleClickConnection.disconnect(); -	mAvatarListRefreshConnection.disconnect(); -	mAvatarListReturnConnection.disconnect(); -	mAvatarListToggleIconsConnection.disconnect(); +	if (mAvatarList) +	{ +		mAvatarListDoubleClickConnection.disconnect(); +		mAvatarListRefreshConnection.disconnect(); +		mAvatarListReturnConnection.disconnect(); +		mAvatarListToggleIconsConnection.disconnect(); +	}  	// It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged()  	// See ticket EXT-3427 @@ -293,16 +306,22 @@ LLParticipantList::~LLParticipantList()  		mParticipantListMenu = NULL;  	} -	mAvatarList->setContextMenu(NULL); -	mAvatarList->setComparator(NULL); +	if (mAvatarList) +	{ +		mAvatarList->setContextMenu(NULL); +		mAvatarList->setComparator(NULL); +	}  	delete mAvalineUpdater;  }  void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)  { -	mAvatarList->setSpeakingIndicatorsVisible(visible); -}; +	if (mAvatarList) +	{ +		mAvatarList->setSpeakingIndicatorsVisible(visible); +	} +}  void LLParticipantList::onAvatarListDoubleClicked(LLUICtrl* ctrl)  { @@ -323,81 +342,81 @@ void LLParticipantList::onAvatarListDoubleClicked(LLUICtrl* ctrl)  void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  {  	LLAvatarList* list = dynamic_cast<LLAvatarList*>(ctrl); -	if (list) +	const std::string moderator_indicator(LLTrans::getString("IM_moderator_label"));  +	const std::size_t moderator_indicator_len = moderator_indicator.length(); + +	// Firstly remove moderators indicator +	std::set<LLUUID>::const_iterator +		moderator_list_it = mModeratorToRemoveList.begin(), +		moderator_list_end = mModeratorToRemoveList.end(); +	for (;moderator_list_it != moderator_list_end; ++moderator_list_it)  	{ -		const std::string moderator_indicator(LLTrans::getString("IM_moderator_label"));  -		const std::size_t moderator_indicator_len = moderator_indicator.length(); - -		// Firstly remove moderators indicator -		std::set<LLUUID>::const_iterator -			moderator_list_it = mModeratorToRemoveList.begin(), -			moderator_list_end = mModeratorToRemoveList.end(); -		for (;moderator_list_it != moderator_list_end; ++moderator_list_it) +		LLAvatarListItem* item = (list ? dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)) : NULL); +		if ( item )  		{ -			LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)); -			if ( item ) +			std::string name = item->getAvatarName(); +			std::string tooltip = item->getAvatarToolTip(); +			size_t found = name.find(moderator_indicator); +			if (found != std::string::npos)  			{ -				std::string name = item->getAvatarName(); -				std::string tooltip = item->getAvatarToolTip(); -				size_t found = name.find(moderator_indicator); -				if (found != std::string::npos) -				{ -					name.erase(found, moderator_indicator_len); -					item->setAvatarName(name); -				} -				found = tooltip.find(moderator_indicator); -				if (found != tooltip.npos) -				{ -					tooltip.erase(found, moderator_indicator_len); -					item->setAvatarToolTip(tooltip); -				} +				name.erase(found, moderator_indicator_len); +				item->setAvatarName(name); +			} +			found = tooltip.find(moderator_indicator); +			if (found != tooltip.npos) +			{ +				tooltip.erase(found, moderator_indicator_len); +				item->setAvatarToolTip(tooltip);  			}  		} +		setParticipantIsModerator(*moderator_list_it,false); +	} -		mModeratorToRemoveList.clear(); +	mModeratorToRemoveList.clear(); -		// Add moderators indicator -		moderator_list_it = mModeratorList.begin(); -		moderator_list_end = mModeratorList.end(); -		for (;moderator_list_it != moderator_list_end; ++moderator_list_it) +	// Add moderators indicator +	moderator_list_it = mModeratorList.begin(); +	moderator_list_end = mModeratorList.end(); +	for (;moderator_list_it != moderator_list_end; ++moderator_list_it) +	{ +		LLAvatarListItem* item = (list ? dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)) : NULL); +		if ( item )  		{ -			LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)); -			if ( item ) +			std::string name = item->getAvatarName(); +			std::string tooltip = item->getAvatarToolTip(); +			size_t found = name.find(moderator_indicator); +			if (found == std::string::npos)  			{ -				std::string name = item->getAvatarName(); -				std::string tooltip = item->getAvatarToolTip(); -				size_t found = name.find(moderator_indicator); -				if (found == std::string::npos) -				{ -					name += " "; -					name += moderator_indicator; -					item->setAvatarName(name); -				} -				found = tooltip.find(moderator_indicator); -				if (found == std::string::npos) -				{ -					tooltip += " "; -					tooltip += moderator_indicator; -					item->setAvatarToolTip(tooltip); -				} +				name += " "; +				name += moderator_indicator; +				item->setAvatarName(name); +			} +			found = tooltip.find(moderator_indicator); +			if (found == std::string::npos) +			{ +				tooltip += " "; +				tooltip += moderator_indicator; +				item->setAvatarToolTip(tooltip);  			}  		} +		setParticipantIsModerator(*moderator_list_it,true); +	} -		// update voice mute state of all items. See EXT-7235 -		LLSpeakerMgr::speaker_list_t speaker_list; +	// update voice mute state of all items. See EXT-7235 +	LLSpeakerMgr::speaker_list_t speaker_list; -		// Use also participants which are not in voice session now (the second arg is TRUE). -		// They can already have mModeratorMutedVoice set from the previous voice session -		// and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time. -		mSpeakerMgr->getSpeakerList(&speaker_list, TRUE); -		for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) -		{ -			const LLPointer<LLSpeaker>& speakerp = *it; +	// Use also participants which are not in voice session now (the second arg is TRUE). +	// They can already have mModeratorMutedVoice set from the previous voice session +	// and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time. +	mSpeakerMgr->getSpeakerList(&speaker_list, TRUE); +	for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) +	{ +		const LLPointer<LLSpeaker>& speakerp = *it; -			if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) -			{ -				update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); -			} +		if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) +		{ +			setParticipantIsMuted(speakerp->mID, speakerp->mModeratorMutedVoice); +			update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice);  		}  	}  } @@ -415,30 +434,39 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  */  void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)  { -	LLPanel* item = mAvatarList->getItemByValue(participant_id); - -	if (NULL == item) +	if (mAvatarList)  	{ -		LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL; -		return; -	} +		LLPanel* item = mAvatarList->getItemByValue(participant_id); -	if (typeid(*item) == typeid(LLAvalineListItem)) -	{ -		LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL; -		// item representing an Avaline caller has a correct type already. -		return; -	} +		if (NULL == item) +		{ +			LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL; +			return; +		} + +		if (typeid(*item) == typeid(LLAvalineListItem)) +		{ +			LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL; +			// item representing an Avaline caller has a correct type already. +			return; +		} -	LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL; +		LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL; -	// remove UUID from LLAvatarList::mIDs to be able add it again. -	uuid_vec_t& ids = mAvatarList->getIDs(); -	uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id); -	ids.erase(pos); +		// remove UUID from LLAvatarList::mIDs to be able add it again. +		uuid_vec_t& ids = mAvatarList->getIDs(); +		uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id); +		ids.erase(pos); -	// remove item directly -	mAvatarList->removeItem(item); +		// remove item directly +		mAvatarList->removeItem(item); +	} +	 +	LLConversationItemParticipant* participant = findParticipant(participant_id); +	if (participant) +	{ +		removeParticipant(participant); +	}  	// re-add avaline caller with a correct class instance.  	addAvatarIDExceptAgent(participant_id); @@ -489,7 +517,7 @@ bool LLParticipantList::isHovered()  {  	S32 x, y;  	LLUI::getMousePositionScreen(&x, &y); -	return mAvatarList->calcScreenRect().pointInRect(x, y); +	return (mAvatarList ? mAvatarList->calcScreenRect().pointInRect(x, y) : false);  }  bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) @@ -508,21 +536,30 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co  bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  { -	uuid_vec_t& group_members = mAvatarList->getIDs(); -	uuid_vec_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); -	if(pos != group_members.end()) +	LLUUID avatar_id = event->getValue().asUUID(); +	if (mAvatarList)  	{ -		group_members.erase(pos); -		mAvatarList->setDirty(); +		uuid_vec_t& group_members = mAvatarList->getIDs(); +		uuid_vec_t::iterator pos = std::find(group_members.begin(), group_members.end(), avatar_id); +		if(pos != group_members.end()) +		{ +			group_members.erase(pos); +			mAvatarList->setDirty(); +		}  	} +	removeParticipant(avatar_id);  	return true;  }  bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  { -	uuid_vec_t& group_members = mAvatarList->getIDs(); -	group_members.clear(); -	mAvatarList->setDirty(); +	if (mAvatarList) +	{ +		uuid_vec_t& group_members = mAvatarList->getIDs(); +		group_members.clear(); +		mAvatarList->setDirty(); +	} +	clearParticipants();  	return true;  } @@ -562,6 +599,7 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event  	// update UI on confirmation of moderator mutes  	if (event->getValue().asString() == "voice")  	{ +		setParticipantIsMuted(speakerp->mID, speakerp->mModeratorMutedVoice);  		update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice);  	}  	return true; @@ -569,6 +607,7 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event  void LLParticipantList::sort()  { +	// *TODO : Merov : Need to plan for sort() for LLConversationModel  	if ( !mAvatarList )  		return; @@ -601,21 +640,40 @@ void LLParticipantList::sort()  void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)  {  	if (mExcludeAgent && gAgent.getID() == avatar_id) return; -	if (mAvatarList->contains(avatar_id)) return; +	if (mAvatarList && mAvatarList->contains(avatar_id)) return;  	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id); +	LLConversationItemParticipant* participant = NULL; +	  	if (is_avatar)  	{ -		mAvatarList->getIDs().push_back(avatar_id); -		mAvatarList->setDirty(); +		// Create a participant view model instance and add it to the linked list +		LLAvatarName avatar_name; +		bool has_name = LLAvatarNameCache::get(avatar_id, &avatar_name); +		participant = new LLConversationItemParticipant(!has_name ? "Avatar" : avatar_name.mDisplayName , avatar_id, mRootViewModel); +		if (mAvatarList) +		{ +			mAvatarList->getIDs().push_back(avatar_id); +			mAvatarList->setDirty(); +		}  	}  	else  	{  		std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id); -		mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name); +		// Create a participant view model instance and add it to the linked list +		participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel); +		if (mAvatarList) +		{ +			mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name); +		}  		mAvalineUpdater->watchAvalineCaller(avatar_id);  	} + +	// *TODO : Merov : need to declare and bind a name update callback on that "participant" instance. See LLAvatarListItem::updateAvatarName() for pattern. +	// For the moment, we'll get the correct name only if it's already in the name cache (see call to LLAvatarNameCache::get() here above) +	addParticipant(participant); +  	adjustParticipant(avatar_id);  } @@ -771,7 +829,7 @@ void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata,  		LL_WARNS("Speakers") << "Speaker " << speaker_id << " not found" << llendl;  		return;  	} -	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id)); +	LLAvatarListItem* item = (mParent.mAvatarList ? dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id)) : NULL);  	if (NULL == item) return;  	name = item->getAvatarName(); | 
