diff options
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 11 | ||||
| -rw-r--r-- | indra/newview/llpanelgrouproles.cpp | 107 | ||||
| -rw-r--r-- | indra/newview/llpanelgrouproles.h | 6 | 
3 files changed, 97 insertions, 27 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 086d73bc00..7172f0359a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12145,5 +12145,16 @@        <key>Value</key>        <real>300.0</real>      </map> +    <key>GroupMembersSortOrder</key> +    <map> +      <key>Comment</key> +      <string>The order by which group members will be sorted (name|donated|online)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>name</string> +    </map>  </map>  </llsd> diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 35f898bfa6..0d1d96eae6 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -49,6 +49,7 @@  #include "llviewertexturelist.h"  #include "llviewerwindow.h"  #include "llfocusmgr.h" +#include "llviewercontrol.h"  #include "roles_constants.h" @@ -742,10 +743,12 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()  	mHasMatch(FALSE),  	mNumOwnerAdditions(0)  { +	mUdpateSessionID = LLUUID::null;  }  LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()  { +	gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName());  }  BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root) @@ -772,6 +775,17 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)  	// Show the member's profile on double click.  	mMembersList->setDoubleClickCallback(onMemberDoubleClick, this);  	mMembersList->setContextMenu(LLScrollListCtrl::MENU_AVATAR); +	 +	LLSD row; +	row["columns"][0]["column"] = "name"; +	row["columns"][1]["column"] = "donated"; +	row["columns"][2]["column"] = "online"; +	mMembersList->addElement(row); +	std::string order_by = gSavedSettings.getString("GroupMembersSortOrder"); +	if(!order_by.empty()) +	{ +		mMembersList->sortByColumn(order_by, TRUE); +	}	  	LLButton* button = parent->getChild<LLButton>("member_invite", recurse);  	if ( button ) @@ -1529,6 +1543,10 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)  		mMemberProgress = gdatap->mMembers.begin();  		mPendingMemberUpdate = TRUE;  		mHasMatch = FALSE; +		// Generate unique ID for current updateMembers()- see onNameCache for details. +		// Using unique UUID is perhaps an overkill but this way we are perfectly safe +		// from coincidences. +		mUdpateSessionID.generate();  	}  	else  	{ @@ -1556,6 +1574,59 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)  	}  } +void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* data) +{ +	LLUIString donated = getString("donation_area"); +	donated.setArg("[AREA]", llformat("%d", data->getContribution())); + +	LLSD row; +	row["id"] = id; + +	row["columns"][0]["column"] = "name"; +	// value is filled in by name list control + +	row["columns"][1]["column"] = "donated"; +	row["columns"][1]["value"] = donated.getString(); + +	row["columns"][2]["column"] = "online"; +	row["columns"][2]["value"] = data->getOnlineStatus(); +	row["columns"][2]["font"] = "SANSSERIF_SMALL"; + +	mMembersList->addElement(row); + +	mHasMatch = TRUE; +} + +void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUID& id) +{ +	// Update ID is used to determine whether member whose id is passed +	// into onNameCache() was passed after current or previous user-initiated update. +	// This is needed to avoid probable duplication of members in list after changing filter +	// or adding of members of another group if gets for their names were called on +	// previous update. If this id is from get() called from older update, +	// we do nothing. +	if (mUdpateSessionID != update_id) return; +	 +	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); +		if (!gdatap)  +	{ +		llwarns << "LLPanelGroupMembersSubTab::updateMembers() -- No group data!" << llendl; +		return; +	} +	 +	std::string fullname; +	gCacheName->getFullName(id, fullname); +	if (matchesSearchFilter(fullname)) +	{ +		addMemberToList(id, gdatap->mMembers[id]); +		if(!mMembersList->getEnabled()) +		{ +			mMembersList->setEnabled(TRUE); +		} +	} +	 +} +  void LLPanelGroupMembersSubTab::updateMembers()  {  	mPendingMemberUpdate = FALSE; @@ -1580,12 +1651,13 @@ void LLPanelGroupMembersSubTab::updateMembers()  	//cleanup list only for first iretation  	if(mMemberProgress == gdatap->mMembers.begin()) +	{  		mMembersList->deleteAllItems(); +	}  	LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end(); -	LLUIString donated = getString("donation_area"); - +	  	S32 i = 0;  	for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME;   			++mMemberProgress, ++i) @@ -1593,38 +1665,19 @@ void LLPanelGroupMembersSubTab::updateMembers()  		if (!mMemberProgress->second)  			continue;  		// Do filtering on name if it is already in the cache. -		bool add_member = true; -  		std::string fullname;  		if (gCacheName->getFullName(mMemberProgress->first, fullname))  		{ -			if ( !matchesSearchFilter(fullname) ) +			if (matchesSearchFilter(fullname))  			{ -				add_member = false; +				addMemberToList(mMemberProgress->first, mMemberProgress->second);  			}  		} - -		if (add_member) +		else  		{ -			donated.setArg("[AREA]", llformat("%d", mMemberProgress->second->getContribution())); - -			LLSD row; -			row["id"] = (*mMemberProgress).first; - -			row["columns"][0]["column"] = "name"; -			// value is filled in by name list control - -			row["columns"][1]["column"] = "donated"; -			row["columns"][1]["value"] = donated.getString(); - -			row["columns"][2]["column"] = "online"; -			row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus(); -			row["columns"][2]["font"] = "SANSSERIF_SMALL"; - -			LLScrollListItem* member = mMembersList->addElement(row); - -			LLUUID id = member->getUUID(); -			mHasMatch = TRUE; +			// If name is not cached, onNameCache() should be called when it is cached and add this member to list. +			gCacheName->get(mMemberProgress->first, FALSE, boost::bind(&LLPanelGroupMembersSubTab::onNameCache, +																	   this, mUdpateSessionID, _1));  		}  	} diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 6a773f1ebb..270259c16f 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -187,6 +187,9 @@ public:  	virtual void setGroupID(const LLUUID& id); +	void addMemberToList(LLUUID id, LLGroupMemberData* data); +	void onNameCache(const LLUUID& update_id, const LLUUID& id); +  protected:  	typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;  	typedef std::map<LLUUID, role_change_data_map_t*> member_role_changes_map_t; @@ -207,6 +210,9 @@ protected:  	BOOL mPendingMemberUpdate;  	BOOL mHasMatch; +	// This id is generated after each user initiated member list update(opening Roles or changing filter) +	LLUUID mUdpateSessionID; +  	member_role_changes_map_t mMemberRoleChangeData;  	U32 mNumOwnerAdditions; | 
