diff --git a/indra/llui/fsregistrarutils.h b/indra/llui/fsregistrarutils.h index 0b8d55f247..3c5d26fa98 100644 --- a/indra/llui/fsregistrarutils.h +++ b/indra/llui/fsregistrarutils.h @@ -44,7 +44,12 @@ enum EFSRegistrarFunctionActionType FS_RGSTR_ACT_REQUEST_TELEPORT, FS_RGSTR_CHK_AVATAR_BLOCKED, FS_RGSTR_CHK_IS_SELF, - FS_RGSTR_CHK_IS_NOT_SELF + FS_RGSTR_CHK_IS_NOT_SELF, + FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA, + FS_RGSTR_CHK_HAVE_GROUP_DATA, + FS_RGSTR_CHK_CAN_LEAVE_GROUP, + FS_RGSTR_CHK_CAN_JOIN_GROUP, + FS_RGSTR_CHK_GROUP_NOT_ACTIVE }; class FSRegistrarUtils diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index cb83eda373..9cec673674 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -2114,6 +2114,20 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) enable_registrar.add("FS.EnableViewLog", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_ACT_VIEW_TRANSCRIPT)); // + // FIRE-30725 - Add more group functions to group URL context menu + std::string uuid_str = uuid.asString(); + + registrar.add("FS.JoinGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupjoin", true)); + registrar.add("FS.LeaveGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupleave", true)); + registrar.add("FS.ActivateGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupactivate", true)); + + enable_registrar.add("FS.WaitingForGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA)); + enable_registrar.add("FS.HaveGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_HAVE_GROUP_DATA)); + enable_registrar.add("FS.EnableJoinGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_CAN_JOIN_GROUP)); + enable_registrar.add("FS.EnableLeaveGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_CAN_LEAVE_GROUP)); + enable_registrar.add("FS.EnableActivateGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_GROUP_NOT_ACTIVE)); + // + // create the context menu from the XUI file and display it std::string menu_name = is_group ? "menu_url_group.xml" : "menu_url_agent.xml"; delete mPopupMenu; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index ab40ecc0c9..2eabf5eb54 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2144,6 +2144,18 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url) enable_registrar.add("FS.EnableViewLog", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_ACT_VIEW_TRANSCRIPT)); // + // FIRE-30725 - Add more group functions to group URL context menu + registrar.add("FS.JoinGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupjoin", true)); + registrar.add("FS.LeaveGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupleave", true)); + registrar.add("FS.ActivateGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupactivate", true)); + + enable_registrar.add("FS.WaitingForGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA)); + enable_registrar.add("FS.HaveGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_HAVE_GROUP_DATA)); + enable_registrar.add("FS.EnableJoinGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_CAN_JOIN_GROUP)); + enable_registrar.add("FS.EnableLeaveGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_CAN_LEAVE_GROUP)); + enable_registrar.add("FS.EnableActivateGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_GROUP_NOT_ACTIVE)); + // + // create and return the context menu from the XUI file LLContextMenu* menu = static_cast(mPopupMenuHandle.get()); diff --git a/indra/newview/fscommon.cpp b/indra/newview/fscommon.cpp index a1bba035e0..b87fd79ef6 100644 --- a/indra/newview/fscommon.cpp +++ b/indra/newview/fscommon.cpp @@ -34,6 +34,8 @@ #include "llavataractions.h" #include "llavatarnamecache.h" #include "llfloaterperms.h" +#include "llgroupactions.h" +#include "llgroupmgr.h" #include "llinventorymodel.h" #include "lllogchat.h" #include "llmutelist.h" @@ -316,6 +318,16 @@ bool FSCommon::isLinden(const LLUUID& av_id) last_name == LL_TESTER); } +// request group data from the server if it's not already cached +bool FSCommon::requestGroupData(const LLUUID& groupID) +{ + if (LLGroupMgr::getInstance()->getGroupData(groupID) == nullptr) + { + LLGroupMgr::getInstance()->sendGroupPropertiesRequest(groupID); + return false; + } + return true; +} bool FSCommon::checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionActionType action) { @@ -373,6 +385,52 @@ bool FSCommon::checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionAct { return !isSelf; } + else if (action == FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA) + { + return !requestGroupData(av_id); + } + else if (action == FS_RGSTR_CHK_HAVE_GROUP_DATA) + { + return requestGroupData(av_id); + } + else if (action == FS_RGSTR_CHK_CAN_LEAVE_GROUP) + { + if (gAgent.getGroupID() == av_id && !RlvActions::canChangeActiveGroup()) + { + return false; + } + + return gAgent.isInGroup(av_id); + } + else if (action == FS_RGSTR_CHK_CAN_JOIN_GROUP) + { + if (!gAgent.canJoinGroups()) + { + return false; + } + + if (!RlvActions::canChangeActiveGroup()) + { + return false; + } + + LLGroupMgrGroupData* groupData = LLGroupMgr::getInstance()->getGroupData(av_id); + if (!groupData || !groupData->mOpenEnrollment) + { + return false; + } + + return !gAgent.isInGroup(av_id); + } + else if (action == FS_RGSTR_CHK_GROUP_NOT_ACTIVE) + { + if (!RlvActions::canChangeActiveGroup()) + { + return false; + } + + return (gAgent.isInGroup(av_id) && gAgent.getGroupID() != av_id); + } return false; } diff --git a/indra/newview/fscommon.h b/indra/newview/fscommon.h index be33ef6790..a7d8d350d6 100644 --- a/indra/newview/fscommon.h +++ b/indra/newview/fscommon.h @@ -78,6 +78,9 @@ namespace FSCommon */ extern S32 sObjectAddMsg; + // request group data from the server if it's not already cached + bool requestGroupData(const LLUUID& groupID); + bool checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionActionType); LLSD populateGroupCount(); diff --git a/indra/newview/fsslurlcommand.cpp b/indra/newview/fsslurlcommand.cpp index d0307b98d8..b53041d829 100644 --- a/indra/newview/fsslurlcommand.cpp +++ b/indra/newview/fsslurlcommand.cpp @@ -31,6 +31,7 @@ #include "llavataractions.h" #include "llcommandhandler.h" #include "llfloatersettingsdebug.h" +#include "llgroupactions.h" #include "lllogchat.h" #include "llnotificationsutil.h" @@ -135,6 +136,24 @@ public: return true; } + if (verb == "groupjoin") + { + LLGroupActions::join(LLUUID(target_id)); + return true; + } + + if (verb == "groupleave") + { + LLGroupActions::leave(LLUUID(target_id)); + return true; + } + + if (verb == "groupactivate") + { + LLGroupActions::activate(LLUUID(target_id)); + return true; + } + return false; } }; diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml index 2cb125ce09..24da0313e5 100644 --- a/indra/newview/skins/default/xui/en/menu_url_group.xml +++ b/indra/newview/skins/default/xui/en/menu_url_group.xml @@ -11,6 +11,58 @@ + + + + + + + + + + + + + + + + + + + + + + + +