diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 35f550ff1..818b4f866 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -91,6 +91,7 @@ set(viewer_SOURCE_FILES floatervoicelicense.cpp generichandlers.cpp hbfloatergrouptitles.cpp + groupchatlistener.cpp hippofloaterxml.cpp hippogridmanager.cpp hippolimits.cpp @@ -272,6 +273,7 @@ set(viewer_SOURCE_FILES llgiveinventory.cpp llgivemoney.cpp llglsandbox.cpp + llgroupactions.cpp llgroupmgr.cpp llgroupnotify.cpp llhomelocationresponder.cpp @@ -587,6 +589,7 @@ set(viewer_HEADER_FILES floaterlocalassetbrowse.h floatervoicelicense.h generichandlers.h + groupchatlistener.h hbfloatergrouptitles.h hippofloaterxml.h hippogridmanager.h @@ -770,6 +773,7 @@ set(viewer_HEADER_FILES llgesturemgr.h llgiveinventory.h llgivemoney.h + llgroupactions.h llgroupmgr.h llgroupnotify.h llhomelocationresponder.h diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp new file mode 100644 index 000000000..543032737 --- /dev/null +++ b/indra/newview/groupchatlistener.cpp @@ -0,0 +1,81 @@ +/** + * @file groupchatlistener.cpp + * @author Nat Goodspeed + * @date 2011-04-11 + * @brief Implementation for groupchatlistener. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "groupchatlistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llgroupactions.h" +//#include "llimview.h" + + +namespace { + void startIm_wrapper(LLSD const & event) + { + LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID()); + sendReply(LLSDMap("session_id", LLSD(session_id)), event); + } + + /* Singu TODO + void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id) + { + LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START); + } + */ +} + + +GroupChatListener::GroupChatListener(): + LLEventAPI("GroupChat", + "API to enter, leave, send and intercept group chat messages") +{ + add("startIM", + "Enter a group chat in group with UUID [\"id\"]\n" + "Assumes the logged-in agent is already a member of this group.", + &startIm_wrapper); + add("endIM", + "Leave a group chat in group with UUID [\"id\"]\n" + "Assumes a prior successful startIM request.", + &LLGroupActions::endIM, + LLSDArray("id")); + /* Singu TODO + add("sendIM", + "send a groupchat IM", + &send_message_wrapper, + LLSDArray("text")("session_id")("group_id")); + */ +} +/* + static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, + const LLUUID& other_participant_id, EInstantMessage dialog); +*/ + diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h new file mode 100644 index 000000000..42d6a6adc --- /dev/null +++ b/indra/newview/groupchatlistener.h @@ -0,0 +1,41 @@ +/** + * @file groupchatlistener.h + * @author Nat Goodspeed + * @date 2011-04-11 + * @brief + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#if ! defined(LL_GROUPCHATLISTENER_H) +#define LL_GROUPCHATLISTENER_H + +#include "lleventapi.h" + +class GroupChatListener: public LLEventAPI +{ +public: + GroupChatListener(); +}; + +#endif /* ! defined(LL_GROUPCHATLISTENER_H) */ + diff --git a/indra/newview/hbfloatergrouptitles.cpp b/indra/newview/hbfloatergrouptitles.cpp index 7ef401146..f75211730 100644 --- a/indra/newview/hbfloatergrouptitles.cpp +++ b/indra/newview/hbfloatergrouptitles.cpp @@ -40,6 +40,7 @@ #include "hbfloatergrouptitles.h" #include "llagent.h" +#include "llgroupactions.h" #include "lluictrlfactory.h" #include "llviewercontrol.h" @@ -145,13 +146,7 @@ void HBFloaterGroupTitles::onActivate(void* userdata) LLUUID group_id = item->getColumn(LIST_GROUP_ID)->getValue().asUUID(); if (group_id != old_group_id) { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ActivateGroup); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_GroupID, group_id); - gAgent.sendReliableMessage(); + LLGroupActions::activate(group_id); } // Set the title diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index b3e0eb56d..aa4717388 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -43,6 +43,7 @@ #include "llfirstuse.h" #include "llfloatercamera.h" #include "llfloatertools.h" +#include "llgroupactions.h" #include "llgroupmgr.h" #include "llhomelocationresponder.h" #include "llhudmanager.h" @@ -3247,7 +3248,7 @@ BOOL LLAgent::downGrabbed() const void update_group_floaters(const LLUUID& group_id) { - LLFloaterGroupInfo::refreshGroup(group_id); + LLGroupActions::refresh(group_id); // update avatar info LLFloaterAvatarInfo* fa = LLFloaterAvatarInfo::getInstance(gAgent.getID()); @@ -3300,7 +3301,7 @@ void LLAgent::processAgentDropGroup(LLMessageSystem *msg, void **) LLGroupMgr::getInstance()->clearGroupData(group_id); // close the floater for this group, if any. - LLFloaterGroupInfo::closeGroup(group_id); + LLGroupActions::closeGroup(group_id); // refresh the group panel of the search window, if necessary. LLFloaterDirectory::refreshGroup(group_id); } @@ -3379,7 +3380,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode LLGroupMgr::getInstance()->clearGroupData(group_id); // close the floater for this group, if any. - LLFloaterGroupInfo::closeGroup(group_id); + LLGroupActions::closeGroup(group_id); // refresh the group panel of the search window, //if necessary. LLFloaterDirectory::refreshGroup(group_id); diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp index 0bd358d4c..552406479 100644 --- a/indra/newview/llfloaterdirectory.cpp +++ b/indra/newview/llfloaterdirectory.cpp @@ -389,9 +389,7 @@ void* LLFloaterDirectory::createEventDetail(void* userdata) void* LLFloaterDirectory::createGroupDetail(void* userdata) { LLFloaterDirectory *self = (LLFloaterDirectory*)userdata; - self->mPanelGroupp = new LLPanelGroup("panel_group.xml", - "PanelGroup", - gAgent.getGroupID()); + self->mPanelGroupp = new LLPanelGroup(gAgent.getGroupID()); self->mPanelGroupp->setAllowEdit(FALSE || gAgent.isGodlike()); // Gods can always edit panels self->mPanelGroupp->setVisible(FALSE); return self->mPanelGroupp; diff --git a/indra/newview/llfloatergroupinfo.cpp b/indra/newview/llfloatergroupinfo.cpp index 3e2e845e3..cbe1636ea 100644 --- a/indra/newview/llfloatergroupinfo.cpp +++ b/indra/newview/llfloatergroupinfo.cpp @@ -36,100 +36,30 @@ #include "llfloatergroupinfo.h" -#include "llagent.h" -#include "llcommandhandler.h" -#include "llfloaterchatterbox.h" -#include "llpanelgroup.h" -#include "llviewermessage.h" // for inventory_offer_callback -//#include "llviewerwindow.h" -#include "llnotifications.h" - #include "llcachename.h" +#include "llpanelgroup.h" const char FLOATER_TITLE[] = "Group Information"; -const LLRect FGI_RECT(0, 530, 420, 0); - -// -// Globals -// -std::map LLFloaterGroupInfo::sInstances; - -class LLGroupHandler : public LLCommandHandler -{ -public: - // requires trusted browser to trigger - LLGroupHandler() : LLCommandHandler("group", true) { } - bool handle(const LLSD& tokens, const LLSD& query_map, - LLMediaCtrl* web) - { - if (tokens.size() < 1) - { - return false; - } - - if (tokens[0].asString() == "create") - { - LLFloaterGroupInfo::showCreateGroup(NULL); - return true; - } - - if (tokens.size() < 2) - { - return false; - } - - if (tokens[0].asString() == "list") - { - if (tokens[1].asString() == "show") - { - // CP_TODO: get the value we pass in via the XUI name - // of the tab instead of using a literal like this - LLFloaterMyFriends::showInstance( 1 ); - - return true; - } - return false; - } - - LLUUID group_id; - if (!group_id.set(tokens[0], FALSE)) - { - return false; - } - - if ((tokens[1].asString() == "about") || (tokens[1].asString() == "inspect")) - { - LLFloaterGroupInfo::showFromUUID(group_id); - return true; - } - return false; - } -}; -LLGroupHandler gGroupHandler; //----------------------------------------------------------------------------- // Implementation //----------------------------------------------------------------------------- -LLFloaterGroupInfo::LLFloaterGroupInfo(const std::string& name, const LLRect &rect, const std::string& title, const LLUUID& group_id, const std::string& tab_name) -: LLFloater(name, rect, title), - mGroupID( group_id ) +LLFloaterGroupInfo::LLFloaterGroupInfo(const LLUUID& group_id) +: LLFloater(FLOATER_TITLE, LLRect(0, 530, 420, 0), FLOATER_TITLE), LLInstanceTracker(group_id) { - llinfos << name << " : " << title << llendl; - llinfos << rect << llendl; - llinfos << getRect() << llendl; - llinfos << getLocalRect() << llendl; // Construct the filename of the group panel xml definition file. - mPanelGroupp = new LLPanelGroup("panel_group.xml", - "PanelGroup", - group_id, - tab_name); + mPanelGroupp = new LLPanelGroup(group_id); addChild(mPanelGroupp); + if (group_id.notNull()) + { + // Look up the group name. The callback will insert it into the title. + gCacheName->get(group_id, true, boost::bind(&LLFloaterGroupInfo::callbackLoadGroupName, this, _2)); + } } // virtual LLFloaterGroupInfo::~LLFloaterGroupInfo() { - sInstances.erase(mGroupID); } BOOL LLFloaterGroupInfo::canClose() @@ -147,125 +77,11 @@ void LLFloaterGroupInfo::selectTabByName(std::string tab_name) mPanelGroupp->selectTab(tab_name); } -// static -void LLFloaterGroupInfo::showMyGroupInfo(void *) +void LLFloaterGroupInfo::callbackLoadGroupName(const std::string& full_name) { - showFromUUID( gAgent.getGroupID() ); + // Build a new title including the group name. + std::ostringstream title; + title << full_name << " - " << FLOATER_TITLE; + setTitle(title.str()); } -// static -void LLFloaterGroupInfo::showCreateGroup(void *) -{ - showFromUUID(LLUUID::null, "general_tab"); -} - -// static -void LLFloaterGroupInfo::closeGroup(const LLUUID& group_id) -{ - LLFloaterGroupInfo *fgi = get_if_there(sInstances, group_id, (LLFloaterGroupInfo*)NULL); - if (fgi) - { - if (fgi->mPanelGroupp) - { - fgi->mPanelGroupp->close(); - } - } -} - -// static -void LLFloaterGroupInfo::closeCreateGroup() -{ - closeGroup(LLUUID::null); -} - -// static -void LLFloaterGroupInfo::refreshGroup(const LLUUID& group_id) -{ - LLFloaterGroupInfo *fgi = get_if_there(sInstances, group_id, (LLFloaterGroupInfo*)NULL); - if (fgi) - { - if (fgi->mPanelGroupp) - { - fgi->mPanelGroupp->refreshData(); - } - } -} - -// static -void LLFloaterGroupInfo::callbackLoadGroupName(const LLUUID& id, const std::string& full_name, bool is_group) -{ - LLFloaterGroupInfo *fgi = get_if_there(sInstances, id, (LLFloaterGroupInfo*)NULL); - - if (fgi) - { - // Build a new title including the group name. - std::ostringstream title; - title << full_name << " - " << FLOATER_TITLE; - fgi->setTitle(title.str()); - } -} - -// static -void LLFloaterGroupInfo::showFromUUID(const LLUUID& group_id, - const std::string& tab_name) -{ - // If we don't have a floater for this group, create one. - LLFloaterGroupInfo *fgi = get_if_there(sInstances, group_id, (LLFloaterGroupInfo*)NULL); - if (!fgi) - { - fgi = new LLFloaterGroupInfo("groupinfo", - FGI_RECT, - FLOATER_TITLE, - group_id, - tab_name); - - sInstances[group_id] = fgi; - - if (group_id.notNull()) - { - // Look up the group name. - // The callback will insert it into the title. - gCacheName->get(group_id, true, boost::bind(&callbackLoadGroupName, _1, _2, _3)); - } - } - - fgi->selectTabByName(tab_name); - - fgi->center(); - fgi->open(); /*Flawfinder: ignore*/ -} - -// static -void LLFloaterGroupInfo::showNotice(const std::string& subject, - const std::string& message, - const LLUUID& group_id, - const bool& has_inventory, - const std::string& inventory_name, - LLOfferInfo* inventory_offer) -{ - llinfos << "LLFloaterGroupInfo::showNotice : " << subject << llendl; - - if (group_id.isNull()) - { - // We need to clean up that inventory offer. - if (inventory_offer) - { - inventory_offer->forceResponse(IOR_DECLINE); - } - return; - } - - // If we don't have a floater for this group, drop this packet on the floor. - LLFloaterGroupInfo *fgi = get_if_there(sInstances, group_id, (LLFloaterGroupInfo*)NULL); - if (!fgi) - { - // We need to clean up that inventory offer. - if (inventory_offer) - { - inventory_offer->forceResponse(IOR_DECLINE); - } - return; - } - - fgi->mPanelGroupp->showNotice(subject,message,has_inventory,inventory_name,inventory_offer); -} diff --git a/indra/newview/llfloatergroupinfo.h b/indra/newview/llfloatergroupinfo.h index ac1beecd2..fda3c348a 100644 --- a/indra/newview/llfloatergroupinfo.h +++ b/indra/newview/llfloatergroupinfo.h @@ -39,48 +39,29 @@ #define LL_LLFLOATERGROUPINFO_H #include "llfloater.h" -#include "lluuid.h" +#include "llinstancetracker.h" class LLPanelGroup; -struct LLOfferInfo; class LLFloaterGroupInfo -: public LLFloater +: public LLFloater, public LLInstanceTracker { public: + LLFloaterGroupInfo(const LLUUID& group_id); virtual ~LLFloaterGroupInfo(); - static void showCreateGroup(void *); - static void showMyGroupInfo(void *); - static void showFromUUID(const LLUUID &group_id, - const std::string& tab_name = std::string()); - static void closeCreateGroup(); - static void closeGroup(const LLUUID& group_id); - static void refreshGroup(const LLUUID& group_id); - - static void showNotice(const std::string& subject, - const std::string& message, - const LLUUID& group_id, - const bool& has_inventory, - const std::string& inventory_name, - LLOfferInfo* inventory_offer); - - LLUUID getGroupID() { return mGroupID;} - void selectTabByName(std::string tab_name); - // This allow us to block the user from closing the floater - // if there is information that needs to be applied. + // This allows us to block the user from closing the floater if there is information that needs to be applied. virtual BOOL canClose(); + protected: - LLFloaterGroupInfo(const std::string& name, const LLRect &rect, const std::string& title, const LLUUID& group_id = LLUUID::null, const std::string& tab_name = std::string()); + friend class LLGroupActions; + LLPanelGroup* mPanelGroupp; private: - static void callbackLoadGroupName(const LLUUID& id, const std::string& full_name, bool is_group); - static std::map sInstances; - - LLUUID mGroupID; - LLPanelGroup* mPanelGroupp; + void callbackLoadGroupName(const std::string& full_name); }; #endif + diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index fe9fc1267..1f5a9cf24 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -51,6 +51,7 @@ #include "llfloatergroupinfo.h" #include "llfloaterdirectory.h" #include "llfocusmgr.h" +#include "llgroupactions.h" #include "llselectmgr.h" #include "llscrolllistctrl.h" #include "llnotificationsutil.h" @@ -218,23 +219,23 @@ BOOL LLPanelGroups::postBuild() init_group_list(group_list, gAgent.getGroupID(), none_text); group_list->setCommitCallback(boost::bind(&LLPanelGroups::onGroupList,this)); group_list->setSortChangedCallback(boost::bind(&LLPanelGroups::onGroupSortChanged,this)); //Force 'none' to always be first entry. - group_list->setDoubleClickCallback(boost::bind(&LLPanelGroups::onBtnIM,this)); + group_list->setDoubleClickCallback(boost::bind(LLGroupActions::startIM, boost::bind(&LLScrollListCtrl::getCurrentID, group_list))); - childSetAction("Activate", onBtnActivate, this); + getChild("Activate")->setCommitCallback(boost::bind(LLGroupActions::activate, boost::bind(&LLScrollListCtrl::getCurrentID, group_list))); - childSetAction("Info", onBtnInfo, this); + getChild("Info")->setCommitCallback(boost::bind(LLGroupActions::show, boost::bind(&LLScrollListCtrl::getCurrentID, group_list))); - childSetAction("IM", onBtnIM, this); + getChild("IM")->setCommitCallback(boost::bind(LLGroupActions::startIM, boost::bind(&LLScrollListCtrl::getCurrentID, group_list))); - childSetAction("Leave", onBtnLeave, this); + getChild("Leave")->setCommitCallback(boost::bind(LLGroupActions::leave, boost::bind(&LLScrollListCtrl::getCurrentID, group_list))); - childSetAction("Create", onBtnCreate, this); + getChild("Create")->setCommitCallback(boost::bind(LLGroupActions::createGroup)); - childSetAction("Search...", onBtnSearch, this); + getChild("Search...")->setCommitCallback(boost::bind(LLGroupActions::search)); childSetAction("Invite...", onBtnInvite, this); - childSetAction("Titles...", onBtnTitles, this); + getChild("Titles...")->setCommitCallback(boost::bind(HBFloaterGroupTitles::toggle)); setDefaultBtn("IM"); @@ -291,147 +292,12 @@ void LLPanelGroups::enableButtons() } -void LLPanelGroups::onBtnCreate(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->create(); -} - void LLPanelGroups::onBtnInvite(void* userdata) { LLPanelGroups* self = (LLPanelGroups*)userdata; if(self) self->invite(); } -void LLPanelGroups::onBtnActivate(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->activate(); -} - -void LLPanelGroups::onBtnInfo(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->info(); -} - -void LLPanelGroups::onBtnIM(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->startIM(); -} - -void LLPanelGroups::onBtnLeave(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->leave(); -} - -void LLPanelGroups::onBtnSearch(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->search(); -} - -void LLPanelGroups::onBtnTitles(void* userdata) -{ - LLPanelGroups* self = (LLPanelGroups*)userdata; - if(self) self->titles(); -} - -void LLPanelGroups::create() -{ - llinfos << "LLPanelGroups::create" << llendl; - LLFloaterGroupInfo::showCreateGroup(NULL); -} - -void LLPanelGroups::activate() -{ - llinfos << "LLPanelGroups::activate" << llendl; - LLCtrlListInterface *group_list = childGetListInterface("group list"); - LLUUID group_id; - if (group_list) - { - group_id = group_list->getCurrentID(); - } - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ActivateGroup); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_GroupID, group_id); - gAgent.sendReliableMessage(); -} - -void LLPanelGroups::info() -{ - llinfos << "LLPanelGroups::info" << llendl; - LLCtrlListInterface *group_list = childGetListInterface("group list"); - LLUUID group_id; - if (group_list && (group_id = group_list->getCurrentID()).notNull()) - { - LLFloaterGroupInfo::showFromUUID(group_id); - } -} - -void LLPanelGroups::startIM() -{ - LLCtrlListInterface *group_list = childGetListInterface("group list"); - LLUUID group_id; - - if (group_list && (group_id = group_list->getCurrentID()).notNull()) - { - LLGroupData group_data; - if (gAgent.getGroupData(group_id, group_data)) - { - static LLCachedControl tear_off("OtherChatsTornOff"); - if (!tear_off) - gIMMgr->setFloaterOpen(TRUE); - gIMMgr->addSession( - group_data.mName, - IM_SESSION_GROUP_START, - group_id); - make_ui_sound("UISndStartIM"); - } - else - { - // this should never happen, as starting a group IM session - // relies on you belonging to the group and hence having the group data - make_ui_sound("UISndInvalidOp"); - } - } -} - -void LLPanelGroups::leave() -{ - llinfos << "LLPanelGroups::leave" << llendl; - LLCtrlListInterface *group_list = childGetListInterface("group list"); - LLUUID group_id; - if (group_list && (group_id = group_list->getCurrentID()).notNull()) - { - S32 count = gAgent.mGroups.count(); - S32 i; - for(i = 0; i < count; ++i) - { - if(gAgent.mGroups.get(i).mID == group_id) - break; - } - if(i < count) - { - LLSD args; - args["GROUP"] = gAgent.mGroups.get(i).mName; - LLSD payload; - payload["group_id"] = group_id; - LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, callbackLeaveGroup); - } - } -} - -void LLPanelGroups::search() -{ - LLFloaterDirectory::showGroups(); -} - void LLPanelGroups::invite() { LLCtrlListInterface *group_list = childGetListInterface("group list"); @@ -447,31 +313,6 @@ void LLPanelGroups::invite() LLFloaterGroupInvite::showForGroup(group_id); } -void LLPanelGroups::titles() -{ - HBFloaterGroupTitles::toggle(); -} - - -// static -bool LLPanelGroups::callbackLeaveGroup(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - LLUUID group_id = notification["payload"]["group_id"].asUUID(); - if(option == 0) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_LeaveGroupRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_GroupData); - msg->addUUIDFast(_PREHASH_GroupID, group_id); - gAgent.sendReliableMessage(); - } - return false; -} - void LLPanelGroups::onGroupSortChanged() { LLScrollListCtrl *group_list = getChild("group list"); diff --git a/indra/newview/llfloatergroups.h b/indra/newview/llfloatergroups.h index ebf37acd7..b262b3f4a 100644 --- a/indra/newview/llfloatergroups.h +++ b/indra/newview/llfloatergroups.h @@ -52,7 +52,6 @@ class LLUICtrl; class LLTextBox; class LLScrollListCtrl; class LLButton; -class LLFloaterGroupPicker; class LLFloaterGroupPicker : public LLFloater, public LLUIFactory > { @@ -105,29 +104,8 @@ protected: void onGroupSortChanged(); void onGroupList(); - static void onBtnCreate(void* userdata); - static void onBtnActivate(void* userdata); - static void onBtnInfo(void* userdata); - static void onBtnIM(void* userdata); - static void onBtnLeave(void* userdata); - static void onBtnSearch(void* userdata); - static void onBtnVote(void* userdata); static void onBtnInvite(void* userdata); - static void onBtnTitles(void* userdata); - static void onDoubleClickGroup(void* userdata); - - void create(); - void activate(); - void info(); - void startIM(); - void leave(); - void search(); - void callVote(); void invite(); - void titles(); - - static bool callbackLeaveGroup(const LLSD& notification, const LLSD& response); - }; diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 755a1d6aa..e6f077863 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -58,6 +58,7 @@ #include "llfloatergroups.h" #include "llfloatergroupinfo.h" #include "llfloaterscriptlimits.h" +#include "llgroupactions.h" #include "lllineeditor.h" #include "llnamelistctrl.h" #include "llnotify.h" @@ -848,8 +849,7 @@ void LLPanelLandGeneral::onClickInfoGroup(void* userdata) LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)userdata; LLParcel* parcel = panelp->mParcel->getParcel(); if (!parcel) return; - LLUUID id = parcel->getGroupID(); - if(id.notNull())LLFloaterGroupInfo::showFromUUID(parcel->getGroupID()); + LLGroupActions::show(parcel->getGroupID()); } void LLPanelLandGeneral::onClickProfile() @@ -859,8 +859,7 @@ void LLPanelLandGeneral::onClickProfile() if (parcel->getIsGroupOwned()) { - const LLUUID& group_id = parcel->getGroupID(); - LLFloaterGroupInfo::showFromUUID(group_id); + LLGroupActions::show(parcel->getGroupID()); } else { @@ -1178,7 +1177,7 @@ void LLPanelLandObjects::onDoubleClickOwner(void *userdata) BOOL is_group = cell->getValue().asString() == OWNER_GROUP; if (is_group) { - LLFloaterGroupInfo::showFromUUID(owner_id); + LLGroupActions::show(owner_id); } else { diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index b60aab459..4949678c1 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -42,8 +42,8 @@ #include "llagent.h" #include "llbutton.h" -#include "llfloatergroupinfo.h" #include "llfloaterworldmap.h" +#include "llgroupactions.h" #include "llproductinforequest.h" #include "llscrolllistctrl.h" #include "llstatusbar.h" @@ -103,7 +103,7 @@ BOOL LLFloaterLandHoldings::postBuild() LLScrollListCtrl *grant_list = getChild("grant list"); // Grant list - grant_list->setDoubleClickCallback(boost::bind(&LLFloaterLandHoldings::onGrantList,this)); + grant_list->setDoubleClickCallback(boost::bind(LLGroupActions::show, boost::bind(&LLScrollListCtrl::getCurrentID, grant_list))); LLCtrlListInterface *list = grant_list->getListInterface(); if (!list) return TRUE; @@ -323,19 +323,6 @@ void LLFloaterLandHoldings::onClickMap(void* data) self->buttonCore(1); } -// static -void LLFloaterLandHoldings::onGrantList(void* data) -{ - LLFloaterLandHoldings* self = (LLFloaterLandHoldings*)data; - LLCtrlSelectionInterface *list = self->childGetSelectionInterface("grant list"); - if (!list) return; - LLUUID group_id = list->getCurrentID(); - if (group_id.notNull()) - { - LLFloaterGroupInfo::showFromUUID(group_id); - } -} - void LLFloaterLandHoldings::refreshAggregates() { S32 allowed_area = gStatusBar->getSquareMetersCredit(); diff --git a/indra/newview/llfloaterlandholdings.h b/indra/newview/llfloaterlandholdings.h index def77cf2a..447ebeb82 100644 --- a/indra/newview/llfloaterlandholdings.h +++ b/indra/newview/llfloaterlandholdings.h @@ -60,8 +60,6 @@ public: static void onClickMap(void*); static void onClickLandmark(void*); - static void onGrantList(void* data); - protected: LLFloaterLandHoldings(); virtual ~LLFloaterLandHoldings(); diff --git a/indra/newview/llfloaterobjectiminfo.cpp b/indra/newview/llfloaterobjectiminfo.cpp index 678ba576a..af4650d0c 100644 --- a/indra/newview/llfloaterobjectiminfo.cpp +++ b/indra/newview/llfloaterobjectiminfo.cpp @@ -40,11 +40,11 @@ #include "llcommandhandler.h" #include "llfloatergroupinfo.h" #include "llfloatermute.h" +#include "llgroupactions.h" #include "llmutelist.h" #include "llsdutil.h" #include "lluictrlfactory.h" #include "llurldispatcher.h" -#include "llviewercontrol.h" // [RLVa:KB] - Version: 1.23.4 #include "rlvhandler.h" @@ -146,7 +146,7 @@ void LLFloaterObjectIMInfo::onClickOwner(void* data) LLFloaterObjectIMInfo* self = (LLFloaterObjectIMInfo*)data; if (self->mOwnerIsGroup) { - LLFloaterGroupInfo::showFromUUID(self->mOwnerID); + LLGroupActions::show(self->mOwnerID); } // else // [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index e73e4e4a2..5fcdc8bbf 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -44,7 +44,7 @@ #include "llavataractions.h" #include "llbutton.h" #include "llcheckboxctrl.h" -#include "llfloatergroupinfo.h" +#include "llgroupactions.h" #include "llinventorymodel.h" #include "llinventoryobserver.h" #include "lllineeditor.h" @@ -604,7 +604,7 @@ void LLFloaterProperties::onClickOwner() if(!item) return; if(item->getPermissions().isGroupOwned()) { - LLFloaterGroupInfo::showFromUUID(item->getPermissions().getGroup()); + LLGroupActions::show(item->getPermissions().getGroup()); } else { diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp new file mode 100644 index 000000000..292770d12 --- /dev/null +++ b/indra/newview/llgroupactions.cpp @@ -0,0 +1,489 @@ +/** + * @file llgroupactions.cpp + * @brief Group-related actions (join, leave, new, delete, etc) + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" + +#include "llgroupactions.h" + +#include "llagent.h" +#include "llcommandhandler.h" +#include "llfloaterchatterbox.h" // for LLFloaterMyFriends +#include "llfloaterdirectory.h" +#include "llfloatergroupinfo.h" +#include "llgroupmgr.h" +#include "llimview.h" // for gIMMgr +#include "llnotificationsutil.h" +#include "llpanelgroup.h" +#include "groupchatlistener.h" +#include "hippolimits.h" // for getMaxAgentGroups +// [RLVa:KB] - Checked: 2011-03-28 (RLVa-1.3.0f) +//#include "llslurl.h" +#include "rlvhandler.h" +// [/RLVa:KB] + +BOOL can_afford_transaction(S32 cost); + +// +// Globals +// +static GroupChatListener sGroupChatListener; + +class LLGroupHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLGroupHandler() : LLCommandHandler("group", true/*UNTRUSTED_THROTTLE*/) { } + bool handle(const LLSD& tokens, const LLSD& query_map, + LLMediaCtrl* web) + { + /*if (!LLUI::sSettingGroups["config"]->getBOOL("EnableGroupInfo")) + { + LLNotificationsUtil::add("NoGroupInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + }*/ + + if (tokens.size() < 1) + { + return false; + } + + if (tokens[0].asString() == "create") + { + LLGroupActions::createGroup(); + return true; + } + + if (tokens.size() < 2) + { + return false; + } + + if (tokens[0].asString() == "list") + { + if (tokens[1].asString() == "show") + { + // CP_TODO: get the value we pass in via the XUI name + // of the tab instead of using a literal like this + LLFloaterMyFriends::showInstance( 1 ); + + return true; + } + return false; + } + + LLUUID group_id; + if (!group_id.set(tokens[0], FALSE)) + { + return false; + } + + if (tokens[1].asString() == "about") + { + if (group_id.isNull()) + return true; + + LLGroupActions::show(group_id); + + return true; + } + if (tokens[1].asString() == "inspect") + { + if (group_id.isNull()) + return true; + LLGroupActions::inspect(group_id); + return true; + } + return false; + } +}; +LLGroupHandler gGroupHandler; + +// static +void LLGroupActions::search() +{ + //LLFloaterReg::showInstance("search", LLSD().with("category", "groups")); + LLFloaterDirectory::showGroups(); +} + +/* Singu TODO: Voice refactor +// static +void LLGroupActions::startCall(const LLUUID& group_id) +{ + // create a new group voice session + LLGroupData gdata; + + if (!gAgent.getGroupData(group_id, gdata)) + { + llwarns << "Error getting group data" << llendl; + return; + } + +// [RLVa:KB] - Checked: 2011-04-11 (RLVa-1.3.0h) | Added: RLVa-1.3.0h + if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canStartIM(group_id)) && (!gIMMgr->hasSession(group_id)) ) + { + make_ui_sound("UISndInvalidOp"); + RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString())); + return; + } +// [/RLVa:KB] + + LLUUID session_id = gIMMgr->addSession(gdata.mName, IM_SESSION_GROUP_START, group_id, true); + if (session_id.isNull()) + { + llwarns << "Error adding session" << llendl; + return; + } + + // start the call + gIMMgr->autoStartCallOnStartup(session_id); + + make_ui_sound("UISndStartIM"); +} +*/ + +// static +void LLGroupActions::join(const LLUUID& group_id) +{ + if (gAgent.mGroups.count() >= gHippoLimits->getMaxAgentGroups()) //!gAgent.canJoinGroups() + { + LLNotificationsUtil::add("JoinedTooManyGroups"); + return; + } + + LLGroupMgrGroupData* gdatap = + LLGroupMgr::getInstance()->getGroupData(group_id); + + if (gdatap) + { + S32 cost = gdatap->mMembershipFee; + LLSD args; + args["COST"] = llformat("%d", cost); + args["NAME"] = gdatap->mName; + LLSD payload; + payload["group_id"] = group_id; + + if (can_afford_transaction(cost)) + { + if(cost > 0) + LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup); + else + LLNotificationsUtil::add("JoinGroupNoCost", args, payload, onJoinGroup); + } + else + { + LLNotificationsUtil::add("JoinGroupCannotAfford", args, payload); + } + } + else + { + llwarns << "LLGroupMgr::getInstance()->getGroupData(" << group_id + << ") was NULL" << llendl; + } +} + +// static +bool LLGroupActions::onJoinGroup(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + + if (option == 1) + { + // user clicked cancel + return false; + } + + LLGroupMgr::getInstance()-> + sendGroupMemberJoin(notification["payload"]["group_id"].asUUID()); + return false; +} + +// static +void LLGroupActions::leave(const LLUUID& group_id) +{ +// if (group_id.isNull()) +// return; +// [RLVa:KB] - Checked: 2011-03-28 (RLVa-1.4.1a) | Added: RLVa-1.3.0f + if ( (group_id.isNull()) || ((gAgent.getGroupID() == group_id) && (gRlvHandler.hasBehaviour(RLV_BHVR_SETGROUP))) ) + return; +// [/RLVa:KB] + + S32 count = gAgent.mGroups.count(); + S32 i; + for (i = 0; i < count; ++i) + { + if(gAgent.mGroups.get(i).mID == group_id) + break; + } + if (i < count) + { + LLSD args; + args["GROUP"] = gAgent.mGroups.get(i).mName; + LLSD payload; + payload["group_id"] = group_id; + LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup); + } +} + +// static +void LLGroupActions::activate(const LLUUID& group_id) +{ +// [RLVa:KB] - Checked: 2011-03-28 (RLVa-1.4.1a) | Added: RLVa-1.3.0f + if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SETGROUP)) && (gRlvHandler.getAgentGroup() != group_id) ) + { + return; + } +// [/RLVa:KB] + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ActivateGroup); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_GroupID, group_id); + gAgent.sendReliableMessage(); +} + +/* Singu Note: this function serves no purpose to us, it is here as an honorable mention +static bool isGroupUIVisible() +{ + static LLPanel* panel = 0; + if(!panel) + panel = LLFloaterSidePanelContainer::getPanel("people", "panel_group_info_sidetray"); + if(!panel) + return false; + return panel->isInVisibleChain(); +} +*/ + +// static +void LLGroupActions::inspect(const LLUUID& group_id) +{ + //LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", group_id)); + openGroupProfile(group_id); +} + + +// static +void LLGroupActions::show(const LLUUID& group_id) +{ + if (group_id.isNull()) + return; + + /* + LLSD params; + params["group_id"] = group_id; + params["open_tab_name"] = "panel_group_info_sidetray"; + + LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params); + */ + openGroupProfile(group_id); +} + +// static +void LLGroupActions::showTab(const LLUUID& group_id, const std::string& tab_name) +{ + if (group_id.isNull()) return; + + openGroupProfile(group_id)->selectTabByName(tab_name); +} + +/* Singu Note: How could this ever work with a null id, it's only used by llnotificationgrouphandler.cpp which we don't have +void LLGroupActions::refresh_notices() +{ + if(!isGroupUIVisible()) + return; + + LLSD params; + params["group_id"] = LLUUID::null; + params["open_tab_name"] = "panel_group_info_sidetray"; + params["action"] = "refresh_notices"; + + LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params); +} +*/ + +//static +void LLGroupActions::refresh(const LLUUID& group_id) +{ + /* + if(!isGroupUIVisible()) + return; + + LLSD params; + params["group_id"] = group_id; + params["open_tab_name"] = "panel_group_info_sidetray"; + params["action"] = "refresh"; + + LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params); + */ + if (LLFloaterGroupInfo* fgi = LLFloaterGroupInfo::getInstance(group_id)) + if (LLPanelGroup* pg = fgi->mPanelGroupp) + pg->refreshData(); +} + +//static +void LLGroupActions::createGroup() +{ + /* + LLSD params; + params["group_id"] = LLUUID::null; + params["open_tab_name"] = "panel_group_info_sidetray"; + params["action"] = "create"; + + LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params); + */ + openGroupProfile(LLUUID::null); +} +//static +void LLGroupActions::closeGroup(const LLUUID& group_id) +{ + /* + if(!isGroupUIVisible()) + return; + + LLSD params; + params["group_id"] = group_id; + params["open_tab_name"] = "panel_group_info_sidetray"; + params["action"] = "close"; + + LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params); + */ + if (LLFloaterGroupInfo* fgi = LLFloaterGroupInfo::getInstance(group_id)) + fgi->close(); +} + + +// static +LLUUID LLGroupActions::startIM(const LLUUID& group_id) +{ + if (group_id.isNull()) return LLUUID::null; + +// [RLVa:KB] - Checked: 2011-04-11 (RLVa-1.3.0h) | Added: RLVa-1.3.0h + if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canStartIM(group_id)) && (!gIMMgr->hasSession(group_id)) ) + { + make_ui_sound("UISndInvalidOp"); + RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", group_id/*LLSLURL("group", group_id, "about").getSLURLString()*/)); + return LLUUID::null; + } +// [/RLVa:KB] + + LLGroupData group_data; + if (gAgent.getGroupData(group_id, group_data)) + { + static LLCachedControl tear_off("OtherChatsTornOff"); + if (!tear_off) gIMMgr->setFloaterOpen(TRUE); + LLUUID session_id = gIMMgr->addSession( + group_data.mName, + IM_SESSION_GROUP_START, + group_id); + make_ui_sound("UISndStartIM"); + return session_id; + } + else + { + // this should never happen, as starting a group IM session + // relies on you belonging to the group and hence having the group data + make_ui_sound("UISndInvalidOp"); + return LLUUID::null; + } +} + +// static +void LLGroupActions::endIM(const LLUUID& group_id) +{ + if (group_id.isNull()) + return; + + LLUUID session_id = gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id); + if (session_id.notNull()) + { + gIMMgr->removeSession(session_id); + } +} + +// static +bool LLGroupActions::isInGroup(const LLUUID& group_id) +{ + // *TODO: Move all the LLAgent group stuff into another class, such as + // this one. + return gAgent.isInGroup(group_id); +} + +// static +bool LLGroupActions::isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID& avatar_id) +{ + if(group_id.isNull() || avatar_id.isNull()) + { + return false; + } + + LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id); + if(!group_data) + { + return false; + } + + if(group_data->mMembers.end() == group_data->mMembers.find(avatar_id)) + { + return false; + } + + return true; +} + +//-- Private methods ---------------------------------------------------------- + +// static +bool LLGroupActions::onLeaveGroup(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + LLUUID group_id = notification["payload"]["group_id"].asUUID(); + if(option == 0) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_LeaveGroupRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_GroupData); + msg->addUUIDFast(_PREHASH_GroupID, group_id); + gAgent.sendReliableMessage(); + } + return false; +} + +// Singu helper function, open a profile and center it +// static +LLFloaterGroupInfo* LLGroupActions::openGroupProfile(const LLUUID& group_id) +{ + LLFloaterGroupInfo* fgi = LLFloaterGroupInfo::getInstance(group_id); + if (!fgi) fgi = new LLFloaterGroupInfo(group_id); + fgi->center(); + fgi->open(); + return fgi; +} + diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h new file mode 100644 index 000000000..1700929c9 --- /dev/null +++ b/indra/newview/llgroupactions.h @@ -0,0 +1,125 @@ +/** + * @file llgroupactions.h + * @brief Group-related actions (join, leave, new, delete, etc) + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLGROUPACTIONS_H +#define LL_LLGROUPACTIONS_H + +class LLFloaterGroupInfo; + +/** + * Group-related actions (join, leave, new, delete, etc) + */ +class LLGroupActions +{ +public: + /** + * Invokes group search floater. + */ + static void search(); + + /// Join a group. Assumes LLGroupMgr has data for that group already. + static void join(const LLUUID& group_id); + + /** + * Invokes "Leave Group" floater. + */ + static void leave(const LLUUID& group_id); + + /** + * Activate group. + */ + static void activate(const LLUUID& group_id); + + /** + * Show group information panel. + */ + static void show(const LLUUID& group_id); + + /** + * Show group information panel, with specific tab open. + */ + static void showTab(const LLUUID& group_id, const std::string& tab_name); + + /** + * Show group inspector floater. + */ + static void inspect(const LLUUID& group_id); + + /** + * Refresh group information panel. + */ + static void refresh(const LLUUID& group_id); + + /** + * Refresh group notices panel. + */ + static void refresh_notices(); + + /** + * Refresh group information panel. + */ + static void createGroup(); + + /** + * Close group information panel. + */ + static void closeGroup(const LLUUID& group_id); + + /** + * Start group instant messaging session. + */ + static LLUUID startIM(const LLUUID& group_id); + + /** + * End group instant messaging session. + */ + static void endIM(const LLUUID& group_id); + + /// Returns if the current user is a member of the group + static bool isInGroup(const LLUUID& group_id); + + /** + * Start a group voice call. + */ + static void startCall(const LLUUID& group_id); + + /** + * Returns true if avatar is in group. + * + * Note that data about group members is loaded from server. + * If data has not been loaded yet, function will return inaccurate result. + * See LLGroupMgr::sendGroupMembersRequest + */ + static bool isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID& avatar_id); + +private: + static bool onJoinGroup(const LLSD& notification, const LLSD& response); + static bool onLeaveGroup(const LLSD& notification, const LLSD& response); + static LLFloaterGroupInfo* openGroupProfile(const LLUUID& group_id); +}; + +#endif // LL_LLGROUPACTIONS_H + diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 8b7ef5c6f..70eddbcdc 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -44,11 +44,10 @@ #include "lltransactiontypes.h" #include "llstatusbar.h" #include "lleconomy.h" -#include "llviewercontrol.h" #include "llviewerregion.h" #include "llviewerwindow.h" #include "llfloaterdirectory.h" -#include "llfloatergroupinfo.h" +#include "llgroupactions.h" #include "llnotificationsutil.h" #include "lluictrlfactory.h" #include "lltrans.h" @@ -1361,7 +1360,7 @@ void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data // If we had a failure, the group panel needs to be updated. if (!success) { - LLFloaterGroupInfo::refreshGroup(group_id); + LLGroupActions::refresh(group_id); } } @@ -1381,7 +1380,7 @@ void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data) LLGroupMgr::getInstance()->clearGroupData(group_id); // refresh the floater for this group, if any. - LLFloaterGroupInfo::refreshGroup(group_id); + LLGroupActions::refresh(group_id); // refresh the group panel of the search window, if necessary. LLFloaterDirectory::refreshGroup(group_id); } @@ -1403,7 +1402,7 @@ void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data) LLGroupMgr::getInstance()->clearGroupData(group_id); // close the floater for this group, if any. - LLFloaterGroupInfo::closeGroup(group_id); + LLGroupActions::closeGroup(group_id); // refresh the group panel of the search window, if necessary. LLFloaterDirectory::refreshGroup(group_id); } @@ -1439,8 +1438,8 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data) gAgent.mGroups.push_back(gd); - LLFloaterGroupInfo::closeCreateGroup(); - LLFloaterGroupInfo::showFromUUID(group_id,"roles_tab"); + LLGroupActions::closeGroup(LLUUID::null); + LLGroupActions::showTab(group_id, "roles_tab"); } else { diff --git a/indra/newview/llgroupnotify.cpp b/indra/newview/llgroupnotify.cpp index dd0667288..ca9c834f8 100644 --- a/indra/newview/llgroupnotify.cpp +++ b/indra/newview/llgroupnotify.cpp @@ -39,13 +39,13 @@ #include "llbutton.h" #include "lliconctrl.h" #include "llfloaterchat.h" // for add_chat_history() +#include "llgroupactions.h" #include "llnotify.h" #include "lltextbox.h" #include "llviewertexteditor.h" #include "lluiconstants.h" #include "llui.h" #include "llviewercontrol.h" -#include "llfloatergroupinfo.h" #include "llinventoryicon.h" #include "llinventory.h" #include "lltrans.h" @@ -279,7 +279,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const std::string& subject, wide_btn_width, BTN_HEIGHT); - btn = new LLButton(LLTrans::getString("GroupNotifyGroupNotices"), btn_rect, LLStringUtil::null, boost::bind(&LLGroupNotifyBox::onClickGroupInfo,this)); + btn = new LLButton(LLTrans::getString("GroupNotifyGroupNotices"), btn_rect, LLStringUtil::null, boost::bind(LLGroupActions::showTab, mGroupID, "notices_tab")); btn->setToolTip(LLTrans::getString("GroupNotifyViewPastNotices")); addChild(btn, -1); @@ -457,12 +457,6 @@ void LLGroupNotifyBox::onClickOk() close(); } -void LLGroupNotifyBox::onClickGroupInfo() -{ - LLFloaterGroupInfo::showFromUUID(mGroupID, "notices_tab"); - //Leave notice open until explicitly closed -} - void LLGroupNotifyBox::onClickSaveInventory() { mInventoryOffer->forceResponse(IOR_ACCEPT); diff --git a/indra/newview/llgroupnotify.h b/indra/newview/llgroupnotify.h index 1a0819577..bd19ccd89 100644 --- a/indra/newview/llgroupnotify.h +++ b/indra/newview/llgroupnotify.h @@ -90,7 +90,6 @@ protected: // internal handler for button being clicked void onClickOk(); - void onClickGroupInfo(); void onClickSaveInventory(); // for "next" button diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 4ccab4186..47c968056 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -50,6 +50,7 @@ #include "llcallingcard.h" #include "llchat.h" #include "llconsole.h" +#include "llgroupactions.h" #include "llfloateractivespeakers.h" #include "llfloaterchat.h" #include "llfloatergroupinfo.h" @@ -1363,7 +1364,7 @@ BOOL LLFloaterIMPanel::postBuild() if (LLButton* btn = findChild("profile_tele_btn")) btn->setCommitCallback(boost::bind(static_cast(LLAvatarActions::offerTeleport), mOtherParticipantUUID)); if (LLButton* btn = findChild("group_info_btn")) - btn->setCommitCallback(boost::bind(&LLFloaterIMPanel::onClickGroupInfo, this)); + btn->setCommitCallback(boost::bind(LLGroupActions::show, mSessionUUID)); childSetAction("history_btn", onClickHistory, this); if (LLUICtrl* ctrl = findChild("rp_mode")) ctrl->setCommitCallback(boost::bind(&LLFloaterIMPanel::onRPMode, this, _2)); @@ -1374,9 +1375,6 @@ BOOL LLFloaterIMPanel::postBuild() if (LLButton* btn = findChild("toggle_active_speakers_btn")) btn->setCommitCallback(boost::bind(&LLFloaterIMPanel::onClickToggleActiveSpeakers, this, _2)); - //LLButton* close_btn = getChild("close_btn"); - //close_btn->setClickedCallback(&LLFloaterIMPanel::onClickClose, this); - mHistoryEditor = getChild("im_history"); mHistoryEditor->setParseHTML(TRUE); mHistoryEditor->setParseHighlights(TRUE); @@ -1899,22 +1897,6 @@ void LLFloaterIMPanel::onClickHistory( void* userdata ) } } -void LLFloaterIMPanel::onClickGroupInfo() -{ - // Bring up the Profile window - LLFloaterGroupInfo::showFromUUID(mSessionUUID); -} - -// static -void LLFloaterIMPanel::onClickClose( void* userdata ) -{ - LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata; - if(self) - { - self->close(); - } -} - // static void LLFloaterIMPanel::onClickStartCall(void* userdata) { diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h index 0d4ecc9ae..3c42228ba 100644 --- a/indra/newview/llimpanel.h +++ b/indra/newview/llimpanel.h @@ -241,8 +241,6 @@ public: static void onClickHistory( void* userdata ); void onRPMode(const LLSD& value); - void onClickGroupInfo(); - static void onClickClose( void* userdata ); static void onClickStartCall( void* userdata ); static void onClickEndCall( void* userdata ); void onClickToggleActiveSpeakers(const LLSD& value); diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 1df44e508..524de0fb0 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -51,6 +51,7 @@ #include "llfloatergroupinfo.h" #include "llfloatermute.h" #include "llfloateravatarinfo.h" +#include "llgroupactions.h" #include "lllineeditor.h" #include "llnameeditor.h" #include "llnotificationsutil.h" @@ -430,18 +431,14 @@ void LLPanelAvatarSecondLife::onClickImage(void* data) void LLPanelAvatarSecondLife::onDoubleClickGroup(void* data) { LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*)data; - LLScrollListCtrl* group_list = self->getChild("groups"); if(group_list) { LLScrollListItem* item = group_list->getFirstSelected(); - - if(item && item->getUUID().notNull()) + if (item) { - llinfos << "Show group info " << item->getUUID() << llendl; - - LLFloaterGroupInfo::showFromUUID(item->getUUID()); + LLGroupActions::show(item->getUUID()); } } } diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index e45f0608a..619f89e84 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -125,18 +125,14 @@ void LLPanelGroupTab::handleClickHelp() } } -LLPanelGroup::LLPanelGroup(const std::string& filename, - const std::string& name, - const LLUUID& group_id, - const std::string& initial_tab_selected) -: LLPanel(name, LLRect(), FALSE), +LLPanelGroup::LLPanelGroup(const LLUUID& group_id) +: LLPanel("PanelGroup", LLRect(), FALSE), LLGroupMgrObserver( group_id ), mCurrentTab( NULL ), mRequestedTab( NULL ), mTabContainer( NULL ), mIgnoreTransition( FALSE ), mForceClose( FALSE ), - mInitialTab(initial_tab_selected), mAllowEdit( TRUE ), mShowingNotifyDialog( FALSE ) { @@ -159,18 +155,14 @@ LLPanelGroup::LLPanelGroup(const std::string& filename, LLGroupMgr::getInstance()->addObserver(this); // Pass on construction of this panel to the control factory. - LLUICtrlFactory::getInstance()->buildPanel(this, filename, &getFactoryMap()); - mFilename = filename; + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group.xml", &getFactoryMap()); } LLPanelGroup::~LLPanelGroup() { LLGroupMgr::getInstance()->removeObserver(this); - int i; - int tab_count = mTabContainer->getTabCount(); - - for (i = tab_count - 1; i >=0; --i) + for (int i = mTabContainer->getTabCount() - 1; i >=0; --i) { LLPanelGroupTab* panelp = (LLPanelGroupTab*) mTabContainer->getPanelByIndex(i); @@ -181,10 +173,7 @@ LLPanelGroup::~LLPanelGroup() void LLPanelGroup::updateTabVisibility() { - S32 i; - S32 tab_count = mTabContainer->getTabCount(); - - for (i = tab_count - 1; i >=0; --i) + for (int i = mTabContainer->getTabCount() - 1; i >=0; --i) { LLPanelGroupTab* panelp = (LLPanelGroupTab*) mTabContainer->getPanelByIndex(i); @@ -211,38 +200,23 @@ BOOL LLPanelGroup::postBuild() if (mTabContainer) { - // Select the initial tab specified via constructor - const BOOL recurse = TRUE; - LLPanelGroupTab* tabp = - getChild(mInitialTab, recurse); + //our initial tab selection was invalid, just select the + //first tab then or default to selecting the initial + //selected tab specified in the layout file + LLPanelGroupTab* tabp = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); + //no tab was initially selected through constructor + //or the XML, select the first tab if (!tabp) { - //our initial tab selection was invalid, just select the - //first tab then or default to selecting the initial - //selected tab specified in the layout file + mTabContainer->selectFirstTab(); tabp = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); - - //no tab was initially selected through constructor - //or the XML, select the first tab - if (!tabp) - { - mTabContainer->selectFirstTab(); - tabp = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); - } - } - else - { - mTabContainer->selectTabPanel(tabp); } mCurrentTab = tabp; // Add click callbacks. - S32 i; - S32 tab_count = mTabContainer->getTabCount(); - - for (i = tab_count - 1; i >=0; --i) + for (int i = mTabContainer->getTabCount() - 1; i >=0; --i) { LLPanel* tab_panel = mTabContainer->getPanelByIndex(i); LLPanelGroupTab* panelp =(LLPanelGroupTab*)tab_panel; // bit of a hack @@ -342,8 +316,6 @@ void LLPanelGroup::handleClickTab() void LLPanelGroup::setGroupID(const LLUUID& group_id) { - LLRect rect(getRect()); - LLGroupMgr::getInstance()->removeObserver(this); mID = group_id; LLGroupMgr::getInstance()->addObserver(this); @@ -355,7 +327,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) // For now, rebuild panel //delete children and rebuild panel deleteAllChildren(); - LLUICtrlFactory::getInstance()->buildPanel(this, mFilename, &getFactoryMap()); + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group.xml", &getFactoryMap()); } void LLPanelGroup::selectTab(std::string tab_name) diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 7180799a4..e652b96b6 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -58,10 +58,7 @@ class LLPanelGroup : public LLPanel, public LLPanelGroupTabObserver { public: - LLPanelGroup(const std::string& filename, - const std::string& name, - const LLUUID& group_id, - const std::string& initial_tab_selected = std::string()); + LLPanelGroup(const LLUUID& group_id); virtual ~LLPanelGroup(); virtual BOOL postBuild(); @@ -119,9 +116,6 @@ protected: BOOL mForceClose; - std::string mInitialTab; - std::string mFilename; - std::string mDefaultNeedsApplyMesg; std::string mWantApplyMesg; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 1851ac29b..55b5b70ad 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -37,8 +37,9 @@ #include "lluictrlfactory.h" #include "llagent.h" #include "llavataractions.h" +#include "llfloatergroups.h" +#include "llgroupactions.h" #include "roles_constants.h" -#include "llfloatergroupinfo.h" // UI elements #include "llbutton.h" @@ -133,13 +134,13 @@ BOOL LLPanelGroupGeneral::postBuild() mBtnJoinGroup = getChild("join_button", recurse); if ( mBtnJoinGroup ) { - mBtnJoinGroup->setClickedCallback(boost::bind(&LLPanelGroupGeneral::onClickJoin, this)); + mBtnJoinGroup->setClickedCallback(boost::bind(LLGroupActions::join, mGroupID)); } mBtnInfo = getChild("info_button", recurse); if ( mBtnInfo ) { - mBtnInfo->setClickedCallback(boost::bind(&LLPanelGroupGeneral::onClickInfo, this)); + mBtnInfo->setClickedCallback(boost::bind(LLGroupActions::show, mGroupID)); } LLTextBox* founder = getChild("founder_name"); @@ -154,7 +155,7 @@ BOOL LLPanelGroupGeneral::postBuild() mListVisibleMembers = getChild("visible_members", recurse); if (mListVisibleMembers) { - mListVisibleMembers->setDoubleClickCallback(boost::bind(&LLPanelGroupGeneral::openProfile,this)); + mListVisibleMembers->setDoubleClickCallback(boost::bind(LLAvatarActions::showProfile, boost::bind(&LLScrollListCtrl::getCurrentID, mListVisibleMembers))); } // Options @@ -322,83 +323,6 @@ void LLPanelGroupGeneral::onCommitTitle() mComboActiveTitle->resetDirty(); } -// static -void LLPanelGroupGeneral::onClickInfo(void *userdata) -{ - LLPanelGroupGeneral *self = (LLPanelGroupGeneral *)userdata; - - if ( !self ) return; - - lldebugs << "open group info: " << self->mGroupID << llendl; - - LLFloaterGroupInfo::showFromUUID(self->mGroupID); -} - -// static -void LLPanelGroupGeneral::onClickJoin(void *userdata) -{ - LLPanelGroupGeneral *self = (LLPanelGroupGeneral *)userdata; - - if ( !self ) return; - - lldebugs << "joining group: " << self->mGroupID << llendl; - - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(self->mGroupID); - - if (gdatap) - { - S32 cost = gdatap->mMembershipFee; - LLSD args; - args["COST"] = llformat("%d", cost); - LLSD payload; - payload["group_id"] = self->mGroupID; - - if (can_afford_transaction(cost)) - { - LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, LLPanelGroupGeneral::joinDlgCB); - } - else - { - LLNotificationsUtil::add("JoinGroupCannotAfford", args, payload); - } - } - else - { - llwarns << "LLGroupMgr::getInstance()->getGroupData(" << self->mGroupID - << ") was NULL" << llendl; - } -} - -// static -bool LLPanelGroupGeneral::joinDlgCB(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - - if (option == 1) - { - // user clicked cancel - return false; - } - - LLGroupMgr::getInstance()->sendGroupMemberJoin(notification["payload"]["group_id"].asUUID()); - return false; -} - -// static -void LLPanelGroupGeneral::openProfile(void* data) -{ - LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; - - if (self && self->mListVisibleMembers) - { - LLScrollListItem* selected = self->mListVisibleMembers->getFirstSelected(); - if (selected) - { - LLAvatarActions::showProfile(selected->getUUID()); - } - } -} - bool LLPanelGroupGeneral::needsApply(std::string& mesg) { updateChanged(); diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index db400ad7c..84058ac84 100644 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -75,14 +75,9 @@ private: void onCommitUserOnly(); void onCommitTitle(); void onCommitEnrollment(); - static void onClickJoin(void* userdata); - static void onClickInfo(void* userdata); static void onReceiveNotices(LLUICtrl* ctrl, void* data); - static void openProfile(void* data); void addMember(LLGroupMemberData* member); - static bool joinDlgCB(const LLSD& notification, const LLSD& response); - void updateMembers(); void updateChanged(); bool confirmMatureApply(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index c1c29be8d..6b4d0e680 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -39,6 +39,7 @@ #include "llbutton.h" #include "llcallingcard.h" #include "llcombobox.h" +#include "llgroupactions.h" #include "llgroupmgr.h" #include "llnamelistctrl.h" #include "llnotificationsutil.h" @@ -49,8 +50,6 @@ #include "lluictrlfactory.h" #include "llviewerwindow.h" -#include - class LLPanelGroupInvite::impl : public boost::signals2::trackable { public: @@ -183,7 +182,7 @@ void LLPanelGroupInvite::impl::submitInvitations() iter != items.end(); ++iter) { LLScrollListItem* item = *iter; - if(gdatap->mMembers.find(item->getUUID()) != gdatap->mMembers.end()) + if(LLGroupActions::isAvatarMemberOfGroup(mGroupID, item->getUUID())) { already_in_group = true; continue; diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index d09766643..b40d6258d 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -52,12 +52,12 @@ #include "llselectmgr.h" #include "llagent.h" #include "llavataractions.h" +#include "llfloatergroups.h" +#include "llgroupactions.h" #include "lllineeditor.h" #include "llradiogroup.h" #include "llcombobox.h" #include "lldbstrings.h" -#include "llfloatergroupinfo.h" -#include "llfloatergroups.h" #include "llnamebox.h" #include "lluictrlfactory.h" #include "roles_constants.h" @@ -1013,7 +1013,7 @@ void LLPanelPermissions::onClickOwner(void *data) { LLUUID group_id; LLSelectMgr::getInstance()->selectGetGroup(group_id); - LLFloaterGroupInfo::showFromUUID(group_id); + LLGroupActions::show(group_id); } else { @@ -1064,7 +1064,7 @@ void LLPanelPermissions::onClickOpenGroup(void* data) LLUUID group_id; LLSelectMgr::getInstance()->selectGetGroup(group_id); - LLFloaterGroupInfo::showFromUUID(group_id); + LLGroupActions::show(group_id); } // static diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9eb7ddde0..324b56459 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -60,7 +60,6 @@ #include "llfloaterbuycurrency.h" #include "llfloaterbuyland.h" #include "llfloaterchat.h" -#include "llfloatergroupinfo.h" #include "llfloaterimagepreview.h" #include "llfloaterland.h" #include "llfloaterregioninfo.h" @@ -69,6 +68,7 @@ #include "llfloaterpostcard.h" #include "llfloaterpreference.h" #include "llfloaterteleporthistory.h" +#include "llgroupactions.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llimpanel.h" @@ -639,7 +639,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response) if (option == 2 && !group_id.isNull()) { - LLFloaterGroupInfo::showFromUUID(group_id); + LLGroupActions::show(group_id); LLSD args; args["MESSAGE"] = message; LLNotificationsUtil::add("JoinGroup", args, notification["payload"]); @@ -1780,7 +1780,7 @@ bool group_vote_callback(const LLSD& notification, const LLSD& response) case 0: // Vote Now // Open up the voting tab - LLFloaterGroupInfo::showFromUUID(group_id, "voting_tab"); + LLGroupActions::showTab(group_id, "voting_tab"); break; default: // Vote Later or @@ -2529,16 +2529,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) args["MESSAGE"] = mes; LLNotifications::instance().add(LLNotification::Params("GroupNotice").substitutions(args).payload(payload).timestamp(timestamp)); } - - // Also send down the old path for now. - if (IM_GROUP_NOTICE_REQUESTED == dialog) - { - LLFloaterGroupInfo::showNotice(subj,mes,group_id,has_inventory,item_name,info); - } - else - { - delete info; - } } break; case IM_GROUP_INVITATION: diff --git a/indra/newview/skins/default/xui/en-us/notifications.xml b/indra/newview/skins/default/xui/en-us/notifications.xml index 4ed0e5f03..f44950569 100644 --- a/indra/newview/skins/default/xui/en-us/notifications.xml +++ b/indra/newview/skins/default/xui/en-us/notifications.xml @@ -711,6 +711,21 @@ Do you wish to proceed? yestext="Join"/> + +You are joining group [NAME]. +Do you wish to proceed? + group + confirm + + + + + +You have reached your maximum number of groups. Please leave some group before joining or creating a new one. + group + fail + + + + + Vas a entrar al grupo [NAME]. +¿Quieres seguir? + + + Unirse a este grupo cuesta [CURRENCY][COST]. No tienes suficientes [CURRENCY] para unirte a este grupo. @@ -1879,6 +1885,11 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re + + Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno. + + + ¿Con qué mensaje se expulsará a este usuario?
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 8ef13a325..cfaf862c3 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -264,6 +264,12 @@ Voulez-vous continuer ? + +Vous vous apprêtez à rejoindre le groupe [NAME]. +Voulez-vous continuer ? + + + Rejoindre ce groupe coûte [COST] [CURRENCY]. Vous n'avez pas suffisamment de [CURRENCY] pour rejoindre ce groupe. @@ -1606,6 +1612,11 @@ Pour quitter un groupe, sélectionnez l'option Groupe dans le menu Éditer. + +Vous avez atteint le nombre de groupes maximum. Vous devez en quitter un avant d'en rejoindre ou d'en créer un nouveau. + + + Éjecter cet utilisateur avec quel message ? diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 8b3c3b1c9..ca1be16f8 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -274,6 +274,11 @@ Outros residentes podem visitar a URL que você definiu, quando eles olharem seu Deseja prosseguir? + + Você está prestes a entrar no grupo [NAME]. +Deseja continuar? + + Associar-se a este grupo custa [CURRENCY][COST]. Você não tem [CURRENCY] suficientes para associar-se a este grupo. @@ -1623,6 +1628,11 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i + + Você atingiu o limite máximo de grupos. Sai de um grupo para entrar ou criar outro. + + + Expulsar este usuário com qual mensagem?