From 2094847b1f0b6abff25112f7161752819a8ff5d1 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 22 Dec 2009 16:09:31 +0200
Subject: [PATCH] Work on normal bug EXT-3434 	There is no difference between
 invited and left participants in a Group call (Voice Controls) -- commented
 out updating participants voice states from draw() -- improved removing of
 HAS LEFT participant (now it is removed via LLAvatarList approach instead of
 LLFlatListView)

--HG--
branch : product-engine
---
 indra/newview/llcallfloater.cpp | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 33253c2781e..98ee0856876 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -174,7 +174,11 @@ void LLCallFloater::draw()
 	// It should be done only when she joins or leaves voice chat.
 	// But seems that LLVoiceClientParticipantObserver is not enough to satisfy this requirement.
 	// *TODO: mantipov: remove from draw()
-	onChange();
+
+	// NOTE: it looks like calling onChange() here is not necessary,
+	// but sometime it is not called properly from the observable object.
+	// Seems this is a problem somewhere in Voice Client (LLVoiceClient::participantAddedEvent)
+//	onChange();
 
 	bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID);
 
@@ -641,7 +645,13 @@ void LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
 		mVoiceLeftTimersMap.erase(mVoiceLeftTimersMap.find(voice_speaker_id));
 	}
 
-	mAvatarList->removeItemByUUID(voice_speaker_id);
+	LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs();
+	LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
+	if(pos != speaker_uuids.end())
+	{
+		speaker_uuids.erase(pos);
+		mAvatarList->setDirty();
+	}
 }
 
 
-- 
GitLab