summaryrefslogtreecommitdiff
path: root/indra/newview/llparticipantlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llparticipantlist.cpp')
-rw-r--r--indra/newview/llparticipantlist.cpp124
1 files changed, 111 insertions, 13 deletions
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 4ee9cba69c..48a7a32a3b 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -47,10 +47,11 @@
#if LL_MSVC
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
-LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
+LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/):
mSpeakerMgr(data_source),
mAvatarList(avatar_list),
mSortOrder(E_SORT_BY_NAME)
+, mParticipantListMenu(NULL)
{
mSpeakerAddListener = new SpeakerAddListener(*this);
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
@@ -63,13 +64,20 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
- mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
- mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
+ mAvatarListDoubleClickConnection = mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
+ mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
// Set onAvatarListDoubleClicked as default on_return action.
- mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
+ mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
- mParticipantListMenu = new LLParticipantListMenu(*this);
- mAvatarList->setContextMenu(mParticipantListMenu);
+ if (use_context_menu)
+ {
+ mParticipantListMenu = new LLParticipantListMenu(*this);
+ mAvatarList->setContextMenu(mParticipantListMenu);
+ }
+ else
+ {
+ mAvatarList->setContextMenu(NULL);
+ }
//Lets fill avatarList with existing speakers
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
@@ -79,17 +87,22 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
{
const LLPointer<LLSpeaker>& speakerp = *it;
- group_members.push_back(speakerp->mID);
+ addAvatarIDExceptAgent(group_members, speakerp->mID);
if ( speakerp->mIsModerator )
{
mModeratorList.insert(speakerp->mID);
}
}
+ mAvatarList->setDirty(true);
sort();
}
LLParticipantList::~LLParticipantList()
{
+ mAvatarListDoubleClickConnection.disconnect();
+ mAvatarListRefreshConnection.disconnect();
+ mAvatarListReturnConnection.disconnect();
+
delete mParticipantListMenu;
mParticipantListMenu = NULL;
}
@@ -183,7 +196,7 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co
return true;
}
- group_members.push_back(uu_id);
+ addAvatarIDExceptAgent(group_members, uu_id);
// Mark AvatarList as dirty one
mAvatarList->setDirty();
sort();
@@ -251,11 +264,30 @@ void LLParticipantList::sort()
}
}
+// static
+void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id)
+{
+ if (gAgent.getID() != avatar_id)
+ {
+ existing_list.push_back(avatar_id);
+ }
+}
+
//
// LLParticipantList::SpeakerAddListener
//
bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
+ /**
+ * We need to filter speaking objects. These objects shouldn't appear in the list
+ * @c LLFloaterChat::addChat() in llviewermessage.cpp to get detailed call hierarchy
+ */
+ const LLUUID& speaker_id = event->getValue().asUUID();
+ LLPointer<LLSpeaker> speaker = mParent.mSpeakerMgr->findSpeaker(speaker_id);
+ if(speaker.isNull() || speaker->mType == LLSpeaker::SPEAKER_OBJECT)
+ {
+ return false;
+ }
return mParent.onAddItemEvent(event, userdata);
}
@@ -292,6 +324,8 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2));
registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2));
+ registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2));
+
enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2));
enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2));
@@ -300,6 +334,28 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
"menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
}
+void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
+{
+ LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y);
+
+ if (uuids.size() == 0) return;
+
+ const LLUUID speaker_id = mUUIDs.front();
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagVoiceChat);
+
+ if (is_muted)
+ {
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false);
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false);
+ }
+ else
+ {
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
+ }
+
+}
+
void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
{
const LLUUID speaker_id = mUUIDs.front();
@@ -357,10 +413,10 @@ void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& u
new MuteTextResponder(mParent.mSpeakerMgr->getSessionID()));
}
-void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags)
{
const LLUUID speaker_id = mUUIDs.front();
- BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagTextChat);
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, flags);
std::string name;
//fill in name using voice client's copy of name cache
@@ -376,14 +432,56 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userda
if (!is_muted)
{
- LLMuteList::getInstance()->add(mute, LLMute::flagTextChat);
+ LLMuteList::getInstance()->add(mute, flags);
}
else
{
- LLMuteList::getInstance()->remove(mute, LLMute::flagTextChat);
+ LLMuteList::getInstance()->remove(mute, flags);
}
}
+void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+{
+ toggleMute(userdata, LLMute::flagTextChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userdata)
+{
+ toggleMute(userdata, LLMute::flagVoiceChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
+{
+
+}
+void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLSD& userdata)
+{
+ LLSpeakerMgr::speaker_list_t speakers;
+ mParent.mSpeakerMgr->getSpeakerList(&speakers, true);
+
+ const LLUUID& excluded_avatar_id = mUUIDs.front();
+ bool should_mute = userdata.asString() == "mute";
+ for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
+ iter != speakers.end(); ++iter)
+ {
+ LLSpeaker* speakerp = (*iter).get();
+ LLUUID speaker_id = speakerp->mID;
+ if (excluded_avatar_id == speaker_id) continue;
+
+ LLMute mute(speaker_id, speakerp->mDisplayName, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+
+ if (should_mute)
+ {
+ LLMuteList::getInstance()->add(mute, LLMute::flagVoiceChat);
+ }
+ else
+ {
+ LLMuteList::getInstance()->remove(mute, LLMute::flagVoiceChat);
+ }
+ }
+
+}
+
bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
{
std::string item = userdata.asString();
@@ -392,7 +490,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
return mUUIDs.front() != gAgentID;
}
else
- if (item == "can_allow_text_chat")
+ if (item == "can_allow_text_chat" || "can_moderate_voice" == item)
{
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID());
return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;