diff options
| -rw-r--r-- | indra/newview/llpanelimcontrolpanel.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llpanelimcontrolpanel.h | 1 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.cpp | 96 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.h | 56 | 
4 files changed, 121 insertions, 46 deletions
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index b5e0cdccc0..21e88b6d07 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -199,6 +199,20 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked()  	LLGroupActions::show(mGroupID);  } +void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata) +{ +	// TODO: Check this code when when sort order menu will be added. (EM) +	if (false && !mParticipantList) +		return; + +	std::string chosen_item = userdata.asString(); + +	if (chosen_item == "sort_name") +	{ +		mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME); +	} + +}  void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)  { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index b60ddc1d8d..fa101f4280 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -99,6 +99,7 @@ protected:  private:  	void onGroupInfoButtonClicked(); +	void onSortMenuItemClicked(const LLSD& userdata);  };  class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 133f13aab8..9450bee315 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -44,15 +44,15 @@  //LLParticipantList retrieves add, clear and remove events and updates view accordingly   LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):  	mSpeakerMgr(data_source), -	mAvatarList(avatar_list) +	mAvatarList(avatar_list), +	mSpeakerAddListener(*this), +	mSpeakerRemoveListener(*this), +	mSpeakerClearListener(*this), +	mSortOrder(E_SORT_BY_NAME)  { -	mSpeakerAddListener = new SpeakerAddListener(mAvatarList); -	mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList); -	mSpeakerClearListener = new SpeakerClearListener(mAvatarList); - -	mSpeakerMgr->addListener(mSpeakerAddListener, "add"); -	mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); -	mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); +	mSpeakerMgr->addListener(&mSpeakerAddListener, "add"); +	mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove"); +	mSpeakerMgr->addListener(&mSpeakerClearListener, "clear");  	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));  	mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); @@ -66,8 +66,11 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  	{  		group_members.push_back((*it)->mID);  	} -	mAvatarList->setDirty(); -	mAvatarList->sortByName(); +	sort(); +} + +LLParticipantList::~LLParticipantList() +{  }  void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) @@ -80,20 +83,16 @@ void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)  	LLAvatarActions::startIM(clicked_id);  } -LLParticipantList::~LLParticipantList() +void LLParticipantList::setSortOrder(EParticipantSortOrder order)  { -	delete mSpeakerAddListener; -	delete mSpeakerRemoveListener; -	delete mSpeakerClearListener; -	mSpeakerAddListener = NULL; -	mSpeakerRemoveListener = NULL; -	mSpeakerClearListener = NULL; +	if ( mSortOrder != order ) +	{ +		mSortOrder = order; +		sort(); +	}  } -// -// LLParticipantList::SpeakerAddListener -// -bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();  	LLUUID uu_id = event->getValue().asUUID(); @@ -106,15 +105,11 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L  	}  	group_members.push_back(uu_id); -	mAvatarList->setDirty(); -	mAvatarList->sortByName(); +	sort();  	return true;  } -// -// LLParticipantList::SpeakerRemoveListener -// -bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();  	LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); @@ -126,10 +121,7 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents  	return true;  } -// -// LLParticipantList::SpeakerClearListener -// -bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();  	group_members.clear(); @@ -137,3 +129,45 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents:  	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 : +		mAvatarList->sortByName(); +		break; +	default : +		llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl; +		return; +	} +} + +// +// LLParticipantList::SpeakerAddListener +// +bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	return mParent.onAddItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerRemoveListener +// +bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	return mParent.onRemoveItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerClearListener +// +bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	return mParent.onClearListEvent(event, userdata); +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index a3a55303c0..04d9e29256 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -38,48 +38,74 @@ class LLAvatarList;  class LLParticipantList  { +	LOG_CLASS(LLParticipantList);  	public:  		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);  		~LLParticipantList(); +		typedef enum e_participant_sort_oder { +			E_SORT_BY_NAME = 0, +		} EParticipantSortOrder; + +		/** +		  * Set and sort Avatarlist by given order +		  */ +		void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME); +  	protected: +		/** +		 * LLSpeakerMgr event handlers +		 */ +		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); + +		/** +		 * Sorts the Avatarlist by stored order +		 */ +		void sort();  		//List of listeners implementing LLOldEvents::LLSimpleListener.  		//There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way  		//that one listener can handle only one type of event -		class SpeakerAddListener : public LLOldEvents::LLSimpleListener +		class BaseSpeakerListner : public LLOldEvents::LLSimpleListener  		{  		public: -			SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} +			BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {} +		protected: +			LLParticipantList& mParent; +		}; +		class SpeakerAddListener : public BaseSpeakerListner +		{ +		public: +			SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); -			LLAvatarList* mAvatarList;  		}; -		class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener +		class SpeakerRemoveListener : public BaseSpeakerListner  		{  		public: -			SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - +			SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); -			LLAvatarList* mAvatarList;  		}; -		class SpeakerClearListener : public LLOldEvents::LLSimpleListener +		class SpeakerClearListener : public BaseSpeakerListner  		{  		public: -			SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - +			SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); -			LLAvatarList* mAvatarList;  		}; +  	private:  		void onAvatarListDoubleClicked(LLAvatarList* list);  		LLSpeakerMgr*		mSpeakerMgr; -		LLAvatarList* 		mAvatarList; +		LLAvatarList*		mAvatarList; + +		SpeakerAddListener		mSpeakerAddListener; +		SpeakerRemoveListener	mSpeakerRemoveListener; +		SpeakerClearListener	mSpeakerClearListener; -		SpeakerAddListener* mSpeakerAddListener; -		SpeakerRemoveListener* mSpeakerRemoveListener; -		SpeakerClearListener* mSpeakerClearListener; +		EParticipantSortOrder	mSortOrder;  };  | 
