STORM-322 : merge with viewer-development

meow-7.2.2
Merov Linden 2010-10-22 15:13:57 -07:00
commit d6be4f210b
3 changed files with 97 additions and 27 deletions

View File

@ -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>

View File

@ -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));
}
}

View File

@ -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;