diff options
| author | Igor Borovkov <iborovkov@productengine.com> | 2009-11-06 17:26:25 +0200 | 
|---|---|---|
| committer | Igor Borovkov <iborovkov@productengine.com> | 2009-11-06 17:26:25 +0200 | 
| commit | 0d10e916ecb0bfc61b57d7645bd213fc90b15f56 (patch) | |
| tree | 7932ee3cbb3b9fde5087c306ccab2e191a958568 | |
| parent | f6aa7f8c80d3e6fd159cd6252df1baa90701c2de (diff) | |
| parent | 30fe1aa19715076be2cef2f3cf78a79b6343c9ba (diff) | |
merge
--HG--
branch : product-engine
| -rw-r--r-- | indra/newview/llgrouplist.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llpanelpeople.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.cpp | 98 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.h | 20 | ||||
| -rw-r--r-- | indra/newview/llspeakers.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llspeakers.h | 10 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/strings.xml | 1 | 
7 files changed, 154 insertions, 9 deletions
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 2e2b2d5101..010ed23918 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -183,6 +183,11 @@ void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LL  	item->childSetVisible("info_btn", false);  	item->setGroupIconVisible(mShowIcons); +	if (id.isNull()) +	{ +		item->childSetVisible("profile_btn", false); +	} +  	addItem(item, id, pos);  //	setCommentVisible(false); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 65a7b5322b..bb6cdd2f78 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -667,8 +667,10 @@ void LLPanelPeople::updateButtons()  	buttonSetEnabled("im_btn",				(selected_uuids.size() >= 1)); // allow starting the friends conference for multiple selection  	buttonSetEnabled("call_btn",			item_selected && false); // not implemented yet  	buttonSetEnabled("share_btn",			item_selected && false); // not implemented yet -	buttonSetEnabled("group_info_btn",		item_selected); -	buttonSetEnabled("chat_btn",			item_selected); + +	bool none_group_selected = item_selected && selected_id.isNull(); +	buttonSetEnabled("group_info_btn", !none_group_selected); +	buttonSetEnabled("chat_btn", !none_group_selected);  }  std::string LLPanelPeople::getActiveTabName() const diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index edff706fee..94e47318de 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -50,13 +50,16 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  	mSpeakerAddListener = new SpeakerAddListener(*this);  	mSpeakerRemoveListener = new SpeakerRemoveListener(*this);  	mSpeakerClearListener = new SpeakerClearListener(*this); +	mSpeakerModeratorListener = new SpeakerModeratorUpdateListener(*this);  	mSpeakerMgr->addListener(mSpeakerAddListener, "add");  	mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");  	mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); +	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));  	//Lets fill avatarList with existing speakers  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -65,7 +68,12 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  	mSpeakerMgr->getSpeakerList(&speaker_list, true);  	for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)  	{ -		group_members.push_back((*it)->mID); +		const LLPointer<LLSpeaker>& speakerp = *it; +		group_members.push_back(speakerp->mID); +		if ( speakerp->mIsModerator ) +		{ +			mModeratorList.insert(speakerp->mID); +		}  	}  	sort();  } @@ -84,6 +92,56 @@ void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)  	LLAvatarActions::startIM(clicked_id);  } +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) +		{ +			LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)); +			if ( item ) +			{ +				std::string name = item->getAvatarName(); +				size_t found = name.find(moderator_indicator); +				if (found == std::string::npos) +				{ +					name.erase(found, moderator_indicator_len); +					item->setName(name); +				} +			} +		} + +		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) +		{ +			LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)); +			if ( item ) +			{ +				std::string name = item->getAvatarName(); +				size_t found = name.find(moderator_indicator); +				if (found == std::string::npos) +				{ +					name += " "; +					name += moderator_indicator; +					item->setName(name); +				} +			} +		} +	} +} +  void LLParticipantList::setSortOrder(EParticipantSortOrder order)  {  	if ( mSortOrder != order ) @@ -106,6 +164,8 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co  	}  	group_members.push_back(uu_id); +	// Mark AvatarList as dirty one +	mAvatarList->setDirty();  	sort();  	return true;  } @@ -130,14 +190,36 @@ bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event,  	return true;  } +bool LLParticipantList::onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	const LLSD& evt_data = event->getValue(); +	if ( evt_data.has("id") && evt_data.has("is_moderator") ) +	{ +		LLUUID id = evt_data["id"]; +		bool is_moderator = evt_data["is_moderator"]; +		if ( id.notNull() ) +		{ +			if ( is_moderator ) +				mModeratorList.insert(id); +			else +			{ +				std::set<LLUUID>::iterator it = mModeratorList.find (id); +				if ( it != mModeratorList.end () ) +				{ +					mModeratorToRemoveList.insert(id); +					mModeratorList.erase(id); +				} +			} +		} +	} +	return true; +} +  void LLParticipantList::sort()  {  	if ( !mAvatarList )  		return; -	// Mark AvatarList as dirty one -	mAvatarList->setDirty(); -  	// TODO: Implement more sorting orders after specs updating (EM)  	switch ( mSortOrder ) {  	case E_SORT_BY_NAME : @@ -172,3 +254,11 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents:  {  	return mParent.onClearListEvent(event, userdata);  } + +// +// LLParticipantList::SpeakerModeratorListener +// +bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +		return mParent.onModeratorUpdateEvent(event, userdata); +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 8c209c0b20..fc34dd308b 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -35,6 +35,7 @@  class LLSpeakerMgr;  class LLAvatarList; +class LLUICtrl;  class LLParticipantList  { @@ -59,6 +60,7 @@ class LLParticipantList  		bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);  		bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);  		bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); +		bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);  		/**  		 * Sorts the Avatarlist by stored order @@ -97,15 +99,27 @@ class LLParticipantList  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);  		}; +		class SpeakerModeratorUpdateListener : public BaseSpeakerListner +		{ +		public: +			SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} +			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); +		}; +  	private:  		void onAvatarListDoubleClicked(LLAvatarList* list); +		void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);  		LLSpeakerMgr*		mSpeakerMgr;  		LLAvatarList*		mAvatarList; -		LLPointer<SpeakerAddListener>		mSpeakerAddListener; -		LLPointer<SpeakerRemoveListener>	mSpeakerRemoveListener; -		LLPointer<SpeakerClearListener>		mSpeakerClearListener; +		std::set<LLUUID>	mModeratorList; +		std::set<LLUUID>	mModeratorToRemoveList; + +		LLPointer<SpeakerAddListener>				mSpeakerAddListener; +		LLPointer<SpeakerRemoveListener>			mSpeakerRemoveListener; +		LLPointer<SpeakerClearListener>				mSpeakerClearListener; +		LLPointer<SpeakerModeratorUpdateListener>	mSpeakerModeratorListener;  		EParticipantSortOrder	mSortOrder;  }; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 2341fcfc6d..2ed82b7d62 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -87,6 +87,21 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c  	mDisplayName = first + " " + last;  } +LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source) +: LLEvent(source, "Speaker add moderator event"), +  mSpeakerID (source->mID), +  mIsModerator (source->mIsModerator) +{ +} + +LLSD LLSpeakerUpdateModeratorEvent::getValue() +{ +	LLSD ret; +	ret["id"] = mSpeakerID; +	ret["is_moderator"] = mIsModerator; +	return ret; +} +  LLSpeakerTextModerationEvent::LLSpeakerTextModerationEvent(LLSpeaker* source)  : LLEvent(source, "Speaker text moderation event")  { @@ -437,9 +452,13 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)  			if ( speaker_it->second.isMap() )  			{ +				BOOL is_moderator = speakerp->mIsModerator;  				speakerp->mIsModerator = speaker_it->second["is_moderator"];  				speakerp->mModeratorMutedText =  					speaker_it->second["mutes"]["text"]; +				// Fire event only if moderator changed +				if ( is_moderator != speakerp->mIsModerator ) +					fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");  			}  		}  	} @@ -507,7 +526,11 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  				if (agent_info.has("is_moderator"))  				{ +					BOOL is_moderator = speakerp->mIsModerator;  					speakerp->mIsModerator = agent_info["is_moderator"]; +					// Fire event only if moderator changed +					if ( is_moderator != speakerp->mIsModerator ) +						fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");  				}  				if (agent_info.has("mutes")) diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index e0f22bff4f..04046a8587 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -84,6 +84,16 @@ public:  	BOOL			mModeratorMutedText;  }; +class LLSpeakerUpdateModeratorEvent : public LLOldEvents::LLEvent +{ +public: +	LLSpeakerUpdateModeratorEvent(LLSpeaker* source); +	/*virtual*/ LLSD getValue(); +private: +	const LLUUID& mSpeakerID; +	BOOL mIsModerator; +}; +  class LLSpeakerTextModerationEvent : public LLOldEvents::LLEvent  {  public: diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b44420238f..c850dce141 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2848,6 +2848,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string>  	<string name="IM_default_text_label">Click here to instant message.</string>  	<string name="IM_to_label">To</string> +	<string name="IM_moderator_label">(Moderator)</string>    <string name="ringing-im">  | 
