summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llconversationmodel.cpp84
-rw-r--r--indra/newview/llconversationmodel.h37
-rw-r--r--indra/newview/llparticipantlist.cpp312
3 files changed, 301 insertions, 132 deletions
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();