#1318 Pagination in the Group Interface
parent
57e78ed43b
commit
aaa5caeca8
|
|
@ -1479,10 +1479,9 @@ const std::string LLScrollListCtrl::getSelectedItemLabel(S32 column) const
|
|||
item = getFirstSelected();
|
||||
if (item)
|
||||
{
|
||||
auto col = item->getColumn(column);
|
||||
if(col)
|
||||
if (LLScrollListCell* cell = item->getColumn(column))
|
||||
{
|
||||
return col->getValue().asString();
|
||||
return cell->getValue().asString();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2720,7 +2719,8 @@ struct SameSortColumn
|
|||
bool LLScrollListCtrl::setSort(S32 column_idx, bool ascending)
|
||||
{
|
||||
LLScrollListColumn* sort_column = getColumn(column_idx);
|
||||
if (!sort_column) return false;
|
||||
if (!sort_column)
|
||||
return false;
|
||||
|
||||
sort_column->mSortDirection = ascending ? LLScrollListColumn::ASCENDING : LLScrollListColumn::DESCENDING;
|
||||
|
||||
|
|
@ -2733,32 +2733,28 @@ bool LLScrollListCtrl::setSort(S32 column_idx, bool ascending)
|
|||
mSortColumns.push_back(new_sort_column);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// grab current sort column
|
||||
sort_column_t cur_sort_column = mSortColumns.back();
|
||||
|
||||
// remove any existing sort criterion referencing this column
|
||||
// and add the new one
|
||||
mSortColumns.erase(remove_if(mSortColumns.begin(), mSortColumns.end(), SameSortColumn(column_idx)), mSortColumns.end());
|
||||
mSortColumns.push_back(new_sort_column);
|
||||
// grab current sort column
|
||||
sort_column_t cur_sort_column = mSortColumns.back();
|
||||
|
||||
// did the sort criteria change?
|
||||
return (cur_sort_column != new_sort_column);
|
||||
}
|
||||
// remove any existing sort criterion referencing this column
|
||||
// and add the new one
|
||||
mSortColumns.erase(remove_if(mSortColumns.begin(), mSortColumns.end(), SameSortColumn(column_idx)), mSortColumns.end());
|
||||
mSortColumns.push_back(new_sort_column);
|
||||
|
||||
// did the sort criteria change?
|
||||
return cur_sort_column != new_sort_column;
|
||||
}
|
||||
|
||||
S32 LLScrollListCtrl::getLinesPerPage()
|
||||
{
|
||||
//if mPageLines is NOT provided display all item
|
||||
if (mPageLines)
|
||||
{
|
||||
return mPageLines;
|
||||
}
|
||||
else
|
||||
{
|
||||
return mLineHeight ? mItemListRect.getHeight() / mLineHeight : getItemCount();
|
||||
}
|
||||
|
||||
// If mPageLines is NOT provided then display all items
|
||||
return mLineHeight ? mItemListRect.getHeight() / mLineHeight : getItemCount();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2774,7 +2770,7 @@ void LLScrollListCtrl::sortByColumn(const std::string& name, bool ascending)
|
|||
column_map_t::iterator itor = mColumns.find(name);
|
||||
if (itor != mColumns.end())
|
||||
{
|
||||
sortByColumnIndex((*itor).second->mIndex, ascending);
|
||||
sortByColumnIndex(itor->second->mIndex, ascending);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3093,8 +3089,7 @@ std::string LLScrollListCtrl::getSortColumnName()
|
|||
{
|
||||
LLScrollListColumn* column = mSortColumns.empty() ? NULL : mColumnsIndexed[mSortColumns.back().first];
|
||||
|
||||
if (column) return column->mName;
|
||||
else return "";
|
||||
return column ? column->mName : LLStringUtil::null;
|
||||
}
|
||||
|
||||
bool LLScrollListCtrl::hasSortOrder() const
|
||||
|
|
|
|||
|
|
@ -806,7 +806,7 @@ void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid)
|
|||
|
||||
mPendingBanRequest = false;
|
||||
|
||||
LLGroupMemberData* member_data = (*mi).second;
|
||||
LLGroupMemberData* member_data = mi->second;
|
||||
if (member_data && member_data->isInRole(mOwnerRole))
|
||||
{
|
||||
return; // can't ban group owner
|
||||
|
|
@ -832,8 +832,7 @@ void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid)
|
|||
// LLGroupMgr
|
||||
//
|
||||
|
||||
LLGroupMgr::LLGroupMgr():
|
||||
mMemberRequestInFlight(false)
|
||||
LLGroupMgr::LLGroupMgr()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -968,11 +967,11 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
|
|||
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
|
||||
if (!group_datap || (group_datap->mMemberRequestID != request_id))
|
||||
{
|
||||
LL_WARNS() << "processGroupMembersReply: Received incorrect (stale?) group or request id" << LL_ENDL;
|
||||
LL_WARNS() << "Received incorrect (stale?) group or request id" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
msg->getS32(_PREHASH_GroupData, "MemberCount", group_datap->mMemberCount );
|
||||
msg->getS32Fast(_PREHASH_GroupData, _PREHASH_MemberCount, group_datap->mMemberCount);
|
||||
|
||||
if (group_datap->mMemberCount > 0)
|
||||
{
|
||||
|
|
@ -987,12 +986,12 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
|
|||
{
|
||||
LLUUID member_id;
|
||||
|
||||
msg->getUUIDFast(_PREHASH_MemberData, _PREHASH_AgentID, member_id, i );
|
||||
msg->getS32(_PREHASH_MemberData, _PREHASH_Contribution, contribution, i);
|
||||
msg->getU64(_PREHASH_MemberData, "AgentPowers", agent_powers, i);
|
||||
msg->getUUIDFast(_PREHASH_MemberData, _PREHASH_AgentID, member_id, i);
|
||||
msg->getS32Fast(_PREHASH_MemberData, _PREHASH_Contribution, contribution, i);
|
||||
msg->getU64Fast(_PREHASH_MemberData, _PREHASH_AgentPowers, agent_powers, i);
|
||||
msg->getStringFast(_PREHASH_MemberData, _PREHASH_OnlineStatus, online_status, i);
|
||||
msg->getString(_PREHASH_MemberData, "Title", title, i);
|
||||
msg->getBOOL(_PREHASH_MemberData,"IsOwner",is_owner,i);
|
||||
msg->getStringFast(_PREHASH_MemberData, _PREHASH_Title, title, i);
|
||||
msg->getBOOLFast(_PREHASH_MemberData, _PREHASH_IsOwner, is_owner, i);
|
||||
|
||||
if (member_id.notNull())
|
||||
{
|
||||
|
|
@ -1037,7 +1036,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
|
|||
|
||||
group_datap->mMemberVersion.generate();
|
||||
|
||||
if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount)
|
||||
if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount)
|
||||
{
|
||||
group_datap->mMemberDataComplete = true;
|
||||
group_datap->mMemberRequestID.setNull();
|
||||
|
|
@ -1678,13 +1677,12 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
|
|||
if (group_datap->mRoleMembersRequestID.isNull())
|
||||
{
|
||||
// Don't send the request if we don't have all the member or role data
|
||||
if (!group_datap->isMemberDataComplete()
|
||||
|| !group_datap->isRoleDataComplete())
|
||||
if (!group_datap->isMemberDataComplete() || !group_datap->isRoleDataComplete())
|
||||
{
|
||||
// *TODO: KLW FIXME: Should we start a member or role data request?
|
||||
LL_INFOS("GrpMgr") << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
|
||||
<< " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
|
||||
<< " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
|
||||
<< ", MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
|
||||
<< ", RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
|
||||
group_datap->mPendingRoleMemberRequest = true;
|
||||
return;
|
||||
}
|
||||
|
|
@ -1984,14 +1982,14 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
|
|||
group_datap->mMemberVersion.generate();
|
||||
}
|
||||
|
||||
void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID groupId)
|
||||
void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID group_id)
|
||||
{
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
|
||||
std::string finalUrl = url + "?group_id=" + groupId.asString();
|
||||
std::string finalUrl = url + "?group_id=" + group_id.asString();
|
||||
|
||||
LLSD result = httpAdapter->getAndSuspend(httpRequest, finalUrl);
|
||||
|
||||
|
|
@ -2012,8 +2010,8 @@ void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID groupId)
|
|||
}
|
||||
}
|
||||
|
||||
void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID groupId,
|
||||
U32 action, uuid_vec_t banList, bool update)
|
||||
void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID group_id,
|
||||
U32 action, uuid_vec_t ban_list, bool update)
|
||||
{
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
|
|
@ -2026,20 +2024,16 @@ void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID groupId,
|
|||
|
||||
httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML);
|
||||
|
||||
|
||||
std::string finalUrl = url + "?group_id=" + groupId.asString();
|
||||
std::string finalUrl = url + "?group_id=" + group_id.asString();
|
||||
|
||||
LLSD postData = LLSD::emptyMap();
|
||||
postData["ban_action"] = (LLSD::Integer)action;
|
||||
// Add our list of potential banned residents to the list
|
||||
postData["ban_ids"] = LLSD::emptyArray();
|
||||
LLSD banEntry;
|
||||
|
||||
uuid_vec_t::const_iterator it = banList.begin();
|
||||
for (; it != banList.end(); ++it)
|
||||
for (const LLUUID& ban_id : ban_list)
|
||||
{
|
||||
banEntry = (*it);
|
||||
postData["ban_ids"].append(banEntry);
|
||||
postData["ban_ids"].append(ban_id);
|
||||
}
|
||||
|
||||
LL_WARNS() << "post: " << ll_pretty_print_sd(postData) << LL_ENDL;
|
||||
|
|
@ -2064,7 +2058,7 @@ void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID groupId,
|
|||
|
||||
if (update)
|
||||
{
|
||||
getGroupBanRequestCoro(url, groupId);
|
||||
getGroupBanRequestCoro(url, group_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2151,55 +2145,66 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
|
|||
LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);
|
||||
}
|
||||
|
||||
void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID groupId)
|
||||
void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, std::string sort_column)
|
||||
{
|
||||
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "', sort_column: '" << sort_column << "', page_size: " << page_size << ", page_start: " << page_start << LL_ENDL;
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions);
|
||||
|
||||
mMemberRequestInFlight = true;
|
||||
LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
|
||||
|
||||
LLSD postData = LLSD::emptyMap();
|
||||
postData["group_id"] = groupId;
|
||||
postData["group_id"] = group_id;
|
||||
if (page_size)
|
||||
{
|
||||
postData["page_size"] = LLSD::Integer(page_size);
|
||||
if (page_start)
|
||||
{
|
||||
postData["page_start"] = LLSD::Integer(page_start);
|
||||
}
|
||||
if (!sort_column.empty())
|
||||
{
|
||||
postData["sort_column"] = sort_column;
|
||||
}
|
||||
}
|
||||
|
||||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData, httpOpts);
|
||||
LLSD response = httpAdapter->postAndSuspend(httpRequest, url, postData, httpOpts);
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
mMemberRequestInFlight = false;
|
||||
|
||||
LLSD httpResults = response.get(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
LL_WARNS("GrpMgr") << "Error receiving group member data " << LL_ENDL;
|
||||
mMemberRequestInFlight = false;
|
||||
return;
|
||||
}
|
||||
|
||||
result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
|
||||
LLGroupMgr::processCapGroupMembersRequest(result);
|
||||
mMemberRequestInFlight = false;
|
||||
response.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
|
||||
processCapGroupMembersResponse(response, page_size, page_start, sort_column);
|
||||
}
|
||||
|
||||
void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
|
||||
void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id, U32 page_size, U32 page_start, const std::string& sort_column)
|
||||
{
|
||||
static U32 lastGroupMemberRequestFrame = 0;
|
||||
|
||||
// Have we requested the information already this frame?
|
||||
// Todo: make this per group, we can invite to one group and simultaneously be checking another one
|
||||
if ((lastGroupMemberRequestFrame == gFrameCount) || (mMemberRequestInFlight))
|
||||
if ((lastGroupMemberRequestFrame == gFrameCount) || mMemberRequestInFlight)
|
||||
return;
|
||||
|
||||
LLViewerRegion* currentRegion = gAgent.getRegion();
|
||||
// Thank you FS:Ansariel!
|
||||
if(!currentRegion)
|
||||
if (!currentRegion)
|
||||
{
|
||||
LL_WARNS("GrpMgr") << "Agent does not have a current region. Uh-oh!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check to make sure we have our capabilities
|
||||
if(!currentRegion->capabilitiesReceived())
|
||||
if (!currentRegion->capabilitiesReceived())
|
||||
{
|
||||
LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -2209,9 +2214,9 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
|
|||
std::string cap_url = currentRegion->getCapability("GroupMemberData");
|
||||
|
||||
// Thank you FS:Ansariel!
|
||||
if(cap_url.empty())
|
||||
if (cap_url.empty())
|
||||
{
|
||||
LL_INFOS("GrpMgr") << "Region has no GroupMemberData capability. Falling back to UDP fetch." << LL_ENDL;
|
||||
LL_INFOS("GrpMgr") << "Region has no GroupMemberData capability. Falling back to UDP fetch." << LL_ENDL;
|
||||
sendGroupMembersRequest(group_id);
|
||||
return;
|
||||
}
|
||||
|
|
@ -2221,120 +2226,121 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
|
|||
|
||||
lastGroupMemberRequestFrame = gFrameCount;
|
||||
|
||||
LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro",
|
||||
boost::bind(&LLGroupMgr::groupMembersRequestCoro, this, cap_url, group_id));
|
||||
mMemberRequestInFlight = true;
|
||||
|
||||
LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", [&]()
|
||||
{
|
||||
groupMembersRequestCoro(cap_url, group_id, page_size, page_start, sort_column);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
|
||||
void LLGroupMgr::processCapGroupMembersResponse(const LLSD& response, U32 page_size, U32 page_start, const std::string& sort_column)
|
||||
{
|
||||
LLUUID group_id = response["group_id"].asUUID();
|
||||
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "', sort_column: '" << sort_column << "', page_size: " << page_size << ", page_start: " << page_start << LL_ENDL;
|
||||
|
||||
// Did we get anything in content?
|
||||
if(!content.size())
|
||||
if (!response.size())
|
||||
{
|
||||
LL_DEBUGS("GrpMgr") << "No group member data received." << LL_ENDL;
|
||||
LL_INFOS("GrpMgr") << "No group member data received." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LLUUID group_id = content["group_id"].asUUID();
|
||||
|
||||
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
|
||||
if(!group_datap)
|
||||
if (!group_datap)
|
||||
{
|
||||
LL_WARNS("GrpMgr") << "Received incorrect, possibly stale, group or request id" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// If we have no members, there's no reason to do anything else
|
||||
S32 num_members = content["member_count"];
|
||||
if (num_members < 1)
|
||||
{
|
||||
LL_INFOS("GrpMgr") << "Received empty group members list for group id: " << group_id.asString() << LL_ENDL;
|
||||
// Set mMemberDataComplete for correct handling of empty responses. See MAINT-5237
|
||||
group_datap->mMemberDataComplete = true;
|
||||
group_datap->mChanged = true;
|
||||
LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA);
|
||||
return;
|
||||
}
|
||||
LLSD members = response["members"];
|
||||
LLSD titles = response["titles"];
|
||||
LLSD defaults = response["defaults"];
|
||||
|
||||
group_datap->mMemberCount = num_members;
|
||||
|
||||
LLSD member_list = content["members"];
|
||||
LLSD titles = content["titles"];
|
||||
LLSD defaults = content["defaults"];
|
||||
|
||||
std::string online_status;
|
||||
std::string title;
|
||||
S32 contribution;
|
||||
U64 member_powers;
|
||||
// If this is changed to a bool, make sure to change the LLGroupMemberData constructor
|
||||
bool is_owner;
|
||||
size_t members_before = group_datap->mMembers.size();
|
||||
size_t members_loaded = members.size();
|
||||
|
||||
// Compute this once, rather than every time.
|
||||
U64 default_powers = llstrtou64(defaults["default_powers"].asString().c_str(), NULL, 16);
|
||||
std::string default_title = titles.size() ? titles[0].asString() : LLStringUtil::null;
|
||||
U64 default_powers = llstrtou64(defaults["default_powers"].asString().c_str(), NULL, 16);
|
||||
|
||||
LLSD::map_const_iterator member_iter_start = member_list.beginMap();
|
||||
LLSD::map_const_iterator member_iter_end = member_list.endMap();
|
||||
for( ; member_iter_start != member_iter_end; ++member_iter_start)
|
||||
auto members_end = members.endMap();
|
||||
for (auto it = members.beginMap(); it != members_end; ++it)
|
||||
{
|
||||
// Reset defaults
|
||||
online_status = "unknown";
|
||||
title = titles[0].asString();
|
||||
contribution = 0;
|
||||
member_powers = default_powers;
|
||||
is_owner = false;
|
||||
std::string online_status = "unknown";
|
||||
std::string title = default_title;
|
||||
U64 member_powers = default_powers;
|
||||
S32 donated_square_meters = 0;
|
||||
bool is_owner = false;
|
||||
|
||||
const LLUUID member_id(member_iter_start->first);
|
||||
LLSD member_info = member_iter_start->second;
|
||||
const LLUUID member_id(it->first);
|
||||
LLSD member_info = it->second;
|
||||
|
||||
if(member_info.has("last_login"))
|
||||
if (member_info.has("last_login"))
|
||||
{
|
||||
online_status = member_info["last_login"].asString();
|
||||
if(online_status == "Online")
|
||||
online_status = LLTrans::getString("group_member_status_online");
|
||||
else
|
||||
formatDateString(online_status);
|
||||
}
|
||||
|
||||
if(member_info.has("title"))
|
||||
title = titles[member_info["title"].asInteger()].asString();
|
||||
|
||||
if(member_info.has("powers"))
|
||||
member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16);
|
||||
|
||||
if(member_info.has("donated_square_meters"))
|
||||
contribution = member_info["donated_square_meters"];
|
||||
|
||||
if(member_info.has("owner"))
|
||||
is_owner = true;
|
||||
|
||||
LLGroupMemberData* data = new LLGroupMemberData(member_id,
|
||||
contribution,
|
||||
member_powers,
|
||||
title,
|
||||
online_status,
|
||||
is_owner);
|
||||
|
||||
LLGroupMemberData* member_old = group_datap->mMembers[member_id];
|
||||
if (member_old && group_datap->mRoleMemberDataComplete)
|
||||
{
|
||||
LLGroupMemberData::role_list_t::iterator rit = member_old->roleBegin();
|
||||
LLGroupMemberData::role_list_t::iterator end = member_old->roleEnd();
|
||||
|
||||
for ( ; rit != end; ++rit)
|
||||
if (online_status == "Online")
|
||||
{
|
||||
data->addRole((*rit).first,(*rit).second);
|
||||
online_status = LLTrans::getString("group_member_status_online");
|
||||
}
|
||||
else
|
||||
{
|
||||
formatDateString(online_status);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (member_info.has("title"))
|
||||
{
|
||||
group_datap->mRoleMemberDataComplete = false;
|
||||
title = titles[member_info["title"].asInteger()].asString();
|
||||
}
|
||||
|
||||
if (member_info.has("powers"))
|
||||
{
|
||||
member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16);
|
||||
}
|
||||
|
||||
if (member_info.has("donated_square_meters"))
|
||||
{
|
||||
donated_square_meters = member_info["donated_square_meters"];
|
||||
}
|
||||
|
||||
if (member_info.has("owner"))
|
||||
{
|
||||
is_owner = true;
|
||||
}
|
||||
|
||||
LLGroupMemberData* data = new LLGroupMemberData(member_id,
|
||||
donated_square_meters, member_powers, title, online_status, is_owner);
|
||||
|
||||
if (group_datap->mRoleMemberDataComplete)
|
||||
{
|
||||
if (LLGroupMemberData* member_old = group_datap->mMembers[member_id])
|
||||
{
|
||||
auto role_end = member_old->roleEnd();
|
||||
for (auto role_it = member_old->roleBegin(); role_it != role_end; ++role_it)
|
||||
{
|
||||
data->addRole(role_it->first, role_it->second);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
group_datap->mRoleMemberDataComplete = false;
|
||||
}
|
||||
}
|
||||
|
||||
group_datap->mMembers[member_id] = data;
|
||||
}
|
||||
|
||||
group_datap->mMemberCount = (S32)group_datap->mMembers.size();
|
||||
group_datap->mMemberDataComplete = true;
|
||||
group_datap->mMemberRequestID.setNull();
|
||||
group_datap->mMemberVersion.generate();
|
||||
|
||||
LL_INFOS("GrpMgr") << "members before: " << members_before
|
||||
<< ", members loaded: " << members_loaded
|
||||
<< ", members now: " << group_datap->mMemberCount << LL_ENDL;
|
||||
|
||||
// Technically, we have this data, but to prevent completely overhauling
|
||||
// this entire system (it would be nice, but I don't have the time),
|
||||
// I'm going to be dumb and just call services I most likely don't need
|
||||
|
|
@ -2342,12 +2348,16 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
|
|||
//
|
||||
// TODO:
|
||||
// Refactor to reduce multiple calls for data we already have.
|
||||
if(group_datap->mTitles.size() < 1)
|
||||
if (group_datap->mTitles.size() < 1)
|
||||
{
|
||||
sendGroupTitlesRequest(group_id);
|
||||
}
|
||||
|
||||
if (page_size && members_loaded >= page_size)
|
||||
{
|
||||
sendCapGroupMembersRequest(group_id, page_size, (U32)group_datap->mMemberCount, sort_column);
|
||||
}
|
||||
|
||||
group_datap->mMemberDataComplete = true;
|
||||
group_datap->mMemberRequestID.setNull();
|
||||
// Make the role-member data request
|
||||
if (group_datap->mPendingRoleMemberRequest || !group_datap->mRoleMemberDataComplete)
|
||||
{
|
||||
|
|
@ -2357,10 +2367,8 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
|
|||
|
||||
group_datap->mChanged = true;
|
||||
notifyObservers(GC_MEMBER_DATA);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
|
||||
{
|
||||
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
|
||||
|
|
@ -2379,9 +2387,11 @@ void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
|
|||
void LLGroupMgr::cancelGroupRoleChanges(const LLUUID& group_id)
|
||||
{
|
||||
LL_DEBUGS("GrpMgr") << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
|
||||
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
|
||||
|
||||
if (group_datap) group_datap->cancelRoleChanges();
|
||||
if (LLGroupMgrGroupData* group_datap = getGroupData(group_id))
|
||||
{
|
||||
group_datap->cancelRoleChanges();
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
@ -2503,5 +2513,3 @@ void LLGroupMgr::debugClearAllGroups(void*)
|
|||
LLGroupMgr::getInstance()->clearGroups();
|
||||
LLGroupMgr::parseRoleActions("role_actions.xml");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ public:
|
|||
bool mature_publish);
|
||||
|
||||
static void sendGroupMemberJoin(const LLUUID& group_id);
|
||||
static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs);
|
||||
static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID, LLUUID>& role_member_pairs);
|
||||
static void sendGroupMemberEjects(const LLUUID& group_id,
|
||||
uuid_vec_t& member_ids);
|
||||
|
||||
|
|
@ -413,7 +413,8 @@ public:
|
|||
const uuid_vec_t &ban_list = uuid_vec_t());
|
||||
|
||||
|
||||
void sendCapGroupMembersRequest(const LLUUID& group_id);
|
||||
void sendCapGroupMembersRequest(const LLUUID& group_id,
|
||||
U32 page_size = 0, U32 page_start = 0, const std::string& sort_column = LLStringUtil::null);
|
||||
|
||||
void cancelGroupRoleChanges(const LLUUID& group_id);
|
||||
|
||||
|
|
@ -436,16 +437,15 @@ public:
|
|||
void clearGroupData(const LLUUID& group_id);
|
||||
|
||||
private:
|
||||
void groupMembersRequestCoro(std::string url, LLUUID groupId);
|
||||
void processCapGroupMembersRequest(const LLSD& content);
|
||||
void groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, std::string sort_column);
|
||||
void processCapGroupMembersResponse(const LLSD& response, U32 page_size, U32 page_start, const std::string& sort_column);
|
||||
|
||||
void getGroupBanRequestCoro(std::string url, LLUUID groupId);
|
||||
void postGroupBanRequestCoro(std::string url, LLUUID groupId, U32 action, uuid_vec_t banList, bool update);
|
||||
void getGroupBanRequestCoro(std::string url, LLUUID group_id);
|
||||
void postGroupBanRequestCoro(std::string url, LLUUID group_id, U32 action, uuid_vec_t ban_list, bool update);
|
||||
|
||||
static void processGroupBanRequest(const LLSD& content);
|
||||
|
||||
void notifyObservers(LLGroupChange gc);
|
||||
void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
|
||||
void addGroup(LLGroupMgrGroupData* group_datap);
|
||||
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
|
||||
bool hasPendingPropertyRequest(const LLUUID& id);
|
||||
|
|
@ -465,7 +465,7 @@ private:
|
|||
typedef std::map<LLUUID,observer_set_t> observer_map_t;
|
||||
observer_map_t mParticularObservers;
|
||||
|
||||
bool mMemberRequestInFlight;
|
||||
bool mMemberRequestInFlight { false };
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -68,33 +68,36 @@ LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) :
|
|||
mAlreadyInGroup(),
|
||||
mConfirmedOwnerInvite(false),
|
||||
mListFullNotificationSent(false)
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
LLPanelGroupBulkImpl::~LLPanelGroupBulkImpl()
|
||||
{
|
||||
if(mAvatarNameCacheConnection.connected())
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
|
||||
{
|
||||
LLPanelGroupBulk* panelp = (LLPanelGroupBulk*)userdata;
|
||||
|
||||
if(panelp)
|
||||
if (LLPanelGroupBulk* panelp = (LLPanelGroupBulk*)userdata)
|
||||
{
|
||||
//Right now this is hard coded with some knowledge that it is part
|
||||
//of a floater since the avatar picker needs to be added as a dependent
|
||||
//floater to the parent floater.
|
||||
//Soon the avatar picker will be embedded into this panel
|
||||
//instead of being it's own separate floater. But that is next week.
|
||||
//This will do for now. -jwolk May 10, 2006
|
||||
// Right now this is hard coded with some knowledge that it is part
|
||||
// of a floater since the avatar picker needs to be added as a dependent
|
||||
// floater to the parent floater.
|
||||
// Soon the avatar picker will be embedded into this panel
|
||||
// instead of being it's own separate floater. But that is next week.
|
||||
// This will do for now. -jwolk May 10, 2006
|
||||
LLView* button = panelp->findChild<LLButton>("add_button");
|
||||
LLFloater* root_floater = gFloaterView->getParentFloater(panelp);
|
||||
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
|
||||
boost::bind(callbackAddUsers, _1, panelp->mImplementation), true, false, false, root_floater->getName(), button);
|
||||
if(picker)
|
||||
[&](const uuid_vec_t& agent_ids, const std::vector<LLAvatarName>&)
|
||||
{
|
||||
panelp->mImplementation->addUsers(agent_ids);
|
||||
}, true, false, false, root_floater->getName(), button);
|
||||
if (picker)
|
||||
{
|
||||
root_floater->addDependentFloater(picker);
|
||||
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(panelp->mImplementation->mGroupID);
|
||||
|
|
@ -102,70 +105,72 @@ void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelGroupBulkImpl::callbackClickRemove(void* userdata)
|
||||
{
|
||||
LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
|
||||
if (selfp)
|
||||
if (LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata)
|
||||
{
|
||||
selfp->handleRemove();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelGroupBulkImpl::callbackClickCancel(void* userdata)
|
||||
{
|
||||
LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
|
||||
if(selfp)
|
||||
if (LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata)
|
||||
{
|
||||
(*(selfp->mCloseCallback))(selfp->mCloseCallbackUserData);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelGroupBulkImpl::callbackSelect(LLUICtrl* ctrl, void* userdata)
|
||||
{
|
||||
LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
|
||||
if (selfp)
|
||||
if (LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata)
|
||||
{
|
||||
selfp->handleSelection();
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupBulkImpl::callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data)
|
||||
void LLPanelGroupBulkImpl::addUsers(const uuid_vec_t& agent_ids)
|
||||
{
|
||||
std::vector<std::string> names;
|
||||
for (S32 i = 0; i < (S32)agent_ids.size(); i++)
|
||||
for (const LLUUID& agent_id : agent_ids)
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
if (LLAvatarNameCache::get(agent_ids[i], &av_name))
|
||||
if (LLAvatarNameCache::get(agent_id, &av_name))
|
||||
{
|
||||
onAvatarNameCache(agent_ids[i], av_name, user_data);
|
||||
onAvatarNameCache(agent_id, av_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*) user_data;
|
||||
if (selfp)
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
if (selfp->mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
selfp->mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
// *TODO : Add a callback per avatar name being fetched.
|
||||
selfp->mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_ids[i],boost::bind(onAvatarNameCache, _1, _2, user_data));
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
// *TODO : Add a callback per avatar name being fetched.
|
||||
mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_id,
|
||||
[&](const LLUUID& agent_id, const LLAvatarName& av_name)
|
||||
{
|
||||
onAvatarNameCache(agent_id, av_name);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupBulkImpl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, void* user_data)
|
||||
void LLPanelGroupBulkImpl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
|
||||
{
|
||||
LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*) user_data;
|
||||
|
||||
if (selfp)
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
if (selfp->mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
selfp->mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
std::vector<std::string> names;
|
||||
uuid_vec_t agent_ids;
|
||||
agent_ids.push_back(agent_id);
|
||||
names.push_back(av_name.getCompleteName());
|
||||
|
||||
selfp->addUsers(names, agent_ids);
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
|
||||
std::vector<std::string> names;
|
||||
uuid_vec_t agent_ids;
|
||||
agent_ids.push_back(agent_id);
|
||||
names.push_back(av_name.getCompleteName());
|
||||
|
||||
addUsers(names, agent_ids);
|
||||
}
|
||||
|
||||
void LLPanelGroupBulkImpl::handleRemove()
|
||||
|
|
@ -174,17 +179,15 @@ void LLPanelGroupBulkImpl::handleRemove()
|
|||
if (selection.empty())
|
||||
return;
|
||||
|
||||
std::vector<LLScrollListItem*>::iterator iter;
|
||||
for(iter = selection.begin(); iter != selection.end(); ++iter)
|
||||
for (const LLScrollListItem* item : selection)
|
||||
{
|
||||
mInviteeIDs.erase((*iter)->getUUID());
|
||||
mInviteeIDs.erase(item->getUUID());
|
||||
}
|
||||
|
||||
mBulkAgentList->deleteSelectedItems();
|
||||
mRemoveButton->setEnabled(false);
|
||||
|
||||
if( mOKButton && mOKButton->getEnabled() &&
|
||||
mBulkAgentList->isEmpty())
|
||||
if (mOKButton && mOKButton->getEnabled() && mBulkAgentList->isEmpty())
|
||||
{
|
||||
mOKButton->setEnabled(false);
|
||||
}
|
||||
|
|
@ -192,24 +195,17 @@ void LLPanelGroupBulkImpl::handleRemove()
|
|||
|
||||
void LLPanelGroupBulkImpl::handleSelection()
|
||||
{
|
||||
std::vector<LLScrollListItem*> selection = mBulkAgentList->getAllSelected();
|
||||
if (selection.empty())
|
||||
mRemoveButton->setEnabled(false);
|
||||
else
|
||||
mRemoveButton->setEnabled(true);
|
||||
mRemoveButton->setEnabled(mBulkAgentList->getFirstSelected());
|
||||
}
|
||||
|
||||
void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const uuid_vec_t& agent_ids)
|
||||
{
|
||||
std::string name;
|
||||
LLUUID id;
|
||||
|
||||
if(mListFullNotificationSent)
|
||||
if (mListFullNotificationSent)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( !mListFullNotificationSent &&
|
||||
if (!mListFullNotificationSent &&
|
||||
(names.size() + mInviteeIDs.size() > MAX_GROUP_INVITES))
|
||||
{
|
||||
mListFullNotificationSent = true;
|
||||
|
|
@ -223,32 +219,35 @@ void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const
|
|||
|
||||
for (S32 i = 0; i < (S32)names.size(); ++i)
|
||||
{
|
||||
name = names[i];
|
||||
id = agent_ids[i];
|
||||
const LLUUID& id = agent_ids[i];
|
||||
|
||||
if(mInviteeIDs.find(id) != mInviteeIDs.end())
|
||||
if (mInviteeIDs.find(id) != mInviteeIDs.end())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//add the name to the names list
|
||||
// Add the name to the name list
|
||||
LLSD row;
|
||||
row["id"] = id;
|
||||
row["columns"][0]["value"] = name;
|
||||
row["columns"][0]["value"] = names[i];
|
||||
|
||||
mBulkAgentList->addElement(row);
|
||||
mInviteeIDs.insert(id);
|
||||
|
||||
// We've successfully added someone to the list.
|
||||
if(mOKButton && !mOKButton->getEnabled())
|
||||
if (mOKButton && !mOKButton->getEnabled())
|
||||
{
|
||||
mOKButton->setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupBulkImpl::setGroupName(std::string name)
|
||||
{
|
||||
if(mGroupName)
|
||||
if (mGroupName)
|
||||
{
|
||||
mGroupName->setText(name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -258,7 +257,8 @@ LLPanelGroupBulk::LLPanelGroupBulk(const LLUUID& group_id) :
|
|||
mPendingGroupPropertiesUpdate(false),
|
||||
mPendingRoleDataUpdate(false),
|
||||
mPendingMemberDataUpdate(false)
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
LLPanelGroupBulk::~LLPanelGroupBulk()
|
||||
{
|
||||
|
|
@ -269,11 +269,15 @@ void LLPanelGroupBulk::clear()
|
|||
{
|
||||
mImplementation->mInviteeIDs.clear();
|
||||
|
||||
if(mImplementation->mBulkAgentList)
|
||||
if (mImplementation->mBulkAgentList)
|
||||
{
|
||||
mImplementation->mBulkAgentList->deleteAllItems();
|
||||
}
|
||||
|
||||
if(mImplementation->mOKButton)
|
||||
if (mImplementation->mOKButton)
|
||||
{
|
||||
mImplementation->mOKButton->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelGroupBulk::update()
|
||||
|
|
@ -292,12 +296,14 @@ void LLPanelGroupBulk::updateGroupName()
|
|||
{
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
|
||||
|
||||
if( gdatap &&
|
||||
if (gdatap &&
|
||||
gdatap->isGroupPropertiesDataComplete())
|
||||
{
|
||||
// Only do work if the current group name differs
|
||||
if(mImplementation->mGroupName->getText().compare(gdatap->mName) != 0)
|
||||
if (mImplementation->mGroupName->getText().compare(gdatap->mName) != 0)
|
||||
{
|
||||
mImplementation->setGroupName(gdatap->mName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -308,43 +314,34 @@ void LLPanelGroupBulk::updateGroupName()
|
|||
void LLPanelGroupBulk::updateGroupData()
|
||||
{
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
|
||||
if(gdatap && gdatap->isGroupPropertiesDataComplete())
|
||||
if (gdatap && gdatap->isGroupPropertiesDataComplete())
|
||||
{
|
||||
mPendingGroupPropertiesUpdate = false;
|
||||
}
|
||||
else
|
||||
else if (!mPendingGroupPropertiesUpdate)
|
||||
{
|
||||
if(!mPendingGroupPropertiesUpdate)
|
||||
{
|
||||
mPendingGroupPropertiesUpdate = true;
|
||||
LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
|
||||
}
|
||||
mPendingGroupPropertiesUpdate = true;
|
||||
LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
|
||||
}
|
||||
|
||||
if(gdatap && gdatap->isRoleDataComplete())
|
||||
if (gdatap && gdatap->isRoleDataComplete())
|
||||
{
|
||||
mPendingRoleDataUpdate = false;
|
||||
}
|
||||
else
|
||||
else if (!mPendingRoleDataUpdate)
|
||||
{
|
||||
if(!mPendingRoleDataUpdate)
|
||||
{
|
||||
mPendingRoleDataUpdate = true;
|
||||
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
|
||||
}
|
||||
mPendingRoleDataUpdate = true;
|
||||
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
|
||||
}
|
||||
|
||||
if(gdatap && gdatap->isMemberDataComplete())
|
||||
if (gdatap && gdatap->isMemberDataComplete())
|
||||
{
|
||||
mPendingMemberDataUpdate = false;
|
||||
}
|
||||
else
|
||||
else if (!mPendingMemberDataUpdate)
|
||||
{
|
||||
if(!mPendingMemberDataUpdate)
|
||||
{
|
||||
mPendingMemberDataUpdate = true;
|
||||
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
|
||||
}
|
||||
mPendingMemberDataUpdate = true;
|
||||
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -367,21 +364,20 @@ void LLPanelGroupBulk::setCloseCallback(void (*close_callback)(void*), void* dat
|
|||
void LLPanelGroupBulk::addUsers(uuid_vec_t& agent_ids)
|
||||
{
|
||||
std::vector<std::string> names;
|
||||
for (S32 i = 0; i < (S32)agent_ids.size(); i++)
|
||||
for (size_t i = 0; i < agent_ids.size(); i++)
|
||||
{
|
||||
std::string fullname;
|
||||
LLUUID agent_id = agent_ids[i];
|
||||
const LLUUID& agent_id = agent_ids[i];
|
||||
LLViewerObject* dest = gObjectList.findObject(agent_id);
|
||||
if(dest && dest->isAvatar())
|
||||
if (dest && dest->isAvatar())
|
||||
{
|
||||
LLNameValue* nvfirst = dest->getNVPair("FirstName");
|
||||
LLNameValue* nvlast = dest->getNVPair("LastName");
|
||||
if(nvfirst && nvlast)
|
||||
if (nvfirst && nvlast)
|
||||
{
|
||||
fullname = LLCacheName::buildFullName(
|
||||
nvfirst->getString(), nvlast->getString());
|
||||
|
||||
fullname = LLCacheName::buildFullName(nvfirst->getString(), nvlast->getString());
|
||||
}
|
||||
|
||||
if (!fullname.empty())
|
||||
{
|
||||
names.push_back(fullname);
|
||||
|
|
@ -394,20 +390,25 @@ void LLPanelGroupBulk::addUsers(uuid_vec_t& agent_ids)
|
|||
}
|
||||
else
|
||||
{
|
||||
//looks like user try to invite offline friend
|
||||
//for offline avatar_id gObjectList.findObject() will return null
|
||||
//so we need to do this additional search in avatar tracker, see EXT-4732
|
||||
// Looks like the user tries to invite a friend which is offline.
|
||||
// For offline avatar_id gObjectList.findObject() will return null
|
||||
// so we need to do this additional search in avatar tracker, see EXT-4732
|
||||
if (LLAvatarTracker::instance().isBuddy(agent_id))
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
if (!LLAvatarNameCache::get(agent_id, &av_name))
|
||||
{
|
||||
// actually it should happen, just in case
|
||||
LLAvatarNameCache::get(LLUUID(agent_id), boost::bind(&LLPanelGroupBulk::addUserCallback, this, _1, _2));
|
||||
// Actually it shouldn't happen, just in case
|
||||
LLAvatarNameCache::get(LLUUID(agent_id),
|
||||
[&](const LLUUID& agent_id, const LLAvatarName& av_name)
|
||||
{
|
||||
addUserCallback(agent_id, av_name);
|
||||
});
|
||||
// for this special case!
|
||||
//when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
|
||||
// when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
|
||||
// removed id will be added in callback
|
||||
agent_ids.erase(agent_ids.begin() + i);
|
||||
i--; // To process the next agent_id with the same index
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -50,9 +50,10 @@ public:
|
|||
static void callbackClickCancel(void* userdata);
|
||||
|
||||
static void callbackSelect(LLUICtrl* ctrl, void* userdata);
|
||||
static void callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data);
|
||||
|
||||
static void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, void* user_data);
|
||||
void addUsers(const uuid_vec_t& agent_ids);
|
||||
|
||||
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
|
||||
|
||||
void handleRemove();
|
||||
void handleSelection();
|
||||
|
|
|
|||
|
|
@ -812,20 +812,14 @@ bool LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
|
|||
{
|
||||
LLPanelGroupSubTab::postBuildSubTab(root);
|
||||
|
||||
// Upcast parent so we can ask it for sibling controls.
|
||||
LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
|
||||
|
||||
// Look recursively from the parent to find all our widgets.
|
||||
bool recurse = true;
|
||||
mHeader = parent->findChild<LLPanel>("members_header", recurse);
|
||||
mFooter = parent->findChild<LLPanel>("members_footer", recurse);
|
||||
mHeader = root->findChild<LLPanel>("members_header");
|
||||
mFooter = root->findChild<LLPanel>("members_footer");
|
||||
|
||||
mMembersList = parent->getChild<LLNameListCtrl>("member_list", recurse);
|
||||
mAssignedRolesList = parent->getChild<LLScrollListCtrl>("member_assigned_roles", recurse);
|
||||
mAllowedActionsList = parent->getChild<LLScrollListCtrl>("member_allowed_actions", recurse);
|
||||
mActionDescription = parent->getChild<LLTextEditor>("member_action_description", recurse);
|
||||
|
||||
if (!mMembersList || !mAssignedRolesList || !mAllowedActionsList || !mActionDescription) return false;
|
||||
mMembersList = root->getChild<LLNameListCtrl>("member_list");
|
||||
mAssignedRolesList = root->getChild<LLScrollListCtrl>("member_assigned_roles");
|
||||
mAllowedActionsList = root->getChild<LLScrollListCtrl>("member_allowed_actions");
|
||||
mActionDescription = root->getChild<LLTextEditor>("member_action_description");
|
||||
|
||||
mAllowedActionsList->setCommitOnSelectionChange(true);
|
||||
mAllowedActionsList->setCommitCallback(boost::bind(&LLPanelGroupMembersSubTab::updateActionDescription, this));
|
||||
|
|
@ -844,31 +838,22 @@ bool LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
|
|||
row["columns"][2]["column"] = "online";
|
||||
mMembersList->addElement(row);
|
||||
std::string order_by = gSavedSettings.getString("GroupMembersSortOrder");
|
||||
if(!order_by.empty())
|
||||
if (!order_by.empty())
|
||||
{
|
||||
mMembersList->sortByColumn(order_by, true);
|
||||
}
|
||||
|
||||
LLButton* button = parent->getChild<LLButton>("member_invite", recurse);
|
||||
if ( button )
|
||||
{
|
||||
button->setClickedCallback(onInviteMember, this);
|
||||
button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
|
||||
}
|
||||
LLButton* button = root->getChild<LLButton>("member_invite");
|
||||
button->setClickedCallback(onInviteMember, this);
|
||||
button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
|
||||
|
||||
mEjectBtn = parent->getChild<LLButton>("member_eject", recurse);
|
||||
if ( mEjectBtn )
|
||||
{
|
||||
mEjectBtn->setClickedCallback(onEjectMembers, this);
|
||||
mEjectBtn->setEnabled(false);
|
||||
}
|
||||
mEjectBtn = root->getChild<LLButton>("member_eject");
|
||||
mEjectBtn->setClickedCallback(onEjectMembers, this);
|
||||
mEjectBtn->setEnabled(false);
|
||||
|
||||
mBanBtn = parent->getChild<LLButton>("member_ban", recurse);
|
||||
if(mBanBtn)
|
||||
{
|
||||
mBanBtn->setClickedCallback(onBanMember, this);
|
||||
mBanBtn->setEnabled(false);
|
||||
}
|
||||
mBanBtn = root->getChild<LLButton>("member_ban");
|
||||
mBanBtn->setClickedCallback(onBanMember, this);
|
||||
mBanBtn->setEnabled(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1371,11 +1356,13 @@ void LLPanelGroupMembersSubTab::activate()
|
|||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
|
||||
LLPanelGroupSubTab::activate();
|
||||
if(!mActivated)
|
||||
if (!mActivated)
|
||||
{
|
||||
if (!gdatap || !gdatap->isMemberDataComplete())
|
||||
{
|
||||
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
|
||||
const U32 page_size = 50;
|
||||
std::string sort_column = mMembersList->getSortColumnName();
|
||||
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID, page_size, 0, sort_column);
|
||||
}
|
||||
|
||||
if (!gdatap || !gdatap->isRoleMemberDataComplete())
|
||||
|
|
@ -1483,8 +1470,7 @@ bool LLPanelGroupMembersSubTab::addOwnerCB(const LLSD& notification, const LLSD&
|
|||
|
||||
void LLPanelGroupMembersSubTab::applyMemberChanges()
|
||||
{
|
||||
//sucks to do a find again here, but it is in constant time, so, could
|
||||
//be worse
|
||||
// Sucks to do a find again here, but it is in constant time, so, could be worse
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
if (!gdatap)
|
||||
{
|
||||
|
|
@ -1492,8 +1478,7 @@ void LLPanelGroupMembersSubTab::applyMemberChanges()
|
|||
return;
|
||||
}
|
||||
|
||||
//we need to add all of the changed roles data
|
||||
//for each member whose role changed
|
||||
// We need to add all of the changed roles data for each member whose role changed
|
||||
for (member_role_changes_map_t::iterator member = mMemberRoleChangeData.begin();
|
||||
member != mMemberRoleChangeData.end(); ++member)
|
||||
{
|
||||
|
|
@ -1511,7 +1496,7 @@ void LLPanelGroupMembersSubTab::applyMemberChanges()
|
|||
mMemberRoleChangeData.clear();
|
||||
|
||||
LLGroupMgr::getInstance()->sendGroupRoleMemberChanges(mGroupID);
|
||||
//force a UI update
|
||||
// Force an UI update
|
||||
handleMemberSelect();
|
||||
|
||||
mChanged = false;
|
||||
|
|
@ -1522,32 +1507,23 @@ void LLPanelGroupMembersSubTab::applyMemberChanges()
|
|||
bool LLPanelGroupMembersSubTab::matchesSearchFilter(const std::string& fullname)
|
||||
{
|
||||
// If the search filter is empty, everything passes.
|
||||
if (mSearchFilter.empty()) return true;
|
||||
if (mSearchFilter.empty())
|
||||
return true;
|
||||
|
||||
// Create a full name, and compare it to the search filter.
|
||||
std::string fullname_lc(fullname);
|
||||
LLStringUtil::toLower(fullname_lc);
|
||||
|
||||
std::string::size_type match = fullname_lc.find(mSearchFilter);
|
||||
|
||||
if (std::string::npos == match)
|
||||
{
|
||||
// not found
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return match != std::string::npos;
|
||||
}
|
||||
|
||||
U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& agent_id)
|
||||
{
|
||||
//we loop over all of the changes
|
||||
//if we are adding a role, then we simply add the role's powers
|
||||
//if we are removing a role, we store that role id away
|
||||
//and then we have to build the powers up bases on the roles the agent
|
||||
//is in
|
||||
// We loop over all of the changes
|
||||
// If we are adding a role, then we simply add the role's powers
|
||||
// If we are removing a role, we store that role id away
|
||||
// and then we have to build the powers up bases on the roles the agent is in
|
||||
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
if (!gdatap)
|
||||
|
|
@ -1557,7 +1533,7 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
|
|||
}
|
||||
|
||||
LLGroupMgrGroupData::member_list_t::iterator iter = gdatap->mMembers.find(agent_id);
|
||||
if ( iter == gdatap->mMembers.end() )
|
||||
if (iter == gdatap->mMembers.end())
|
||||
{
|
||||
LL_WARNS() << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- No member data for member with UUID " << agent_id << LL_ENDL;
|
||||
return GP_NO_POWERS;
|
||||
|
|
@ -1570,37 +1546,36 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
|
|||
return GP_NO_POWERS;
|
||||
}
|
||||
|
||||
//see if there are unsaved role changes for this agent
|
||||
// See if there are unsaved role changes for this agent
|
||||
role_change_data_map_t* role_change_datap = NULL;
|
||||
member_role_changes_map_t::iterator member = mMemberRoleChangeData.find(agent_id);
|
||||
if ( member != mMemberRoleChangeData.end() )
|
||||
if (member != mMemberRoleChangeData.end())
|
||||
{
|
||||
//this member has unsaved role changes
|
||||
//so grab them
|
||||
role_change_datap = (*member).second;
|
||||
// This member has unsaved role changes
|
||||
// so grab them
|
||||
role_change_datap = member->second;
|
||||
}
|
||||
|
||||
U64 new_powers = GP_NO_POWERS;
|
||||
|
||||
if ( role_change_datap )
|
||||
if (role_change_datap)
|
||||
{
|
||||
uuid_vec_t roles_to_be_removed;
|
||||
|
||||
for (role_change_data_map_t::iterator role = role_change_datap->begin();
|
||||
role != role_change_datap->end(); ++ role)
|
||||
for (const auto& role : *role_change_datap)
|
||||
{
|
||||
if ( role->second == RMC_ADD )
|
||||
if (role.second == RMC_ADD)
|
||||
{
|
||||
new_powers |= gdatap->getRolePowers(role->first);
|
||||
new_powers |= gdatap->getRolePowers(role.first);
|
||||
}
|
||||
else
|
||||
{
|
||||
roles_to_be_removed.push_back(role->first);
|
||||
roles_to_be_removed.push_back(role.first);
|
||||
}
|
||||
}
|
||||
|
||||
//loop over the member's current roles, summing up
|
||||
//the powers (not including the role we are removing)
|
||||
// loop over the member's current roles, summing up
|
||||
// the powers (not including the role we are removing)
|
||||
for (LLGroupMemberData::role_list_t::iterator current_role = member_data->roleBegin();
|
||||
current_role != member_data->roleEnd(); ++current_role)
|
||||
{
|
||||
|
|
@ -1661,9 +1636,10 @@ void LLPanelGroupMembersSubTab::draw()
|
|||
|
||||
void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
|
||||
{
|
||||
if (mGroupID.isNull()) return;
|
||||
if (mGroupID.isNull())
|
||||
return;
|
||||
|
||||
if ( GC_TITLES == gc || GC_PROPERTIES == gc )
|
||||
if (GC_TITLES == gc || GC_PROPERTIES == gc)
|
||||
{
|
||||
// Don't care about title or general group properties updates.
|
||||
return;
|
||||
|
|
@ -1677,9 +1653,9 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
|
|||
}
|
||||
|
||||
// Wait for both all data to be retrieved before displaying anything.
|
||||
if ( gdatap->isMemberDataComplete()
|
||||
&& gdatap->isRoleDataComplete()
|
||||
&& gdatap->isRoleMemberDataComplete())
|
||||
if (gdatap->isMemberDataComplete() &&
|
||||
gdatap->isRoleDataComplete() &&
|
||||
gdatap->isRoleMemberDataComplete())
|
||||
{
|
||||
mMemberProgress = gdatap->mMembers.begin();
|
||||
mPendingMemberUpdate = true;
|
||||
|
|
@ -1690,18 +1666,18 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
|
|||
// Build a string with info on retrieval progress.
|
||||
std::ostringstream retrieved;
|
||||
|
||||
if ( gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && !gdatap->mMembers.size() )
|
||||
if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && !gdatap->mMembers.size())
|
||||
{
|
||||
// MAINT-5237
|
||||
retrieved << "Member list not available.";
|
||||
}
|
||||
else if ( !gdatap->isMemberDataComplete() )
|
||||
else if (!gdatap->isMemberDataComplete())
|
||||
{
|
||||
// Still busy retreiving member list.
|
||||
retrieved << "Retrieving member list (" << gdatap->mMembers.size()
|
||||
<< " / " << gdatap->mMemberCount << ")...";
|
||||
}
|
||||
else if( !gdatap->isRoleDataComplete() )
|
||||
else if (!gdatap->isRoleDataComplete())
|
||||
{
|
||||
// Still busy retreiving role list.
|
||||
retrieved << "Retrieving role list (" << gdatap->mRoles.size()
|
||||
|
|
@ -1719,7 +1695,9 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
|
|||
|
||||
void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data)
|
||||
{
|
||||
if (!data) return;
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
LLUIString donated = getString("donation_area");
|
||||
donated.setArg("[AREA]", llformat("%d", data->getContribution()));
|
||||
|
||||
|
|
@ -1765,7 +1743,7 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemb
|
|||
if (matchesSearchFilter(av_name.getAccountName()))
|
||||
{
|
||||
addMemberToList(member);
|
||||
if(!mMembersList->getEnabled())
|
||||
if (!mMembersList->getEnabled())
|
||||
{
|
||||
mMembersList->setEnabled(true);
|
||||
}
|
||||
|
|
@ -1788,15 +1766,15 @@ void LLPanelGroupMembersSubTab::updateMembers()
|
|||
|
||||
// Make sure all data is still complete. Incomplete data
|
||||
// may occur if we refresh.
|
||||
if ( !gdatap->isMemberDataComplete()
|
||||
|| !gdatap->isRoleDataComplete()
|
||||
|| !gdatap->isRoleMemberDataComplete())
|
||||
if (!gdatap->isMemberDataComplete() ||
|
||||
!gdatap->isRoleDataComplete() ||
|
||||
!gdatap->isRoleMemberDataComplete())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//cleanup list only for first iteration
|
||||
if(mMemberProgress == gdatap->mMembers.begin())
|
||||
// Cleanup list only for first iteration
|
||||
if (mMemberProgress == gdatap->mMembers.begin())
|
||||
{
|
||||
mMembersList->deleteAllItems();
|
||||
}
|
||||
|
|
@ -1806,7 +1784,7 @@ void LLPanelGroupMembersSubTab::updateMembers()
|
|||
LLTimer update_time;
|
||||
update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
|
||||
|
||||
for( ; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
|
||||
for (; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
|
||||
{
|
||||
if (!mMemberProgress->second)
|
||||
continue;
|
||||
|
|
@ -1866,7 +1844,8 @@ void LLPanelGroupMembersSubTab::onBanMember(void* user_data)
|
|||
void LLPanelGroupMembersSubTab::confirmBanMembers()
|
||||
{
|
||||
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
|
||||
if (selection.empty()) return;
|
||||
if (selection.empty())
|
||||
return;
|
||||
|
||||
auto selection_count = selection.size();
|
||||
if (selection_count == 1)
|
||||
|
|
@ -1912,8 +1891,7 @@ void LLPanelGroupMembersSubTab::updateActionDescription()
|
|||
return;
|
||||
}
|
||||
|
||||
LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata();
|
||||
if (rap)
|
||||
if (LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata())
|
||||
{
|
||||
std::string desc = rap->mLongDescription.empty() ? rap->mDescription : rap->mLongDescription;
|
||||
mActionDescription->setText(desc);
|
||||
|
|
@ -1923,23 +1901,22 @@ void LLPanelGroupMembersSubTab::updateActionDescription()
|
|||
void LLPanelGroupMembersSubTab::handleBanMember()
|
||||
{
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
if(!gdatap)
|
||||
if (!gdatap)
|
||||
{
|
||||
LL_WARNS("Groups") << "Unable to get group data for group " << mGroupID << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
|
||||
if(selection.empty())
|
||||
if (selection.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uuid_vec_t ban_ids;
|
||||
std::vector<LLScrollListItem*>::iterator itor;
|
||||
for(itor = selection.begin(); itor != selection.end(); ++itor)
|
||||
for (const LLScrollListItem* item : selection)
|
||||
{
|
||||
LLUUID ban_id = (*itor)->getUUID();
|
||||
LLUUID ban_id = item->getUUID();
|
||||
ban_ids.push_back(ban_id);
|
||||
|
||||
LLGroupBanData ban_data;
|
||||
|
|
@ -1983,54 +1960,33 @@ bool LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
|
|||
LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
|
||||
|
||||
// Look recursively from the parent to find all our widgets.
|
||||
bool recurse = true;
|
||||
mHeader = parent->findChild<LLPanel>("roles_header", recurse);
|
||||
mFooter = parent->findChild<LLPanel>("roles_footer", recurse);
|
||||
mHeader = parent->findChild<LLPanel>("roles_header");
|
||||
mFooter = parent->findChild<LLPanel>("roles_footer");
|
||||
|
||||
mRolesList = parent->getChild<LLScrollListCtrl>("role_list");
|
||||
mAssignedMembersList = parent->getChild<LLNameListCtrl>("role_assigned_members");
|
||||
mAllowedActionsList = parent->getChild<LLScrollListCtrl>("role_allowed_actions");
|
||||
mActionDescription = parent->getChild<LLTextEditor>("role_action_description");
|
||||
|
||||
mRolesList = parent->getChild<LLScrollListCtrl>("role_list", recurse);
|
||||
mAssignedMembersList = parent->getChild<LLNameListCtrl>("role_assigned_members", recurse);
|
||||
mAllowedActionsList = parent->getChild<LLScrollListCtrl>("role_allowed_actions", recurse);
|
||||
mActionDescription = parent->getChild<LLTextEditor>("role_action_description", recurse);
|
||||
mRoleName = parent->getChild<LLLineEditor>("role_name");
|
||||
mRoleTitle = parent->getChild<LLLineEditor>("role_title");
|
||||
mRoleDescription = parent->getChild<LLTextEditor>("role_description");
|
||||
|
||||
mRoleName = parent->getChild<LLLineEditor>("role_name", recurse);
|
||||
mRoleTitle = parent->getChild<LLLineEditor>("role_title", recurse);
|
||||
mRoleDescription = parent->getChild<LLTextEditor>("role_description", recurse);
|
||||
|
||||
mMemberVisibleCheck = parent->getChild<LLCheckBoxCtrl>("role_visible_in_list", recurse);
|
||||
|
||||
if (!mRolesList || !mAssignedMembersList || !mAllowedActionsList || !mActionDescription
|
||||
|| !mRoleName || !mRoleTitle || !mRoleDescription || !mMemberVisibleCheck)
|
||||
{
|
||||
LL_WARNS() << "ARG! element not found." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
mMemberVisibleCheck = parent->getChild<LLCheckBoxCtrl>("role_visible_in_list");
|
||||
|
||||
mRemoveEveryoneTxt = getString("cant_delete_role");
|
||||
|
||||
mCreateRoleButton =
|
||||
parent->getChild<LLButton>("role_create", recurse);
|
||||
if ( mCreateRoleButton )
|
||||
{
|
||||
mCreateRoleButton->setClickedCallback(onCreateRole, this);
|
||||
mCreateRoleButton->setEnabled(false);
|
||||
}
|
||||
mCreateRoleButton = parent->getChild<LLButton>("role_create");
|
||||
mCreateRoleButton->setClickedCallback(onCreateRole, this);
|
||||
mCreateRoleButton->setEnabled(false);
|
||||
|
||||
mCopyRoleButton =
|
||||
parent->getChild<LLButton>("role_copy", recurse);
|
||||
if ( mCopyRoleButton )
|
||||
{
|
||||
mCopyRoleButton->setClickedCallback(onCopyRole, this);
|
||||
mCopyRoleButton->setEnabled(false);
|
||||
}
|
||||
mCopyRoleButton = parent->getChild<LLButton>("role_copy");
|
||||
mCopyRoleButton->setClickedCallback(onCopyRole, this);
|
||||
mCopyRoleButton->setEnabled(false);
|
||||
|
||||
mDeleteRoleButton =
|
||||
parent->getChild<LLButton>("role_delete", recurse);
|
||||
if ( mDeleteRoleButton )
|
||||
{
|
||||
mDeleteRoleButton->setClickedCallback(onDeleteRole, this);
|
||||
mDeleteRoleButton->setEnabled(false);
|
||||
}
|
||||
mDeleteRoleButton = parent->getChild<LLButton>("role_delete");
|
||||
mDeleteRoleButton->setClickedCallback(onDeleteRole, this);
|
||||
mDeleteRoleButton->setEnabled(false);
|
||||
|
||||
mRolesList->setCommitOnSelectionChange(true);
|
||||
mRolesList->setCommitCallback(onRoleSelect, this);
|
||||
|
|
@ -2949,26 +2905,19 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
|
|||
mActionMembers->deleteAllItems();
|
||||
mActionRoles->deleteAllItems();
|
||||
|
||||
std::vector<LLScrollListItem*> selection = mActionList->getAllSelected();
|
||||
if (selection.empty())
|
||||
return;
|
||||
|
||||
U64 power_mask = GP_NO_POWERS;
|
||||
std::vector<LLScrollListItem*> selection =
|
||||
mActionList->getAllSelected();
|
||||
if (selection.empty()) return;
|
||||
|
||||
LLRoleAction* rap;
|
||||
|
||||
std::vector<LLScrollListItem*>::iterator itor;
|
||||
for (itor = selection.begin() ;
|
||||
itor != selection.end(); ++itor)
|
||||
for (const LLScrollListItem* item : selection)
|
||||
{
|
||||
rap = (LLRoleAction*)( (*itor)->getUserdata() );
|
||||
power_mask |= rap->mPowerBit;
|
||||
power_mask |= ((LLRoleAction*)item->getUserdata())->mPowerBit;
|
||||
}
|
||||
|
||||
if (selection.size() == 1)
|
||||
{
|
||||
LLScrollListItem* item = selection[0];
|
||||
rap = (LLRoleAction*)(item->getUserdata());
|
||||
|
||||
LLRoleAction* rap = (LLRoleAction*)selection.front()->getUserdata();
|
||||
if (rap->mLongDescription.empty())
|
||||
{
|
||||
mActionDescription->setText(rap->mDescription);
|
||||
|
|
@ -2985,21 +2934,19 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
|
|||
|
||||
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
|
||||
|
||||
if (!gdatap) return;
|
||||
if (!gdatap)
|
||||
return;
|
||||
|
||||
if (gdatap->isMemberDataComplete())
|
||||
{
|
||||
LLGroupMgrGroupData::member_list_t::iterator it = gdatap->mMembers.begin();
|
||||
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
|
||||
LLGroupMemberData* gmd;
|
||||
|
||||
for ( ; it != end; ++it)
|
||||
for (const auto& it : gdatap->mMembers)
|
||||
{
|
||||
gmd = (*it).second;
|
||||
if (!gmd) continue;
|
||||
if ((gmd->getAgentPowers() & power_mask) == power_mask)
|
||||
if (LLGroupMemberData* gmd = it.second)
|
||||
{
|
||||
mActionMembers->addNameItem(gmd->getID());
|
||||
if ((gmd->getAgentPowers() & power_mask) == power_mask)
|
||||
{
|
||||
mActionMembers->addNameItem(gmd->getID());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue