llparticipantlist.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llparticipantlist.h
  3.  * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llevent.h"
  34. #include "llpanelpeoplemenus.h"
  35. #include "llavatarlist.h" // for LLAvatarItemRecentSpeakerComparator
  36. class LLSpeakerMgr;
  37. class LLAvatarList;
  38. class LLUICtrl;
  39. class LLParticipantList
  40. {
  41. LOG_CLASS(LLParticipantList);
  42. public:
  43. typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t;
  44. LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true);
  45. ~LLParticipantList();
  46. void setSpeakingIndicatorsVisible(BOOL visible);
  47. typedef enum e_participant_sort_oder {
  48. E_SORT_BY_NAME = 0,
  49. E_SORT_BY_RECENT_SPEAKERS = 1,
  50. } EParticipantSortOrder;
  51. /**
  52.  * Adds specified avatar ID to the existing list if it is not Agent's ID
  53.  *
  54.  * @param[in] avatar_id - Avatar UUID to be added into the list
  55.  */
  56. void addAvatarIDExceptAgent(const LLUUID& avatar_id);
  57. /**
  58.  * Set and sort Avatarlist by given order
  59.  */
  60. void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME);
  61. EParticipantSortOrder getSortOrder();
  62. /**
  63.  * Refreshes the participant list if it's in sort by recent speaker order.
  64.  */
  65. void updateRecentSpeakersOrder();
  66. /**
  67.  * Set a callback to be called before adding a speaker. Invalid speakers will not be added.
  68.  *
  69.  * If the callback is unset all speakers are considered as valid.
  70.  *
  71.  * @see onAddItemEvent()
  72.  */
  73. void setValidateSpeakerCallback(validate_speaker_callback_t cb);
  74. protected:
  75. /**
  76.  * LLSpeakerMgr event handlers
  77.  */
  78. bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  79. bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  80. bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  81. bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  82. bool onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  83. /**
  84.  * Sorts the Avatarlist by stored order
  85.  */
  86. void sort();
  87. //List of listeners implementing LLOldEvents::LLSimpleListener.
  88. //There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way
  89. //that one listener can handle only one type of event
  90. class BaseSpeakerListner : public LLOldEvents::LLSimpleListener
  91. {
  92. public:
  93. BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {}
  94. protected:
  95. LLParticipantList& mParent;
  96. };
  97. class SpeakerAddListener : public BaseSpeakerListner
  98. {
  99. public:
  100. SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
  101. /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  102. };
  103. class SpeakerRemoveListener : public BaseSpeakerListner
  104. {
  105. public:
  106. SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
  107. /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  108. };
  109. class SpeakerClearListener : public BaseSpeakerListner
  110. {
  111. public:
  112. SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
  113. /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  114. };
  115. class SpeakerModeratorUpdateListener : public BaseSpeakerListner
  116. {
  117. public:
  118. SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
  119. /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  120. };
  121. class SpeakerMuteListener : public BaseSpeakerListner
  122. {
  123. public:
  124. SpeakerMuteListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
  125. /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
  126. };
  127. /**
  128.  * Menu used in the participant list.
  129.  */
  130. class LLParticipantListMenu : public LLPanelPeopleMenus::ContextMenu
  131. {
  132. public:
  133. LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
  134. /*virtual*/ LLContextMenu* createMenu();
  135. /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
  136. protected:
  137. LLParticipantList& mParent;
  138. private:
  139. bool enableContextMenuItem(const LLSD& userdata);
  140. bool checkContextMenuItem(const LLSD& userdata);
  141. void sortParticipantList(const LLSD& userdata);
  142. void toggleAllowTextChat(const LLSD& userdata);
  143. void toggleMute(const LLSD& userdata, U32 flags);
  144. void toggleMuteText(const LLSD& userdata);
  145. void toggleMuteVoice(const LLSD& userdata);
  146. /**
  147.  * Return true if Agent is group moderator(and moderator of group call).
  148.  */
  149. bool isGroupModerator();
  150. // Voice moderation support
  151. /**
  152.  * Check whether specified by argument avatar is muted for group chat or not.
  153.  */
  154. bool isMuted(const LLUUID& avatar_id);
  155. /**
  156.  * Processes Voice moderation menu items.
  157.  *
  158.  * It calls either moderateVoiceParticipant() or moderateVoiceParticipant() depend on
  159.  * passed parameter.
  160.  *
  161.  * @param userdata can be "selected" or "others".
  162.  *
  163.  * @see moderateVoiceParticipant()
  164.  * @see moderateVoiceOtherParticipants()
  165.  */
  166. void moderateVoice(const LLSD& userdata);
  167. /**
  168.  * Mutes/Unmutes avatar for current group voice chat.
  169.  *
  170.  * It only marks avatar as muted for session and does not use local Agent's Block list.
  171.  * It does not mute Agent itself.
  172.  *
  173.  * @param[in] avatar_id UUID of avatar to be processed
  174.  * @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted.
  175.  *
  176.  * @see moderateVoiceOtherParticipants()
  177.  */
  178. void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
  179. /**
  180.  * Mutes/Unmutes all avatars except specified for current group voice chat.
  181.  *
  182.  * It only marks avatars as muted for session and does not use local Agent's Block list.
  183.  * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
  184.  *
  185.  * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
  186.  * @param[in] unmute if true - avatars will be muted, otherwise - unmuted.
  187.  *
  188.  * @see moderateVoiceParticipant()
  189.  */
  190. void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
  191. };
  192. /**
  193.  * Comparator for comparing avatar items by last spoken time
  194.  */
  195. class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator, public LLRefCount
  196. {
  197. LOG_CLASS(LLAvatarItemRecentSpeakerComparator);
  198.   public:
  199. LLAvatarItemRecentSpeakerComparator(LLParticipantList& parent):mParent(parent){};
  200. virtual ~LLAvatarItemRecentSpeakerComparator() {};
  201.   protected:
  202. virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
  203.   private:
  204. LLParticipantList& mParent;
  205. };
  206. private:
  207. void onAvatarListDoubleClicked(LLUICtrl* ctrl);
  208. void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
  209. /**
  210.  * Adjusts passed participant to work properly.
  211.  *
  212.  * Adds SpeakerMuteListener to process moderation actions.
  213.  */
  214. void adjustParticipant(const LLUUID& speaker_id);
  215. LLSpeakerMgr* mSpeakerMgr;
  216. LLAvatarList* mAvatarList;
  217. std::set<LLUUID> mModeratorList;
  218. std::set<LLUUID> mModeratorToRemoveList;
  219. LLPointer<SpeakerAddListener> mSpeakerAddListener;
  220. LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener;
  221. LLPointer<SpeakerClearListener> mSpeakerClearListener;
  222. LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener;
  223. LLPointer<SpeakerMuteListener> mSpeakerMuteListener;
  224. LLParticipantListMenu*    mParticipantListMenu;
  225. EParticipantSortOrder mSortOrder;
  226. /*
  227.  * This field manages an adding  a new avatar_id in the mAvatarList
  228.  * If true, then agent_id wont  be added into mAvatarList
  229.  * Also by default this field is controlling a sort procedure, @c sort() 
  230.  */
  231. bool mExcludeAgent;
  232. // boost::connections
  233. boost::signals2::connection mAvatarListDoubleClickConnection;
  234. boost::signals2::connection mAvatarListRefreshConnection;
  235. boost::signals2::connection mAvatarListReturnConnection;
  236. LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;
  237. validate_speaker_callback_t mValidateSpeakerCallback;
  238. };