From 4945ae17d3692f089ce6c996f6585a5e5b308e4d Mon Sep 17 00:00:00 2001 From: Baker Linden Date: Thu, 29 Aug 2013 11:36:45 -0700 Subject: Initial commit for GroupBan - Lots of crap isn't working as intended yet. --- indra/newview/llgroupmgr.cpp | 172 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 153 insertions(+), 19 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index cbd844cdac..0d4b678019 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -231,11 +231,13 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) : mMemberCount(0), mRoleCount(0), mReceivedRoleMemberPairs(0), - mMemberDataComplete(FALSE), - mRoleDataComplete(FALSE), - mRoleMemberDataComplete(FALSE), - mGroupPropertiesDataComplete(FALSE), - mPendingRoleMemberRequest(FALSE), + mMemberDataComplete(false), + mRoleDataComplete(false), + mRoleMemberDataComplete(false), + mGroupPropertiesDataComplete(false), + mGroupBanStatus(STATUS_INIT), + mGroupBanDataComplete(false), + mPendingRoleMemberRequest(false), mAccessTime(0.0f) { mMemberVersion.generate(); @@ -424,7 +426,7 @@ void LLGroupMgrGroupData::removeMemberData() delete mi->second; } mMembers.clear(); - mMemberDataComplete = FALSE; + mMemberDataComplete = false; mMemberVersion.generate(); } @@ -446,8 +448,8 @@ void LLGroupMgrGroupData::removeRoleData() } mRoles.clear(); mReceivedRoleMemberPairs = 0; - mRoleDataComplete = FALSE; - mRoleMemberDataComplete = FALSE; + mRoleDataComplete = false; + mRoleMemberDataComplete= false; } void LLGroupMgrGroupData::removeRoleMemberData() @@ -471,7 +473,7 @@ void LLGroupMgrGroupData::removeRoleMemberData() } mReceivedRoleMemberPairs = 0; - mRoleMemberDataComplete = FALSE; + mRoleMemberDataComplete= false; } LLGroupMgrGroupData::~LLGroupMgrGroupData() @@ -742,6 +744,22 @@ void LLGroupMgrGroupData::cancelRoleChanges() // Clear out all changes! mRoleChanges.clear(); } + +void LLGroupMgrGroupData::createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data) +{ + mBanList[ban_id] = ban_data; +} + +bool LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id) +{ + // Once we get this hooked up to the backend, we want to confirm the create or delete worked. + mBanList.erase(ban_id); + return true; +} + + + + // // LLGroupMgr // @@ -951,12 +969,12 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data) if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount) { - group_datap->mMemberDataComplete = TRUE; + group_datap->mMemberDataComplete = true; group_datap->mMemberRequestID.setNull(); // We don't want to make role-member data requests until we have all the members if (group_datap->mPendingRoleMemberRequest) { - group_datap->mPendingRoleMemberRequest = FALSE; + group_datap->mPendingRoleMemberRequest = false; LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_datap->mID); } } @@ -1026,7 +1044,7 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data) group_datap->mMemberCount = num_group_members; group_datap->mRoleCount = num_group_roles + 1; // Add the everyone role. - group_datap->mGroupPropertiesDataComplete = TRUE; + group_datap->mGroupPropertiesDataComplete = true; group_datap->mChanged = TRUE; LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES); @@ -1103,12 +1121,12 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data) if (group_datap->mRoles.size() == (U32)group_datap->mRoleCount) { - group_datap->mRoleDataComplete = TRUE; + group_datap->mRoleDataComplete = true; group_datap->mRoleDataRequestID.setNull(); // We don't want to make role-member data requests until we have all the role data if (group_datap->mPendingRoleMemberRequest) { - group_datap->mPendingRoleMemberRequest = FALSE; + group_datap->mPendingRoleMemberRequest = false; LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_datap->mID); } } @@ -1217,7 +1235,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data) } } - group_datap->mRoleMemberDataComplete = TRUE; + group_datap->mRoleMemberDataComplete= true; group_datap->mRoleMembersRequestID.setNull(); } @@ -1543,7 +1561,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id) llinfos << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N") << " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N") << " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << llendl; - group_datap->mPendingRoleMemberRequest = TRUE; + group_datap->mPendingRoleMemberRequest = true; return; } @@ -1840,6 +1858,122 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, } +// Responder class for capability group management +class GroupBanDataResponder : public LLHTTPClient::Responder +{ +public: + GroupBanDataResponder() {} + virtual ~GroupBanDataResponder() {} + virtual void result(const LLSD& pContent); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); +}; + +void GroupBanDataResponder::errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent) +{ + LL_WARNS("GrpMgr") << "Error receiving group member data [status:" + << pStatus << "]: " << pContent << LL_ENDL; +} + +void GroupBanDataResponder::result(const LLSD& content) +{ + LL_INFOS("GrpMgr") << "[BAKER] Received ban data!" << LL_ENDL; + LLGroupMgr::processGroupBanRequest(content); +} + +void LLGroupMgr::sendGroupBanRequest(EBanRequestType request_type, const LLUUID& group_id, const std::vector ban_list /* = std::vector() */) +{ + LLViewerRegion* currentRegion = gAgent.getRegion(); + 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()) + { + LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL; + return; + } + + // Get our capability + std::string cap_url = currentRegion->getCapability("GroupBan"); + if(cap_url.empty()) + { + return; + } + + LLHTTPClient::ResponderPtr grp_ban_responder = new GroupBanDataResponder(); + // PUT to our service. Add a body containing the group_id and list of agents to ban. + LLSD ban_ids = LLSD::emptyMap(); + ban_ids["group_id"] = group_id; + // Add our list of potential banned agents to the list + ban_ids["ban_ids"] = LLSD::emptyArray(); + LLSD ban_entry; + std::vector::const_iterator iter = ban_list.cbegin(); + for(;iter != ban_list.end(); ++iter) + { + ban_entry = (*iter); + ban_ids["ban_ids"].append(ban_entry); + } + + switch(request_type) + { + case REQUEST_GET: + cap_url += "?group_id=" + group_id.asString(); + LLHTTPClient::get(cap_url, grp_ban_responder); + break; + case REQUEST_PUT: + // BAKER TODO: Figure out which 'body' is correct. + LLHTTPClient::put(cap_url, ban_ids, grp_ban_responder, LLSD(), 60); + break; + case REQUEST_DEL: + LLHTTPClient::del(cap_url, grp_ban_responder, ban_ids, 60); + break; + } + + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id); + if (gdatap) + gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); +} + + +void LLGroupMgr::processGroupBanRequest(const LLSD& content) +{ + // Did we get anything in content? + if(!content.size()) + { + LL_DEBUGS("GrpMgr") << "No group member data received." << LL_ENDL; + return; + } + + LLUUID group_id = content["group_id"].asUUID(); + + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id); + if (!gdatap) + return; + + LLSD banlist = LLSD::emptyMap(); + + + LLSD::map_const_iterator i = content["ban_list"].beginMap(); + LLSD::map_const_iterator iEnd = content["ban_list"].endMap(); + for(;i != iEnd; ++i) + { + const LLUUID ban_id(i->first); + // We have nothing right now inside our banlist map. + // Once ban_date is implemented, set that here! + // + gdatap->createBanEntry(ban_id, LLGroupBanData()); + } + + gdatap->mChanged = TRUE; + gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_COMPLETE); + LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST); +} + + + // Responder class for capability group management class GroupMemberDataResponder : public LLHTTPClient::Responder { @@ -1925,7 +2059,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) if(num_members < 1) return; - LLUUID group_id = content["group_id"].asUUID(); + LLUUID group_id = content["group_id"].asUUID(); LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); if(!group_datap) @@ -2008,12 +2142,12 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_id); - group_datap->mMemberDataComplete = TRUE; + group_datap->mMemberDataComplete = true; group_datap->mMemberRequestID.setNull(); // Make the role-member data request if (group_datap->mPendingRoleMemberRequest) { - group_datap->mPendingRoleMemberRequest = FALSE; + group_datap->mPendingRoleMemberRequest = false; LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_id); } -- cgit v1.3 From 1299f6d63fbe313329e6e5ced7be797e2a23d6a7 Mon Sep 17 00:00:00 2001 From: Baker Linden Date: Fri, 30 Aug 2013 16:38:25 -0700 Subject: - Got all major functionality working - Changed PUT and DEL to POST which accepts an enum for a create or delete --- indra/newview/llgroupmgr.cpp | 43 ++++++++--------- indra/newview/llgroupmgr.h | 21 +++++--- indra/newview/llpanelgroupbulkban.cpp | 2 +- indra/newview/llpanelgroupinvite.cpp | 3 -- indra/newview/llpanelgrouproles.cpp | 90 ++++++++++++++++++++--------------- indra/newview/llpanelgrouproles.h | 4 +- 6 files changed, 88 insertions(+), 75 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 0d4b678019..bfdb8588e4 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -235,8 +235,7 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) : mRoleDataComplete(false), mRoleMemberDataComplete(false), mGroupPropertiesDataComplete(false), - mGroupBanStatus(STATUS_INIT), - mGroupBanDataComplete(false), + mGroupBanStatus(LLGroupMgrGroupData::STATUS_INIT), mPendingRoleMemberRequest(false), mAccessTime(0.0f) { @@ -748,13 +747,14 @@ void LLGroupMgrGroupData::cancelRoleChanges() void LLGroupMgrGroupData::createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data) { mBanList[ban_id] = ban_data; + // Refresh the list } -bool LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id) +void LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id) { // Once we get this hooked up to the backend, we want to confirm the create or delete worked. mBanList.erase(ban_id); - return true; + // Refresh the list } @@ -1880,7 +1880,10 @@ void GroupBanDataResponder::result(const LLSD& content) LLGroupMgr::processGroupBanRequest(content); } -void LLGroupMgr::sendGroupBanRequest(EBanRequestType request_type, const LLUUID& group_id, const std::vector ban_list /* = std::vector() */) +void LLGroupMgr::sendGroupBanRequest( EBanRequestType request_type, + const LLUUID& group_id, + EBanRequestAction ban_action, /* = BAN_NO_ACTION */ + const std::vector ban_list) /* = std::vector() */ { LLViewerRegion* currentRegion = gAgent.getRegion(); if(!currentRegion) @@ -1902,39 +1905,31 @@ void LLGroupMgr::sendGroupBanRequest(EBanRequestType request_type, const LLUUID& { return; } + cap_url += "?group_id=" + group_id.asString(); - LLHTTPClient::ResponderPtr grp_ban_responder = new GroupBanDataResponder(); - // PUT to our service. Add a body containing the group_id and list of agents to ban. - LLSD ban_ids = LLSD::emptyMap(); - ban_ids["group_id"] = group_id; + LLSD body = LLSD::emptyMap(); + body["ban_action"] = ban_action; // Add our list of potential banned agents to the list - ban_ids["ban_ids"] = LLSD::emptyArray(); + body["ban_ids"] = LLSD::emptyArray(); LLSD ban_entry; - std::vector::const_iterator iter = ban_list.cbegin(); + + uuid_vec_t::const_iterator iter = ban_list.begin(); for(;iter != ban_list.end(); ++iter) { ban_entry = (*iter); - ban_ids["ban_ids"].append(ban_entry); + body["ban_ids"].append(ban_entry); } + LLHTTPClient::ResponderPtr grp_ban_responder = new GroupBanDataResponder(); switch(request_type) { case REQUEST_GET: - cap_url += "?group_id=" + group_id.asString(); LLHTTPClient::get(cap_url, grp_ban_responder); break; - case REQUEST_PUT: - // BAKER TODO: Figure out which 'body' is correct. - LLHTTPClient::put(cap_url, ban_ids, grp_ban_responder, LLSD(), 60); - break; - case REQUEST_DEL: - LLHTTPClient::del(cap_url, grp_ban_responder, ban_ids, 60); + case REQUEST_POST: + LLHTTPClient::post(cap_url, body, grp_ban_responder); break; } - - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id); - if (gdatap) - gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); } @@ -1953,7 +1948,7 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content) if (!gdatap) return; - LLSD banlist = LLSD::emptyMap(); + //LLSD banlist = LLSD::emptyMap(); LLSD::map_const_iterator i = content["ban_list"].beginMap(); diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 876883e87e..49e354a26c 100755 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -215,7 +215,7 @@ friend class LLGroupMgr; public: enum EGroupDataStatus { - STATUS_NONE, + STATUS_INIT, STATUS_REQUESTING, STATUS_COMPLETE }; @@ -250,7 +250,6 @@ public: bool isRoleDataComplete() { return mRoleDataComplete; } bool isRoleMemberDataComplete() { return mRoleMemberDataComplete; } bool isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } - bool isGroupBanDataComplete() { return mGroupBanDataComplete; } EGroupDataStatus getGroupBanStatus() { return mGroupBanStatus; } void setGroupBanStatus(EGroupDataStatus status) { mGroupBanStatus = status; } @@ -269,7 +268,7 @@ public: const LLGroupBanData& getBanEntry(const LLUUID& ban_id) { return mBanList[ban_id]; } void createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data = LLGroupBanData()); - bool removeBanEntry(const LLUUID& ban_id); + void removeBanEntry(const LLUUID& ban_id); @@ -322,8 +321,6 @@ private: bool mGroupPropertiesDataComplete; EGroupDataStatus mGroupBanStatus; - bool mGroupBanDataComplete; - bool mGroupBanDataPending; bool mPendingRoleMemberRequest; F32 mAccessTime; @@ -356,10 +353,18 @@ public: enum EBanRequestType { REQUEST_GET = 0, + REQUEST_POST, REQUEST_PUT, REQUEST_DEL }; + enum EBanRequestAction + { + BAN_NO_ACTION = 0, + BAN_CREATE = 1, + BAN_DELETE = 2 + }; + public: LLGroupMgr(); ~LLGroupMgr(); @@ -394,7 +399,11 @@ public: static void sendGroupMemberEjects(const LLUUID& group_id, uuid_vec_t& member_ids); // BAKER - Group Ban - static void sendGroupBanRequest(EBanRequestType request_type, const LLUUID& group_id, const std::vector ban_list = std::vector()); + static void sendGroupBanRequest(EBanRequestType request_type, + const LLUUID& group_id, + EBanRequestAction ban_action = BAN_NO_ACTION, + const uuid_vec_t ban_list = uuid_vec_t()); + static void processGroupBanRequest(const LLSD& content); // BAKER diff --git a/indra/newview/llpanelgroupbulkban.cpp b/indra/newview/llpanelgroupbulkban.cpp index 57bab0c813..d6bb669275 100644 --- a/indra/newview/llpanelgroupbulkban.cpp +++ b/indra/newview/llpanelgroupbulkban.cpp @@ -141,7 +141,7 @@ void LLPanelGroupBulkBan::submit() return; } - LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_PUT, mImplementation->mGroupID, banned_agent_list); + LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mImplementation->mGroupID, LLGroupMgr::BAN_CREATE, banned_agent_list); // BAKER TEMP: // For now, don't close, but clear the list. diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index c990584d22..43d94b36fc 100755 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -48,9 +48,6 @@ #include "llviewerwindow.h" -// BAKER TODO: -// Figure out how to use LLHandle to make this safer -//bool invite_owner_callback(LLPanelGroupInvite panel, const LLSD& notification, const LLSD& response) bool invite_owner_callback(LLHandle panel_handle, const LLSD& notification, const LLSD& response) { LLPanelGroupInvite* panel = dynamic_cast(panel_handle.get()); diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 8d7b3c38ee..f3cb9900fe 100755 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1763,18 +1763,20 @@ void LLPanelGroupMembersSubTab::handleBanMember() return; } + uuid_vec_t ban_ids; std::vector::iterator itor; for(itor = selection.begin(); itor != selection.end(); ++itor) { LLUUID ban_id = (*itor)->getUUID(); + ban_ids.push_back(ban_id); + LLGroupBanData ban_data; - - // DEL to People API somewhere in this chain... gdatap->createBanEntry(ban_id, ban_data); - mMembersList->removeNameItem(ban_id); - } + LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mGroupID, LLGroupMgr::BAN_CREATE, ban_ids); + // Will this work? + handleEjectMembers(); } @@ -2721,8 +2723,7 @@ LLPanelGroupBanListSubTab::LLPanelGroupBanListSubTab() : LLPanelGroupSubTab(), mBanList(NULL), mCreateBanButton(NULL), - mDeleteBanButton(NULL), - mUpdateBanList(true) + mDeleteBanButton(NULL) { LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::ctor()" << LL_ENDL; } @@ -2763,6 +2764,13 @@ BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root) setFooterEnabled(FALSE); + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if(gdatap && (gdatap->getGroupBanStatus() == LLGroupMgrGroupData::STATUS_INIT)) + { + LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); + gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); + } + return TRUE; } @@ -2809,8 +2817,8 @@ void LLPanelGroupBanListSubTab::update(LLGroupChange gc) { LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::update()" << LL_ENDL; - if (gc != GC_ALL || gc != GC_BANLIST) - return; + //if (gc != GC_ALL && gc != GC_BANLIST) + // return; LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); if(!gdatap) @@ -2826,6 +2834,7 @@ void LLPanelGroupBanListSubTab::update(LLGroupChange gc) // Request our ban list! case LLGroupMgrGroupData::STATUS_INIT: LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); + gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); break; // Already have a request out -- don't bother sending another one @@ -2839,31 +2848,38 @@ void LLPanelGroupBanListSubTab::update(LLGroupChange gc) // [SOMETHING CHANGED] - Don't panic! Just repopulate the ban list! case LLGroupMgrGroupData::STATUS_COMPLETE: populateBanList(); - - break; } } +void LLPanelGroupBanListSubTab::draw() +{ + LLPanelGroupSubTab::draw(); + + // if(mPendingBanUpdate) + // populateBanList(); +} void LLPanelGroupBanListSubTab::populateBanList() { - //if(gdatap->getGroupBanStatus() == ) - + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if(!gdatap) + { + LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; + return; + } + if(gdatap->getGroupBanStatus() != LLGroupMgrGroupData::STATUS_COMPLETE) + return; -// mBanList->deleteAllItems(); -// LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); -// -// std::map::const_iterator entry = gdatap->mBanList.begin(); -// for(; entry != gdatap->mBanList.end(); entry++) -// { -// LLNameListCtrl::NameItem ban_entry; -// ban_entry.value = entry->first; -// mBanList->addNameItemRow(ban_entry); -// } - - mUpdateBanList = false; + mBanList->deleteAllItems(); + std::map::const_iterator entry = gdatap->mBanList.begin(); + for(; entry != gdatap->mBanList.end(); entry++) + { + LLNameListCtrl::NameItem ban_entry; + ban_entry.value = entry->first; + mBanList->addNameItemRow(ban_entry); + } } @@ -2885,7 +2901,7 @@ void LLPanelGroupBanListSubTab::handleBanEntrySelect() // BAKER TODO: -- MOVE TO SELECT BAN ENTRY // Make sure only authorized people have access to adding / deleting bans //if (gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS)) - mCreateBanButton->setEnabled(TRUE); + mCreateBanButton->setEnabled(TRUE); // Check if the agent has the ability to unban this person //if (gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS)) @@ -3000,26 +3016,22 @@ void LLPanelGroupBanListSubTab::handleDeleteBanEntry() } } + std::vector ban_ids; std::vector::iterator itor; for(itor = selection.begin(); itor != selection.end(); ++itor) { - // STUB - // Attempt to remove entry from the database - // If there was a problem with the delete, don't remove it from the list yet! - // Otherwise, remove it from our local list. - // - LLUUID ban_id = (*itor)->getUUID(); - if(gdatap->removeBanEntry(ban_id)) - { - mBanList->removeNameItem(ban_id); - // Removing an item removes the selection, we shouldn't be able to click - // the button anymore until we reselect another entry. - mDeleteBanButton->setEnabled(FALSE); - } + ban_ids.push_back(ban_id); + + //gdatap->removeBanEntry(ban_id); + //mBanList->removeNameItem(ban_id); + + // Removing an item removes the selection, we shouldn't be able to click + // the button anymore until we reselect another entry. + mDeleteBanButton->setEnabled(FALSE); } - + LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mGroupID, LLGroupMgr::BAN_DELETE, ban_ids); } diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 1695097fc5..01c1d8c16d 100755 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -335,6 +335,8 @@ public: // Triggered when group information changes in the group manager. virtual void update(LLGroupChange gc); + // + virtual void draw(); static void onBanEntrySelect(LLUICtrl* ctrl, void* user_data); void handleBanEntrySelect(); @@ -358,8 +360,6 @@ protected: LLNameListCtrl* mBanList; LLButton* mCreateBanButton; LLButton* mDeleteBanButton; - - bool mUpdateBanList; }; -- cgit v1.3 From bf34eccf9c68f204c41d3daea791e50e87d868db Mon Sep 17 00:00:00 2001 From: Baker Linden Date: Mon, 9 Sep 2013 17:29:33 -0700 Subject: - Start of code cleanup - Added refresh button to ban list panel - Added an additional signal to LLNameListCtrl to indicate when the entire name cache is complete. --- indra/newview/llgroupmgr.cpp | 9 +- indra/newview/llgroupmgr.h | 15 - indra/newview/llnamelistctrl.cpp | 58 +- indra/newview/llnamelistctrl.h | 17 +- indra/newview/llpanelgrouproles.cpp | 195 +-- indra/newview/llpanelgrouproles.h | 13 +- .../skins/default/xui/en/panel_group_roles.xml | 1251 ++++++++++---------- 7 files changed, 830 insertions(+), 728 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index bfdb8588e4..7cb53066ea 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -235,7 +235,6 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) : mRoleDataComplete(false), mRoleMemberDataComplete(false), mGroupPropertiesDataComplete(false), - mGroupBanStatus(LLGroupMgrGroupData::STATUS_INIT), mPendingRoleMemberRequest(false), mAccessTime(0.0f) { @@ -747,14 +746,11 @@ void LLGroupMgrGroupData::cancelRoleChanges() void LLGroupMgrGroupData::createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data) { mBanList[ban_id] = ban_data; - // Refresh the list } void LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id) { - // Once we get this hooked up to the backend, we want to confirm the create or delete worked. mBanList.erase(ban_id); - // Refresh the list } @@ -1948,9 +1944,6 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content) if (!gdatap) return; - //LLSD banlist = LLSD::emptyMap(); - - LLSD::map_const_iterator i = content["ban_list"].beginMap(); LLSD::map_const_iterator iEnd = content["ban_list"].endMap(); for(;i != iEnd; ++i) @@ -1963,7 +1956,7 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content) } gdatap->mChanged = TRUE; - gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_COMPLETE); +// gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_COMPLETE); LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST); } diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 49e354a26c..7e3297b757 100755 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -212,14 +212,6 @@ struct LLGroupTitle class LLGroupMgrGroupData { friend class LLGroupMgr; -public: - enum EGroupDataStatus - { - STATUS_INIT, - STATUS_REQUESTING, - STATUS_COMPLETE - }; - public: LLGroupMgrGroupData(const LLUUID& id); @@ -250,9 +242,6 @@ public: bool isRoleDataComplete() { return mRoleDataComplete; } bool isRoleMemberDataComplete() { return mRoleMemberDataComplete; } bool isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } - - EGroupDataStatus getGroupBanStatus() { return mGroupBanStatus; } - void setGroupBanStatus(EGroupDataStatus status) { mGroupBanStatus = status; } F32 getAccessTime() const { return mAccessTime; } void setAccessed(); @@ -271,8 +260,6 @@ public: void removeBanEntry(const LLUUID& ban_id); - - public: typedef std::map member_list_t; typedef std::map role_list_t; @@ -319,8 +306,6 @@ private: bool mRoleDataComplete; bool mRoleMemberDataComplete; bool mGroupPropertiesDataComplete; - - EGroupDataStatus mGroupBanStatus; bool mPendingRoleMemberRequest; F32 mAccessTime; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 7f396b7b7e..ed684004f0 100755 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -65,7 +65,8 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p) mNameColumn(p.name_column.column_name), mAllowCallingCardDrop(p.allow_calling_card_drop), mShortNames(p.short_names), - mAvatarNameCacheConnection() + mAvatarNameCacheConnection(), + mPendingLookupsRemaining(0) {} // public @@ -79,6 +80,12 @@ LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPositi item.enabled = enabled; item.target = INDIVIDUAL; + ////////////////////////////////////////////////////////////////////////// + // BAKER - FIX NameListCtrl + //mPendingLookupsRemaining--; + ////////////////////////////////////////////////////////////////////////// + + return addNameItemRow(item, pos, suffix); } @@ -275,6 +282,12 @@ void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPositi LLScrollListItem* LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos) { item.target = INDIVIDUAL; + + ////////////////////////////////////////////////////////////////////////// + // BAKER - FIX NameListCtrl + //mPendingLookupsRemaining--; + ////////////////////////////////////////////////////////////////////////// + return addNameItemRow(item, pos); } @@ -284,6 +297,12 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p LLParamSDParser parser; parser.readSD(element, item_params); item_params.userdata = userdata; + + ////////////////////////////////////////////////////////////////////////// + // BAKER - FIX NameListCtrl + //mPendingLookupsRemaining--; + ////////////////////////////////////////////////////////////////////////// + return addNameItemRow(item_params, pos); } @@ -335,6 +354,20 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow( mAvatarNameCacheConnection.disconnect(); } mAvatarNameCacheConnection = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, item->getHandle())); + + ////////////////////////////////////////////////////////////////////////// + // BAKER - FIX NameListCtrl + if(mPendingLookupsRemaining <= 0) + { + // We might get into a state where mPendingLookupsRemaining might + // go negative. So just reset it right now and figure out if it's + // possible later :) + mPendingLookupsRemaining = 0; + mNameListCompleteSignal(false); + } + mPendingLookupsRemaining++; + ////////////////////////////////////////////////////////////////////////// + } break; } @@ -386,6 +419,12 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id) { selectNthItem(idx); // not sure whether this is needed, taken from previous implementation deleteSingleItem(idx); + + ////////////////////////////////////////////////////////////////////////// + // BAKER - FIX NameListCtrl + mPendingLookupsRemaining--; + ////////////////////////////////////////////////////////////////////////// + } } @@ -412,6 +451,23 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, } } + ////////////////////////////////////////////////////////////////////////// + // BAKER - FIX NameListCtrl + //if (mPendingLookupsRemaining <= 0) + { + // We might get into a state where mPendingLookupsRemaining might + // go negative. So just reset it right now and figure out if it's + // possible later :) + //mPendingLookupsRemaining = 0; + + mNameListCompleteSignal(true); + } + //else + { + // mPendingLookupsRemaining--; + } + ////////////////////////////////////////////////////////////////////////// + dirtyColumns(); } diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 271802d48a..80ed081fd3 100755 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -67,6 +67,8 @@ class LLNameListCtrl : public LLScrollListCtrl, public LLInstanceTracker { public: + typedef boost::signals2::signal namelist_complete_signal_t; + typedef enum e_name_type { INDIVIDUAL, @@ -151,7 +153,7 @@ public: /*virtual*/ void updateColumns(); - /*virtual*/ void mouseOverHighlightNthItem( S32 index ); + /*virtual*/ void mouseOverHighlightNthItem( S32 index ); private: void showInspector(const LLUUID& avatar_id, bool is_group); void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, LLHandle item); @@ -162,6 +164,19 @@ private: BOOL mAllowCallingCardDrop; bool mShortNames; // display name only, no SLID boost::signals2::connection mAvatarNameCacheConnection; + + ////////////////////////////////////////////////////////////////////////// + // BAKER: Fixing name list control not being updated properly. + S32 mPendingLookupsRemaining; + namelist_complete_signal_t mNameListCompleteSignal; + +public: + boost::signals2::connection setOnNameListCompleteCallback(boost::function onNameListCompleteCallback) + { + return mNameListCompleteSignal.connect(onNameListCompleteCallback); + } + ////////////////////////////////////////////////////////////////////////// + }; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index f3cb9900fe..76cb3cc498 100755 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1304,6 +1304,8 @@ void LLPanelGroupMembersSubTab::deactivate() bool LLPanelGroupMembersSubTab::needsApply(std::string& mesg) { + LL_INFOS("BAKER") << "[BAKER] needsApply()" << LL_ENDL; + return mChanged; } @@ -2711,8 +2713,6 @@ void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id) LLPanelGroupSubTab::setGroupID(id); } -////////////////////////////////////////////////////////////////////////// - //////////////////////////// // LLPanelGroupBanListSubTab @@ -2724,14 +2724,10 @@ LLPanelGroupBanListSubTab::LLPanelGroupBanListSubTab() mBanList(NULL), mCreateBanButton(NULL), mDeleteBanButton(NULL) -{ - LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::ctor()" << LL_ENDL; -} +{} BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root) { - LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::postBuildSubTab()" << LL_ENDL; - LLPanelGroupSubTab::postBuildSubTab(root); // Upcast parent so we can ask it for sibling controls. @@ -2740,49 +2736,50 @@ BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root) // Look recursively from the parent to find all our widgets. bool recurse = true; - // BAKER TODO: - // What are these? Looks like something inhereted from LLPanelGroupSubTab - mHeader = parent->getChild("banlist_header", recurse); - mFooter = parent->getChild("banlist_footer", recurse); - ////////////////////////////////////////////////////////////////////////// + mHeader = parent->getChild("banlist_header", recurse); + mFooter = parent->getChild("banlist_footer", recurse); mBanList = parent->getChild("ban_list", recurse); - mCreateBanButton = parent->getChild("ban_create", recurse); - mDeleteBanButton = parent->getChild("ban_delete", recurse); + + mCreateBanButton = parent->getChild("ban_create", recurse); + mDeleteBanButton = parent->getChild("ban_delete", recurse); + mRefreshBanListButton = parent->getChild("ban_refresh", recurse); - if(!mBanList || !mCreateBanButton || !mDeleteBanButton) + if(!mBanList || !mCreateBanButton || !mDeleteBanButton || !mRefreshBanListButton) return FALSE; mBanList->setCommitOnSelectionChange(TRUE); mBanList->setCommitCallback(onBanEntrySelect, this); mCreateBanButton->setClickedCallback(onCreateBanEntry, this); - mCreateBanButton->setEnabled(FALSE); - + mCreateBanButton->setEnabled(TRUE); + mDeleteBanButton->setClickedCallback(onDeleteBanEntry, this); mDeleteBanButton->setEnabled(FALSE); - setFooterEnabled(FALSE); - - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); - if(gdatap && (gdatap->getGroupBanStatus() == LLGroupMgrGroupData::STATUS_INIT)) - { - LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); - gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); - } + mRefreshBanListButton->setClickedCallback(onRefreshBanList, this); + mRefreshBanListButton->setEnabled(FALSE); + mBanList->setOnNameListCompleteCallback(boost::bind(&LLPanelGroupBanListSubTab::onBanListCompleted, this, _1)); + + setFooterEnabled(FALSE); return TRUE; } void LLPanelGroupBanListSubTab::activate() { - LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::activate()" << LL_ENDL; - LLPanelGroupSubTab::activate(); mBanList->deselectAllItems(); mDeleteBanButton->setEnabled(FALSE); + // BAKER: Should I really request everytime activate() is called? + // Perhaps I should only do it on a force refresh, or if an action on the list happens... + // Because it's not going to live-update the list anyway... You'd have to refresh if you + // wanted to see someone else's additions anyway... + // + LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); + setFooterEnabled(FALSE); update(GC_ALL); } @@ -2820,68 +2817,53 @@ void LLPanelGroupBanListSubTab::update(LLGroupChange gc) //if (gc != GC_ALL && gc != GC_BANLIST) // return; - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); - if(!gdatap) - { - LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; - return; - } - - switch(gdatap->getGroupBanStatus()) - { - // Must be initial update [ Check if I should request this at panel creation - // with everything else -- might as well] - // Request our ban list! - case LLGroupMgrGroupData::STATUS_INIT: - LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); - gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); - break; +// LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); +// if(!gdatap) +// { +// LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; +// return; +// } + + populateBanList(); +// // Do I even need this anymore? +// switch(gdatap->getGroupBanStatus()) +// { +// // Must be initial update [ Check if I should request this at panel creation +// // with everything else -- might as well] +// // Request our ban list! +// case LLGroupMgrGroupData::STATUS_INIT: +// LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); +// gdatap->setGroupBanStatus(LLGroupMgrGroupData::STATUS_REQUESTING); +// break; +// +// // Already have a request out -- don't bother sending another one +// // Repeat sending won't make a difference, as it'll be behind a load balancer +// case LLGroupMgrGroupData::STATUS_REQUESTING: +// // Maybe here we call populate ban list as well, and see about how many +// // more names we need to complete the ban list +// break; +// +// // See if the list needs updating -- if we call update, but nothing changed, +// // there's no reason to send another request. +// // [NOTHING CHANGED] - Do Nothing! +// // [SOMETHING CHANGED] - Don't panic! Just repopulate the ban list! +// case LLGroupMgrGroupData::STATUS_COMPLETE: +// populateBanList(); +// break; +// } +// - // Already have a request out -- don't bother sending another one - // Repeat sending won't make a difference, as it'll be behind a load balancer - case LLGroupMgrGroupData::STATUS_REQUESTING: - break; - - // See if the list needs updating -- if we call update, but nothing changed, - // there's no reason to send another request. - // [NOTHING CHANGED] - Do Nothing! - // [SOMETHING CHANGED] - Don't panic! Just repopulate the ban list! - case LLGroupMgrGroupData::STATUS_COMPLETE: - populateBanList(); - break; - } + } void LLPanelGroupBanListSubTab::draw() { LLPanelGroupSubTab::draw(); - // if(mPendingBanUpdate) + //if(mPendingBanUpdate) // populateBanList(); } -void LLPanelGroupBanListSubTab::populateBanList() -{ - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); - if(!gdatap) - { - LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; - return; - } - - if(gdatap->getGroupBanStatus() != LLGroupMgrGroupData::STATUS_COMPLETE) - return; - - mBanList->deleteAllItems(); - std::map::const_iterator entry = gdatap->mBanList.begin(); - for(; entry != gdatap->mBanList.end(); entry++) - { - LLNameListCtrl::NameItem ban_entry; - ban_entry.value = entry->first; - mBanList->addNameItemRow(ban_entry); - } -} - void LLPanelGroupBanListSubTab::onBanEntrySelect(LLUICtrl* ctrl, void* user_data) { @@ -3035,10 +3017,59 @@ void LLPanelGroupBanListSubTab::handleDeleteBanEntry() } -void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) +void LLPanelGroupBanListSubTab::onRefreshBanList(void* user_data) { - LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::setGroupID()" << LL_ENDL; + LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::onRefreshBanList()" << LL_ENDL; + + LLPanelGroupBanListSubTab* self = static_cast(user_data); + if (!self) + return; + + self->handleRefreshBanList(); +} + +void LLPanelGroupBanListSubTab::handleRefreshBanList() +{ + LL_INFOS("BAKER") << "[BAKER] LLPanelGroupBanListSubTab::handleRefreshBanList()" << LL_ENDL; + mRefreshBanListButton->setEnabled(FALSE); + LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID); +} + + +void LLPanelGroupBanListSubTab::onBanListCompleted(bool isComplete) +{ + if(isComplete) + { + mRefreshBanListButton->setEnabled(TRUE); + populateBanList(); + } +} + +void LLPanelGroupBanListSubTab::populateBanList() +{ + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if(!gdatap) + { + LL_INFOS("BAKER") << "[BAKER] No group data!" << LL_ENDL; + return; + } + + mBanList->deleteAllItems(); + std::map::const_iterator entry = gdatap->mBanList.begin(); + for(; entry != gdatap->mBanList.end(); entry++) + { + LLNameListCtrl::NameItem ban_entry; + ban_entry.value = entry->first; + mBanList->addNameItemRow(ban_entry); + } + + mRefreshBanListButton->setEnabled(TRUE); +} + + +void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) +{ if(mBanList) mBanList->deleteAllItems(); @@ -3050,3 +3081,5 @@ void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id) + + diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 01c1d8c16d..2f37805f48 100755 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -335,7 +335,6 @@ public: // Triggered when group information changes in the group manager. virtual void update(LLGroupChange gc); - // virtual void draw(); static void onBanEntrySelect(LLUICtrl* ctrl, void* user_data); @@ -349,18 +348,24 @@ public: static void onDeleteBanEntry(void* user_data); void handleDeleteBanEntry(); - - virtual void setGroupID(const LLUUID& id); + + static void onRefreshBanList(void* user_data); + void handleRefreshBanList(); + + void onBanListCompleted(bool isComplete); protected: void populateBanList(); +public: + virtual void setGroupID(const LLUUID& id); protected: LLNameListCtrl* mBanList; LLButton* mCreateBanButton; LLButton* mDeleteBanButton; - + LLButton* mRefreshBanListButton; + }; #endif // LL_LLPANELGROUPROLES_H diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 9817f70ac7..70d19de848 100755 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -7,132 +7,132 @@ top="0" name="roles_tab" width="304"> - - There are unsaved changes - - - Do you want to save your changes? - - - + There are unsaved changes + + + Do you want to save your changes? + + + + - - - You can add or remove Roles assigned to Members. -Select multiple Members by holding the Ctrl key and -clicking on their names. - - - [AREA] m² - - - Inv_FolderClosed - - - Checkbox_On - - - Checkbox_Off - - - - - - - -