summaryrefslogtreecommitdiff
path: root/indra/newview/llcallfloater.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llcallfloater.h')
-rw-r--r--indra/newview/llcallfloater.h136
1 files changed, 133 insertions, 3 deletions
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index f9c9149085..3df9e333c5 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -38,6 +38,7 @@
#include "llvoiceclient.h"
class LLAvatarList;
+class LLAvatarListItem;
class LLNonAvatarCaller;
class LLOutputMonitorCtrl;
class LLParticipantList;
@@ -56,6 +57,9 @@ class LLSpeakerMgr;
class LLCallFloater : public LLDockableFloater, LLVoiceClientParticipantObserver
{
public:
+
+ LOG_CLASS(LLCallFloater);
+
LLCallFloater(const LLSD& key);
~LLCallFloater();
@@ -81,6 +85,16 @@ private:
VC_PEER_TO_PEER
}EVoiceControls;
+ typedef enum e_speaker_state
+ {
+ STATE_UNKNOWN,
+ STATE_INVITED,
+ STATE_JOINED,
+ STATE_LEFT,
+ } ESpeakerState;
+
+ typedef std::map<LLUUID, ESpeakerState> speaker_state_map_t;
+
void leaveCall();
/**
@@ -94,24 +108,140 @@ private:
/**
* Refreshes participant list according to current Voice Channel
*/
- void refreshPartisipantList();
+ void refreshParticipantList();
+ /**
+ * Handles event on avatar list is refreshed after it was marked dirty.
+ *
+ * It sets initial participants voice states (once after the first refreshing)
+ * and updates voice states each time anybody is joined/left voice chat in session.
+ */
+ void onAvatarListRefreshed();
void updateTitle();
void initAgentData();
void setModeratorMutedVoice(bool moderator_muted);
- void updateModeratorState();
+ void updateAgentModeratorState();
+
+ /**
+ * Sets initial participants voice states in avatar list (Invited, Joined, Has Left).
+ *
+ * @see refreshParticipantList()
+ * @see onAvatarListRefreshed()
+ * @see mInitParticipantsVoiceState
+ */
+ void initParticipantsVoiceState();
+
+ /**
+ * Updates participants voice states in avatar list (Invited, Joined, Has Left).
+ *
+ * @see onAvatarListRefreshed()
+ * @see onChanged()
+ */
+ void updateParticipantsVoiceState();
+
+ void setState(LLAvatarListItem* item, ESpeakerState state);
+ void setState(const LLUUID& speaker_id, ESpeakerState state)
+ {
+ lldebugs << "Storing state: " << speaker_id << ", " << state << llendl;
+ mSpeakerStateMap[speaker_id] = state;
+ }
+
+ ESpeakerState getState(const LLUUID& speaker_id)
+ {
+ lldebugs << "Getting state: " << speaker_id << ", " << mSpeakerStateMap[speaker_id] << llendl;
+
+ return mSpeakerStateMap[speaker_id];
+ }
+
+ /**
+ * Instantiates new LLAvatarListItemRemoveTimer and adds it into the map if it is not already created.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list when timer expires.
+ */
+ void setVoiceRemoveTimer(const LLUUID& voice_speaker_id);
+
+ /**
+ * Removes specified by UUID Avatar List item.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list.
+ */
+ void removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
+
+ /**
+ * Deletes all timers from the list to prevent started timers from ticking after destruction
+ * and after switching on another voice channel.
+ */
+ void resetVoiceRemoveTimers();
+
+ /**
+ * Removes specified by UUID timer from the map.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item whose timer should be removed from the map.
+ */
+ void removeVoiceRemoveTimer(const LLUUID& voice_speaker_id);
+
+ /**
+ * Called by LLParticipantList before adding a speaker to the participant list.
+ *
+ * If false is returned, the speaker will not be added to the list.
+ *
+ * @param speaker_id Speaker to validate.
+ * @return true if this is a valid speaker, false otherwise.
+ */
+ bool validateSpeaker(const LLUUID& speaker_id);
private:
+ speaker_state_map_t mSpeakerStateMap;
LLSpeakerMgr* mSpeakerManager;
- LLParticipantList* mPaticipants;
+ LLParticipantList* mParticipants;
LLAvatarList* mAvatarList;
LLNonAvatarCaller* mNonAvatarCaller;
EVoiceControls mVoiceType;
LLPanel* mAgentPanel;
LLOutputMonitorCtrl* mSpeakingIndicator;
bool mIsModeratorMutedVoice;
+
+ /**
+ * Flag indicated that participants voice states should be initialized.
+ *
+ * It is used due to Avatar List has delayed refreshing after it content is changed.
+ * Real initializing is performed when Avatar List is first time refreshed.
+ *
+ * @see onAvatarListRefreshed()
+ * @see initParticipantsVoiceState()
+ */
+ bool mInitParticipantsVoiceState;
+
+ boost::signals2::connection mAvatarListRefreshConnection;
+
+ /**
+ * class LLAvatarListItemRemoveTimer
+ *
+ * Implements a timer that removes avatar list item of a participant
+ * who has left the call.
+ */
+ class LLAvatarListItemRemoveTimer : public LLEventTimer
+ {
+ public:
+ typedef boost::function<void(const LLUUID&)> callback_t;
+
+ LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id);
+ virtual ~LLAvatarListItemRemoveTimer() {};
+
+ virtual BOOL tick();
+
+ private:
+ callback_t mRemoveCallback;
+ LLUUID mSpeakerId;
+ };
+
+ typedef std::pair<LLUUID, LLAvatarListItemRemoveTimer*> timer_pair;
+ typedef std::map<LLUUID, LLAvatarListItemRemoveTimer*> timers_map;
+
+ timers_map mVoiceLeftTimersMap;
+ S32 mVoiceLeftRemoveDelay;
};