LLGroupActions too! (Strengthens RLVa restrictions!)

Cleans up llfloatergroupinfo, makes it an instance tracker... pretty much as nice as llfloateravatarinfo now ^*^
Adds notifications JoinGroupNoCost and JoinedTooManyGroups (added to our existing translations, of course)
Cleans up all around, placing groupactions around.

Touches up bits for avataractions
This commit is contained in:
Lirusaito
2013-05-31 07:37:00 -04:00
parent 8d10a21a7a
commit fcd6f217d2
34 changed files with 890 additions and 654 deletions

View File

@@ -91,6 +91,7 @@ set(viewer_SOURCE_FILES
floatervoicelicense.cpp floatervoicelicense.cpp
generichandlers.cpp generichandlers.cpp
hbfloatergrouptitles.cpp hbfloatergrouptitles.cpp
groupchatlistener.cpp
hippofloaterxml.cpp hippofloaterxml.cpp
hippogridmanager.cpp hippogridmanager.cpp
hippolimits.cpp hippolimits.cpp
@@ -272,6 +273,7 @@ set(viewer_SOURCE_FILES
llgiveinventory.cpp llgiveinventory.cpp
llgivemoney.cpp llgivemoney.cpp
llglsandbox.cpp llglsandbox.cpp
llgroupactions.cpp
llgroupmgr.cpp llgroupmgr.cpp
llgroupnotify.cpp llgroupnotify.cpp
llhomelocationresponder.cpp llhomelocationresponder.cpp
@@ -587,6 +589,7 @@ set(viewer_HEADER_FILES
floaterlocalassetbrowse.h floaterlocalassetbrowse.h
floatervoicelicense.h floatervoicelicense.h
generichandlers.h generichandlers.h
groupchatlistener.h
hbfloatergrouptitles.h hbfloatergrouptitles.h
hippofloaterxml.h hippofloaterxml.h
hippogridmanager.h hippogridmanager.h
@@ -770,6 +773,7 @@ set(viewer_HEADER_FILES
llgesturemgr.h llgesturemgr.h
llgiveinventory.h llgiveinventory.h
llgivemoney.h llgivemoney.h
llgroupactions.h
llgroupmgr.h llgroupmgr.h
llgroupnotify.h llgroupnotify.h
llhomelocationresponder.h llhomelocationresponder.h

View File

@@ -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);
*/

View File

@@ -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) */

View File

@@ -40,6 +40,7 @@
#include "hbfloatergrouptitles.h" #include "hbfloatergrouptitles.h"
#include "llagent.h" #include "llagent.h"
#include "llgroupactions.h"
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "llviewercontrol.h" #include "llviewercontrol.h"
@@ -145,13 +146,7 @@ void HBFloaterGroupTitles::onActivate(void* userdata)
LLUUID group_id = item->getColumn(LIST_GROUP_ID)->getValue().asUUID(); LLUUID group_id = item->getColumn(LIST_GROUP_ID)->getValue().asUUID();
if (group_id != old_group_id) if (group_id != old_group_id)
{ {
LLMessageSystem* msg = gMessageSystem; LLGroupActions::activate(group_id);
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();
} }
// Set the title // Set the title

View File

@@ -43,6 +43,7 @@
#include "llfirstuse.h" #include "llfirstuse.h"
#include "llfloatercamera.h" #include "llfloatercamera.h"
#include "llfloatertools.h" #include "llfloatertools.h"
#include "llgroupactions.h"
#include "llgroupmgr.h" #include "llgroupmgr.h"
#include "llhomelocationresponder.h" #include "llhomelocationresponder.h"
#include "llhudmanager.h" #include "llhudmanager.h"
@@ -3247,7 +3248,7 @@ BOOL LLAgent::downGrabbed() const
void update_group_floaters(const LLUUID& group_id) void update_group_floaters(const LLUUID& group_id)
{ {
LLFloaterGroupInfo::refreshGroup(group_id); LLGroupActions::refresh(group_id);
// update avatar info // update avatar info
LLFloaterAvatarInfo* fa = LLFloaterAvatarInfo::getInstance(gAgent.getID()); LLFloaterAvatarInfo* fa = LLFloaterAvatarInfo::getInstance(gAgent.getID());
@@ -3300,7 +3301,7 @@ void LLAgent::processAgentDropGroup(LLMessageSystem *msg, void **)
LLGroupMgr::getInstance()->clearGroupData(group_id); LLGroupMgr::getInstance()->clearGroupData(group_id);
// close the floater for this group, if any. // 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. // refresh the group panel of the search window, if necessary.
LLFloaterDirectory::refreshGroup(group_id); LLFloaterDirectory::refreshGroup(group_id);
} }
@@ -3379,7 +3380,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode
LLGroupMgr::getInstance()->clearGroupData(group_id); LLGroupMgr::getInstance()->clearGroupData(group_id);
// close the floater for this group, if any. // close the floater for this group, if any.
LLFloaterGroupInfo::closeGroup(group_id); LLGroupActions::closeGroup(group_id);
// refresh the group panel of the search window, // refresh the group panel of the search window,
//if necessary. //if necessary.
LLFloaterDirectory::refreshGroup(group_id); LLFloaterDirectory::refreshGroup(group_id);

View File

@@ -389,9 +389,7 @@ void* LLFloaterDirectory::createEventDetail(void* userdata)
void* LLFloaterDirectory::createGroupDetail(void* userdata) void* LLFloaterDirectory::createGroupDetail(void* userdata)
{ {
LLFloaterDirectory *self = (LLFloaterDirectory*)userdata; LLFloaterDirectory *self = (LLFloaterDirectory*)userdata;
self->mPanelGroupp = new LLPanelGroup("panel_group.xml", self->mPanelGroupp = new LLPanelGroup(gAgent.getGroupID());
"PanelGroup",
gAgent.getGroupID());
self->mPanelGroupp->setAllowEdit(FALSE || gAgent.isGodlike()); // Gods can always edit panels self->mPanelGroupp->setAllowEdit(FALSE || gAgent.isGodlike()); // Gods can always edit panels
self->mPanelGroupp->setVisible(FALSE); self->mPanelGroupp->setVisible(FALSE);
return self->mPanelGroupp; return self->mPanelGroupp;

View File

@@ -36,100 +36,30 @@
#include "llfloatergroupinfo.h" #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 "llcachename.h"
#include "llpanelgroup.h"
const char FLOATER_TITLE[] = "Group Information"; const char FLOATER_TITLE[] = "Group Information";
const LLRect FGI_RECT(0, 530, 420, 0);
//
// Globals
//
std::map<LLUUID, LLFloaterGroupInfo*> 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 // Implementation
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
LLFloaterGroupInfo::LLFloaterGroupInfo(const std::string& name, const LLRect &rect, const std::string& title, const LLUUID& group_id, const std::string& tab_name) LLFloaterGroupInfo::LLFloaterGroupInfo(const LLUUID& group_id)
: LLFloater(name, rect, title), : LLFloater(FLOATER_TITLE, LLRect(0, 530, 420, 0), FLOATER_TITLE), LLInstanceTracker<LLFloaterGroupInfo, LLUUID>(group_id)
mGroupID( 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. // Construct the filename of the group panel xml definition file.
mPanelGroupp = new LLPanelGroup("panel_group.xml", mPanelGroupp = new LLPanelGroup(group_id);
"PanelGroup",
group_id,
tab_name);
addChild(mPanelGroupp); 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 // virtual
LLFloaterGroupInfo::~LLFloaterGroupInfo() LLFloaterGroupInfo::~LLFloaterGroupInfo()
{ {
sInstances.erase(mGroupID);
} }
BOOL LLFloaterGroupInfo::canClose() BOOL LLFloaterGroupInfo::canClose()
@@ -147,125 +77,11 @@ void LLFloaterGroupInfo::selectTabByName(std::string tab_name)
mPanelGroupp->selectTab(tab_name); mPanelGroupp->selectTab(tab_name);
} }
// static void LLFloaterGroupInfo::callbackLoadGroupName(const std::string& full_name)
void LLFloaterGroupInfo::showMyGroupInfo(void *)
{ {
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);
}

View File

@@ -39,48 +39,29 @@
#define LL_LLFLOATERGROUPINFO_H #define LL_LLFLOATERGROUPINFO_H
#include "llfloater.h" #include "llfloater.h"
#include "lluuid.h" #include "llinstancetracker.h"
class LLPanelGroup; class LLPanelGroup;
struct LLOfferInfo;
class LLFloaterGroupInfo class LLFloaterGroupInfo
: public LLFloater : public LLFloater, public LLInstanceTracker<LLFloaterGroupInfo, LLUUID>
{ {
public: public:
LLFloaterGroupInfo(const LLUUID& group_id);
virtual ~LLFloaterGroupInfo(); 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); void selectTabByName(std::string tab_name);
// This allow us to block the user from closing the floater // This allows us to block the user from closing the floater if there is information that needs to be applied.
// if there is information that needs to be applied.
virtual BOOL canClose(); virtual BOOL canClose();
protected: 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: private:
static void callbackLoadGroupName(const LLUUID& id, const std::string& full_name, bool is_group); void callbackLoadGroupName(const std::string& full_name);
static std::map<LLUUID, LLFloaterGroupInfo*> sInstances;
LLUUID mGroupID;
LLPanelGroup* mPanelGroupp;
}; };
#endif #endif

View File

@@ -51,6 +51,7 @@
#include "llfloatergroupinfo.h" #include "llfloatergroupinfo.h"
#include "llfloaterdirectory.h" #include "llfloaterdirectory.h"
#include "llfocusmgr.h" #include "llfocusmgr.h"
#include "llgroupactions.h"
#include "llselectmgr.h" #include "llselectmgr.h"
#include "llscrolllistctrl.h" #include "llscrolllistctrl.h"
#include "llnotificationsutil.h" #include "llnotificationsutil.h"
@@ -218,23 +219,23 @@ BOOL LLPanelGroups::postBuild()
init_group_list(group_list, gAgent.getGroupID(), none_text); init_group_list(group_list, gAgent.getGroupID(), none_text);
group_list->setCommitCallback(boost::bind(&LLPanelGroups::onGroupList,this)); 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->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<LLUICtrl>("Activate")->setCommitCallback(boost::bind(LLGroupActions::activate, boost::bind(&LLScrollListCtrl::getCurrentID, group_list)));
childSetAction("Info", onBtnInfo, this); getChild<LLUICtrl>("Info")->setCommitCallback(boost::bind(LLGroupActions::show, boost::bind(&LLScrollListCtrl::getCurrentID, group_list)));
childSetAction("IM", onBtnIM, this); getChild<LLUICtrl>("IM")->setCommitCallback(boost::bind(LLGroupActions::startIM, boost::bind(&LLScrollListCtrl::getCurrentID, group_list)));
childSetAction("Leave", onBtnLeave, this); getChild<LLUICtrl>("Leave")->setCommitCallback(boost::bind(LLGroupActions::leave, boost::bind(&LLScrollListCtrl::getCurrentID, group_list)));
childSetAction("Create", onBtnCreate, this); getChild<LLUICtrl>("Create")->setCommitCallback(boost::bind(LLGroupActions::createGroup));
childSetAction("Search...", onBtnSearch, this); getChild<LLUICtrl>("Search...")->setCommitCallback(boost::bind(LLGroupActions::search));
childSetAction("Invite...", onBtnInvite, this); childSetAction("Invite...", onBtnInvite, this);
childSetAction("Titles...", onBtnTitles, this); getChild<LLUICtrl>("Titles...")->setCommitCallback(boost::bind(HBFloaterGroupTitles::toggle));
setDefaultBtn("IM"); 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) void LLPanelGroups::onBtnInvite(void* userdata)
{ {
LLPanelGroups* self = (LLPanelGroups*)userdata; LLPanelGroups* self = (LLPanelGroups*)userdata;
if(self) self->invite(); 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<bool> 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() void LLPanelGroups::invite()
{ {
LLCtrlListInterface *group_list = childGetListInterface("group list"); LLCtrlListInterface *group_list = childGetListInterface("group list");
@@ -447,31 +313,6 @@ void LLPanelGroups::invite()
LLFloaterGroupInvite::showForGroup(group_id); 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() void LLPanelGroups::onGroupSortChanged()
{ {
LLScrollListCtrl *group_list = getChild<LLScrollListCtrl>("group list"); LLScrollListCtrl *group_list = getChild<LLScrollListCtrl>("group list");

View File

@@ -52,7 +52,6 @@ class LLUICtrl;
class LLTextBox; class LLTextBox;
class LLScrollListCtrl; class LLScrollListCtrl;
class LLButton; class LLButton;
class LLFloaterGroupPicker;
class LLFloaterGroupPicker : public LLFloater, public LLUIFactory<LLFloaterGroupPicker, LLFloaterGroupPicker, VisibilityPolicy<LLFloater> > class LLFloaterGroupPicker : public LLFloater, public LLUIFactory<LLFloaterGroupPicker, LLFloaterGroupPicker, VisibilityPolicy<LLFloater> >
{ {
@@ -105,29 +104,8 @@ protected:
void onGroupSortChanged(); void onGroupSortChanged();
void onGroupList(); 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 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 invite();
void titles();
static bool callbackLeaveGroup(const LLSD& notification, const LLSD& response);
}; };

View File

@@ -58,6 +58,7 @@
#include "llfloatergroups.h" #include "llfloatergroups.h"
#include "llfloatergroupinfo.h" #include "llfloatergroupinfo.h"
#include "llfloaterscriptlimits.h" #include "llfloaterscriptlimits.h"
#include "llgroupactions.h"
#include "lllineeditor.h" #include "lllineeditor.h"
#include "llnamelistctrl.h" #include "llnamelistctrl.h"
#include "llnotify.h" #include "llnotify.h"
@@ -848,8 +849,7 @@ void LLPanelLandGeneral::onClickInfoGroup(void* userdata)
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)userdata; LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)userdata;
LLParcel* parcel = panelp->mParcel->getParcel(); LLParcel* parcel = panelp->mParcel->getParcel();
if (!parcel) return; if (!parcel) return;
LLUUID id = parcel->getGroupID(); LLGroupActions::show(parcel->getGroupID());
if(id.notNull())LLFloaterGroupInfo::showFromUUID(parcel->getGroupID());
} }
void LLPanelLandGeneral::onClickProfile() void LLPanelLandGeneral::onClickProfile()
@@ -859,8 +859,7 @@ void LLPanelLandGeneral::onClickProfile()
if (parcel->getIsGroupOwned()) if (parcel->getIsGroupOwned())
{ {
const LLUUID& group_id = parcel->getGroupID(); LLGroupActions::show(parcel->getGroupID());
LLFloaterGroupInfo::showFromUUID(group_id);
} }
else else
{ {
@@ -1178,7 +1177,7 @@ void LLPanelLandObjects::onDoubleClickOwner(void *userdata)
BOOL is_group = cell->getValue().asString() == OWNER_GROUP; BOOL is_group = cell->getValue().asString() == OWNER_GROUP;
if (is_group) if (is_group)
{ {
LLFloaterGroupInfo::showFromUUID(owner_id); LLGroupActions::show(owner_id);
} }
else else
{ {

View File

@@ -42,8 +42,8 @@
#include "llagent.h" #include "llagent.h"
#include "llbutton.h" #include "llbutton.h"
#include "llfloatergroupinfo.h"
#include "llfloaterworldmap.h" #include "llfloaterworldmap.h"
#include "llgroupactions.h"
#include "llproductinforequest.h" #include "llproductinforequest.h"
#include "llscrolllistctrl.h" #include "llscrolllistctrl.h"
#include "llstatusbar.h" #include "llstatusbar.h"
@@ -103,7 +103,7 @@ BOOL LLFloaterLandHoldings::postBuild()
LLScrollListCtrl *grant_list = getChild<LLScrollListCtrl>("grant list"); LLScrollListCtrl *grant_list = getChild<LLScrollListCtrl>("grant list");
// 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(); LLCtrlListInterface *list = grant_list->getListInterface();
if (!list) return TRUE; if (!list) return TRUE;
@@ -323,19 +323,6 @@ void LLFloaterLandHoldings::onClickMap(void* data)
self->buttonCore(1); 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() void LLFloaterLandHoldings::refreshAggregates()
{ {
S32 allowed_area = gStatusBar->getSquareMetersCredit(); S32 allowed_area = gStatusBar->getSquareMetersCredit();

View File

@@ -60,8 +60,6 @@ public:
static void onClickMap(void*); static void onClickMap(void*);
static void onClickLandmark(void*); static void onClickLandmark(void*);
static void onGrantList(void* data);
protected: protected:
LLFloaterLandHoldings(); LLFloaterLandHoldings();
virtual ~LLFloaterLandHoldings(); virtual ~LLFloaterLandHoldings();

View File

@@ -40,11 +40,11 @@
#include "llcommandhandler.h" #include "llcommandhandler.h"
#include "llfloatergroupinfo.h" #include "llfloatergroupinfo.h"
#include "llfloatermute.h" #include "llfloatermute.h"
#include "llgroupactions.h"
#include "llmutelist.h" #include "llmutelist.h"
#include "llsdutil.h" #include "llsdutil.h"
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "llurldispatcher.h" #include "llurldispatcher.h"
#include "llviewercontrol.h"
// [RLVa:KB] - Version: 1.23.4 // [RLVa:KB] - Version: 1.23.4
#include "rlvhandler.h" #include "rlvhandler.h"
@@ -146,7 +146,7 @@ void LLFloaterObjectIMInfo::onClickOwner(void* data)
LLFloaterObjectIMInfo* self = (LLFloaterObjectIMInfo*)data; LLFloaterObjectIMInfo* self = (LLFloaterObjectIMInfo*)data;
if (self->mOwnerIsGroup) if (self->mOwnerIsGroup)
{ {
LLFloaterGroupInfo::showFromUUID(self->mOwnerID); LLGroupActions::show(self->mOwnerID);
} }
// else // else
// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g // [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0g

View File

@@ -44,7 +44,7 @@
#include "llavataractions.h" #include "llavataractions.h"
#include "llbutton.h" #include "llbutton.h"
#include "llcheckboxctrl.h" #include "llcheckboxctrl.h"
#include "llfloatergroupinfo.h" #include "llgroupactions.h"
#include "llinventorymodel.h" #include "llinventorymodel.h"
#include "llinventoryobserver.h" #include "llinventoryobserver.h"
#include "lllineeditor.h" #include "lllineeditor.h"
@@ -604,7 +604,7 @@ void LLFloaterProperties::onClickOwner()
if(!item) return; if(!item) return;
if(item->getPermissions().isGroupOwned()) if(item->getPermissions().isGroupOwned())
{ {
LLFloaterGroupInfo::showFromUUID(item->getPermissions().getGroup()); LLGroupActions::show(item->getPermissions().getGroup());
} }
else else
{ {

View File

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

View File

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

View File

@@ -44,11 +44,10 @@
#include "lltransactiontypes.h" #include "lltransactiontypes.h"
#include "llstatusbar.h" #include "llstatusbar.h"
#include "lleconomy.h" #include "lleconomy.h"
#include "llviewercontrol.h"
#include "llviewerregion.h" #include "llviewerregion.h"
#include "llviewerwindow.h" #include "llviewerwindow.h"
#include "llfloaterdirectory.h" #include "llfloaterdirectory.h"
#include "llfloatergroupinfo.h" #include "llgroupactions.h"
#include "llnotificationsutil.h" #include "llnotificationsutil.h"
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "lltrans.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 we had a failure, the group panel needs to be updated.
if (!success) 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); LLGroupMgr::getInstance()->clearGroupData(group_id);
// refresh the floater for this group, if any. // 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. // refresh the group panel of the search window, if necessary.
LLFloaterDirectory::refreshGroup(group_id); LLFloaterDirectory::refreshGroup(group_id);
} }
@@ -1403,7 +1402,7 @@ void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data)
LLGroupMgr::getInstance()->clearGroupData(group_id); LLGroupMgr::getInstance()->clearGroupData(group_id);
// close the floater for this group, if any. // 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. // refresh the group panel of the search window, if necessary.
LLFloaterDirectory::refreshGroup(group_id); LLFloaterDirectory::refreshGroup(group_id);
} }
@@ -1439,8 +1438,8 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
gAgent.mGroups.push_back(gd); gAgent.mGroups.push_back(gd);
LLFloaterGroupInfo::closeCreateGroup(); LLGroupActions::closeGroup(LLUUID::null);
LLFloaterGroupInfo::showFromUUID(group_id,"roles_tab"); LLGroupActions::showTab(group_id, "roles_tab");
} }
else else
{ {

View File

@@ -39,13 +39,13 @@
#include "llbutton.h" #include "llbutton.h"
#include "lliconctrl.h" #include "lliconctrl.h"
#include "llfloaterchat.h" // for add_chat_history() #include "llfloaterchat.h" // for add_chat_history()
#include "llgroupactions.h"
#include "llnotify.h" #include "llnotify.h"
#include "lltextbox.h" #include "lltextbox.h"
#include "llviewertexteditor.h" #include "llviewertexteditor.h"
#include "lluiconstants.h" #include "lluiconstants.h"
#include "llui.h" #include "llui.h"
#include "llviewercontrol.h" #include "llviewercontrol.h"
#include "llfloatergroupinfo.h"
#include "llinventoryicon.h" #include "llinventoryicon.h"
#include "llinventory.h" #include "llinventory.h"
#include "lltrans.h" #include "lltrans.h"
@@ -279,7 +279,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const std::string& subject,
wide_btn_width, wide_btn_width,
BTN_HEIGHT); 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")); btn->setToolTip(LLTrans::getString("GroupNotifyViewPastNotices"));
addChild(btn, -1); addChild(btn, -1);
@@ -457,12 +457,6 @@ void LLGroupNotifyBox::onClickOk()
close(); close();
} }
void LLGroupNotifyBox::onClickGroupInfo()
{
LLFloaterGroupInfo::showFromUUID(mGroupID, "notices_tab");
//Leave notice open until explicitly closed
}
void LLGroupNotifyBox::onClickSaveInventory() void LLGroupNotifyBox::onClickSaveInventory()
{ {
mInventoryOffer->forceResponse(IOR_ACCEPT); mInventoryOffer->forceResponse(IOR_ACCEPT);

View File

@@ -90,7 +90,6 @@ protected:
// internal handler for button being clicked // internal handler for button being clicked
void onClickOk(); void onClickOk();
void onClickGroupInfo();
void onClickSaveInventory(); void onClickSaveInventory();
// for "next" button // for "next" button

View File

@@ -50,6 +50,7 @@
#include "llcallingcard.h" #include "llcallingcard.h"
#include "llchat.h" #include "llchat.h"
#include "llconsole.h" #include "llconsole.h"
#include "llgroupactions.h"
#include "llfloateractivespeakers.h" #include "llfloateractivespeakers.h"
#include "llfloaterchat.h" #include "llfloaterchat.h"
#include "llfloatergroupinfo.h" #include "llfloatergroupinfo.h"
@@ -1363,7 +1364,7 @@ BOOL LLFloaterIMPanel::postBuild()
if (LLButton* btn = findChild<LLButton>("profile_tele_btn")) if (LLButton* btn = findChild<LLButton>("profile_tele_btn"))
btn->setCommitCallback(boost::bind(static_cast<void(*)(const LLUUID&)>(LLAvatarActions::offerTeleport), mOtherParticipantUUID)); btn->setCommitCallback(boost::bind(static_cast<void(*)(const LLUUID&)>(LLAvatarActions::offerTeleport), mOtherParticipantUUID));
if (LLButton* btn = findChild<LLButton>("group_info_btn")) if (LLButton* btn = findChild<LLButton>("group_info_btn"))
btn->setCommitCallback(boost::bind(&LLFloaterIMPanel::onClickGroupInfo, this)); btn->setCommitCallback(boost::bind(LLGroupActions::show, mSessionUUID));
childSetAction("history_btn", onClickHistory, this); childSetAction("history_btn", onClickHistory, this);
if (LLUICtrl* ctrl = findChild<LLUICtrl>("rp_mode")) if (LLUICtrl* ctrl = findChild<LLUICtrl>("rp_mode"))
ctrl->setCommitCallback(boost::bind(&LLFloaterIMPanel::onRPMode, this, _2)); ctrl->setCommitCallback(boost::bind(&LLFloaterIMPanel::onRPMode, this, _2));
@@ -1374,9 +1375,6 @@ BOOL LLFloaterIMPanel::postBuild()
if (LLButton* btn = findChild<LLButton>("toggle_active_speakers_btn")) if (LLButton* btn = findChild<LLButton>("toggle_active_speakers_btn"))
btn->setCommitCallback(boost::bind(&LLFloaterIMPanel::onClickToggleActiveSpeakers, this, _2)); btn->setCommitCallback(boost::bind(&LLFloaterIMPanel::onClickToggleActiveSpeakers, this, _2));
//LLButton* close_btn = getChild<LLButton>("close_btn");
//close_btn->setClickedCallback(&LLFloaterIMPanel::onClickClose, this);
mHistoryEditor = getChild<LLViewerTextEditor>("im_history"); mHistoryEditor = getChild<LLViewerTextEditor>("im_history");
mHistoryEditor->setParseHTML(TRUE); mHistoryEditor->setParseHTML(TRUE);
mHistoryEditor->setParseHighlights(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 // static
void LLFloaterIMPanel::onClickStartCall(void* userdata) void LLFloaterIMPanel::onClickStartCall(void* userdata)
{ {

View File

@@ -241,8 +241,6 @@ public:
static void onClickHistory( void* userdata ); static void onClickHistory( void* userdata );
void onRPMode(const LLSD& value); void onRPMode(const LLSD& value);
void onClickGroupInfo();
static void onClickClose( void* userdata );
static void onClickStartCall( void* userdata ); static void onClickStartCall( void* userdata );
static void onClickEndCall( void* userdata ); static void onClickEndCall( void* userdata );
void onClickToggleActiveSpeakers(const LLSD& value); void onClickToggleActiveSpeakers(const LLSD& value);

View File

@@ -51,6 +51,7 @@
#include "llfloatergroupinfo.h" #include "llfloatergroupinfo.h"
#include "llfloatermute.h" #include "llfloatermute.h"
#include "llfloateravatarinfo.h" #include "llfloateravatarinfo.h"
#include "llgroupactions.h"
#include "lllineeditor.h" #include "lllineeditor.h"
#include "llnameeditor.h" #include "llnameeditor.h"
#include "llnotificationsutil.h" #include "llnotificationsutil.h"
@@ -431,17 +432,13 @@ void LLPanelAvatarSecondLife::onDoubleClickGroup(void* data)
{ {
LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*)data; LLPanelAvatarSecondLife* self = (LLPanelAvatarSecondLife*)data;
LLScrollListCtrl* group_list = self->getChild<LLScrollListCtrl>("groups"); LLScrollListCtrl* group_list = self->getChild<LLScrollListCtrl>("groups");
if(group_list) if(group_list)
{ {
LLScrollListItem* item = group_list->getFirstSelected(); LLScrollListItem* item = group_list->getFirstSelected();
if (item)
if(item && item->getUUID().notNull())
{ {
llinfos << "Show group info " << item->getUUID() << llendl; LLGroupActions::show(item->getUUID());
LLFloaterGroupInfo::showFromUUID(item->getUUID());
} }
} }
} }

View File

@@ -125,18 +125,14 @@ void LLPanelGroupTab::handleClickHelp()
} }
} }
LLPanelGroup::LLPanelGroup(const std::string& filename, LLPanelGroup::LLPanelGroup(const LLUUID& group_id)
const std::string& name, : LLPanel("PanelGroup", LLRect(), FALSE),
const LLUUID& group_id,
const std::string& initial_tab_selected)
: LLPanel(name, LLRect(), FALSE),
LLGroupMgrObserver( group_id ), LLGroupMgrObserver( group_id ),
mCurrentTab( NULL ), mCurrentTab( NULL ),
mRequestedTab( NULL ), mRequestedTab( NULL ),
mTabContainer( NULL ), mTabContainer( NULL ),
mIgnoreTransition( FALSE ), mIgnoreTransition( FALSE ),
mForceClose( FALSE ), mForceClose( FALSE ),
mInitialTab(initial_tab_selected),
mAllowEdit( TRUE ), mAllowEdit( TRUE ),
mShowingNotifyDialog( FALSE ) mShowingNotifyDialog( FALSE )
{ {
@@ -159,18 +155,14 @@ LLPanelGroup::LLPanelGroup(const std::string& filename,
LLGroupMgr::getInstance()->addObserver(this); LLGroupMgr::getInstance()->addObserver(this);
// Pass on construction of this panel to the control factory. // Pass on construction of this panel to the control factory.
LLUICtrlFactory::getInstance()->buildPanel(this, filename, &getFactoryMap()); LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group.xml", &getFactoryMap());
mFilename = filename;
} }
LLPanelGroup::~LLPanelGroup() LLPanelGroup::~LLPanelGroup()
{ {
LLGroupMgr::getInstance()->removeObserver(this); LLGroupMgr::getInstance()->removeObserver(this);
int i; for (int i = mTabContainer->getTabCount() - 1; i >=0; --i)
int tab_count = mTabContainer->getTabCount();
for (i = tab_count - 1; i >=0; --i)
{ {
LLPanelGroupTab* panelp = LLPanelGroupTab* panelp =
(LLPanelGroupTab*) mTabContainer->getPanelByIndex(i); (LLPanelGroupTab*) mTabContainer->getPanelByIndex(i);
@@ -181,10 +173,7 @@ LLPanelGroup::~LLPanelGroup()
void LLPanelGroup::updateTabVisibility() void LLPanelGroup::updateTabVisibility()
{ {
S32 i; for (int i = mTabContainer->getTabCount() - 1; i >=0; --i)
S32 tab_count = mTabContainer->getTabCount();
for (i = tab_count - 1; i >=0; --i)
{ {
LLPanelGroupTab* panelp = LLPanelGroupTab* panelp =
(LLPanelGroupTab*) mTabContainer->getPanelByIndex(i); (LLPanelGroupTab*) mTabContainer->getPanelByIndex(i);
@@ -211,38 +200,23 @@ BOOL LLPanelGroup::postBuild()
if (mTabContainer) if (mTabContainer)
{ {
// Select the initial tab specified via constructor //our initial tab selection was invalid, just select the
const BOOL recurse = TRUE; //first tab then or default to selecting the initial
LLPanelGroupTab* tabp = //selected tab specified in the layout file
getChild<LLPanelGroupTab>(mInitialTab, recurse); LLPanelGroupTab* tabp = (LLPanelGroupTab*) mTabContainer->getCurrentPanel();
//no tab was initially selected through constructor
//or the XML, select the first tab
if (!tabp) if (!tabp)
{ {
//our initial tab selection was invalid, just select the mTabContainer->selectFirstTab();
//first tab then or default to selecting the initial
//selected tab specified in the layout file
tabp = (LLPanelGroupTab*) mTabContainer->getCurrentPanel(); 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; mCurrentTab = tabp;
// Add click callbacks. // Add click callbacks.
S32 i; for (int i = mTabContainer->getTabCount() - 1; i >=0; --i)
S32 tab_count = mTabContainer->getTabCount();
for (i = tab_count - 1; i >=0; --i)
{ {
LLPanel* tab_panel = mTabContainer->getPanelByIndex(i); LLPanel* tab_panel = mTabContainer->getPanelByIndex(i);
LLPanelGroupTab* panelp =(LLPanelGroupTab*)tab_panel; // bit of a hack LLPanelGroupTab* panelp =(LLPanelGroupTab*)tab_panel; // bit of a hack
@@ -342,8 +316,6 @@ void LLPanelGroup::handleClickTab()
void LLPanelGroup::setGroupID(const LLUUID& group_id) void LLPanelGroup::setGroupID(const LLUUID& group_id)
{ {
LLRect rect(getRect());
LLGroupMgr::getInstance()->removeObserver(this); LLGroupMgr::getInstance()->removeObserver(this);
mID = group_id; mID = group_id;
LLGroupMgr::getInstance()->addObserver(this); LLGroupMgr::getInstance()->addObserver(this);
@@ -355,7 +327,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
// For now, rebuild panel // For now, rebuild panel
//delete children and rebuild panel //delete children and rebuild panel
deleteAllChildren(); deleteAllChildren();
LLUICtrlFactory::getInstance()->buildPanel(this, mFilename, &getFactoryMap()); LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group.xml", &getFactoryMap());
} }
void LLPanelGroup::selectTab(std::string tab_name) void LLPanelGroup::selectTab(std::string tab_name)

View File

@@ -58,10 +58,7 @@ class LLPanelGroup : public LLPanel,
public LLPanelGroupTabObserver public LLPanelGroupTabObserver
{ {
public: public:
LLPanelGroup(const std::string& filename, LLPanelGroup(const LLUUID& group_id);
const std::string& name,
const LLUUID& group_id,
const std::string& initial_tab_selected = std::string());
virtual ~LLPanelGroup(); virtual ~LLPanelGroup();
virtual BOOL postBuild(); virtual BOOL postBuild();
@@ -119,9 +116,6 @@ protected:
BOOL mForceClose; BOOL mForceClose;
std::string mInitialTab;
std::string mFilename;
std::string mDefaultNeedsApplyMesg; std::string mDefaultNeedsApplyMesg;
std::string mWantApplyMesg; std::string mWantApplyMesg;

View File

@@ -37,8 +37,9 @@
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "llagent.h" #include "llagent.h"
#include "llavataractions.h" #include "llavataractions.h"
#include "llfloatergroups.h"
#include "llgroupactions.h"
#include "roles_constants.h" #include "roles_constants.h"
#include "llfloatergroupinfo.h"
// UI elements // UI elements
#include "llbutton.h" #include "llbutton.h"
@@ -133,13 +134,13 @@ BOOL LLPanelGroupGeneral::postBuild()
mBtnJoinGroup = getChild<LLButton>("join_button", recurse); mBtnJoinGroup = getChild<LLButton>("join_button", recurse);
if ( mBtnJoinGroup ) if ( mBtnJoinGroup )
{ {
mBtnJoinGroup->setClickedCallback(boost::bind(&LLPanelGroupGeneral::onClickJoin, this)); mBtnJoinGroup->setClickedCallback(boost::bind(LLGroupActions::join, mGroupID));
} }
mBtnInfo = getChild<LLButton>("info_button", recurse); mBtnInfo = getChild<LLButton>("info_button", recurse);
if ( mBtnInfo ) if ( mBtnInfo )
{ {
mBtnInfo->setClickedCallback(boost::bind(&LLPanelGroupGeneral::onClickInfo, this)); mBtnInfo->setClickedCallback(boost::bind(LLGroupActions::show, mGroupID));
} }
LLTextBox* founder = getChild<LLTextBox>("founder_name"); LLTextBox* founder = getChild<LLTextBox>("founder_name");
@@ -154,7 +155,7 @@ BOOL LLPanelGroupGeneral::postBuild()
mListVisibleMembers = getChild<LLNameListCtrl>("visible_members", recurse); mListVisibleMembers = getChild<LLNameListCtrl>("visible_members", recurse);
if (mListVisibleMembers) if (mListVisibleMembers)
{ {
mListVisibleMembers->setDoubleClickCallback(boost::bind(&LLPanelGroupGeneral::openProfile,this)); mListVisibleMembers->setDoubleClickCallback(boost::bind(LLAvatarActions::showProfile, boost::bind(&LLScrollListCtrl::getCurrentID, mListVisibleMembers)));
} }
// Options // Options
@@ -322,83 +323,6 @@ void LLPanelGroupGeneral::onCommitTitle()
mComboActiveTitle->resetDirty(); 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) bool LLPanelGroupGeneral::needsApply(std::string& mesg)
{ {
updateChanged(); updateChanged();

View File

@@ -75,14 +75,9 @@ private:
void onCommitUserOnly(); void onCommitUserOnly();
void onCommitTitle(); void onCommitTitle();
void onCommitEnrollment(); void onCommitEnrollment();
static void onClickJoin(void* userdata);
static void onClickInfo(void* userdata);
static void onReceiveNotices(LLUICtrl* ctrl, void* data); static void onReceiveNotices(LLUICtrl* ctrl, void* data);
static void openProfile(void* data);
void addMember(LLGroupMemberData* member); void addMember(LLGroupMemberData* member);
static bool joinDlgCB(const LLSD& notification, const LLSD& response);
void updateMembers(); void updateMembers();
void updateChanged(); void updateChanged();
bool confirmMatureApply(const LLSD& notification, const LLSD& response); bool confirmMatureApply(const LLSD& notification, const LLSD& response);

View File

@@ -39,6 +39,7 @@
#include "llbutton.h" #include "llbutton.h"
#include "llcallingcard.h" #include "llcallingcard.h"
#include "llcombobox.h" #include "llcombobox.h"
#include "llgroupactions.h"
#include "llgroupmgr.h" #include "llgroupmgr.h"
#include "llnamelistctrl.h" #include "llnamelistctrl.h"
#include "llnotificationsutil.h" #include "llnotificationsutil.h"
@@ -49,8 +50,6 @@
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "llviewerwindow.h" #include "llviewerwindow.h"
#include <boost/signals2.hpp>
class LLPanelGroupInvite::impl : public boost::signals2::trackable class LLPanelGroupInvite::impl : public boost::signals2::trackable
{ {
public: public:
@@ -183,7 +182,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
iter != items.end(); ++iter) iter != items.end(); ++iter)
{ {
LLScrollListItem* item = *iter; LLScrollListItem* item = *iter;
if(gdatap->mMembers.find(item->getUUID()) != gdatap->mMembers.end()) if(LLGroupActions::isAvatarMemberOfGroup(mGroupID, item->getUUID()))
{ {
already_in_group = true; already_in_group = true;
continue; continue;

View File

@@ -52,12 +52,12 @@
#include "llselectmgr.h" #include "llselectmgr.h"
#include "llagent.h" #include "llagent.h"
#include "llavataractions.h" #include "llavataractions.h"
#include "llfloatergroups.h"
#include "llgroupactions.h"
#include "lllineeditor.h" #include "lllineeditor.h"
#include "llradiogroup.h" #include "llradiogroup.h"
#include "llcombobox.h" #include "llcombobox.h"
#include "lldbstrings.h" #include "lldbstrings.h"
#include "llfloatergroupinfo.h"
#include "llfloatergroups.h"
#include "llnamebox.h" #include "llnamebox.h"
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "roles_constants.h" #include "roles_constants.h"
@@ -1013,7 +1013,7 @@ void LLPanelPermissions::onClickOwner(void *data)
{ {
LLUUID group_id; LLUUID group_id;
LLSelectMgr::getInstance()->selectGetGroup(group_id); LLSelectMgr::getInstance()->selectGetGroup(group_id);
LLFloaterGroupInfo::showFromUUID(group_id); LLGroupActions::show(group_id);
} }
else else
{ {
@@ -1064,7 +1064,7 @@ void LLPanelPermissions::onClickOpenGroup(void* data)
LLUUID group_id; LLUUID group_id;
LLSelectMgr::getInstance()->selectGetGroup(group_id); LLSelectMgr::getInstance()->selectGetGroup(group_id);
LLFloaterGroupInfo::showFromUUID(group_id); LLGroupActions::show(group_id);
} }
// static // static

View File

@@ -60,7 +60,6 @@
#include "llfloaterbuycurrency.h" #include "llfloaterbuycurrency.h"
#include "llfloaterbuyland.h" #include "llfloaterbuyland.h"
#include "llfloaterchat.h" #include "llfloaterchat.h"
#include "llfloatergroupinfo.h"
#include "llfloaterimagepreview.h" #include "llfloaterimagepreview.h"
#include "llfloaterland.h" #include "llfloaterland.h"
#include "llfloaterregioninfo.h" #include "llfloaterregioninfo.h"
@@ -69,6 +68,7 @@
#include "llfloaterpostcard.h" #include "llfloaterpostcard.h"
#include "llfloaterpreference.h" #include "llfloaterpreference.h"
#include "llfloaterteleporthistory.h" #include "llfloaterteleporthistory.h"
#include "llgroupactions.h"
#include "llhudeffecttrail.h" #include "llhudeffecttrail.h"
#include "llhudmanager.h" #include "llhudmanager.h"
#include "llimpanel.h" #include "llimpanel.h"
@@ -639,7 +639,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
if (option == 2 && !group_id.isNull()) if (option == 2 && !group_id.isNull())
{ {
LLFloaterGroupInfo::showFromUUID(group_id); LLGroupActions::show(group_id);
LLSD args; LLSD args;
args["MESSAGE"] = message; args["MESSAGE"] = message;
LLNotificationsUtil::add("JoinGroup", args, notification["payload"]); LLNotificationsUtil::add("JoinGroup", args, notification["payload"]);
@@ -1780,7 +1780,7 @@ bool group_vote_callback(const LLSD& notification, const LLSD& response)
case 0: case 0:
// Vote Now // Vote Now
// Open up the voting tab // Open up the voting tab
LLFloaterGroupInfo::showFromUUID(group_id, "voting_tab"); LLGroupActions::showTab(group_id, "voting_tab");
break; break;
default: default:
// Vote Later or // Vote Later or
@@ -2529,16 +2529,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
args["MESSAGE"] = mes; args["MESSAGE"] = mes;
LLNotifications::instance().add(LLNotification::Params("GroupNotice").substitutions(args).payload(payload).timestamp(timestamp)); 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; break;
case IM_GROUP_INVITATION: case IM_GROUP_INVITATION:

View File

@@ -711,6 +711,21 @@ Do you wish to proceed?
yestext="Join"/> yestext="Join"/>
</notification> </notification>
<notification
icon="alertmodal.tga"
name="JoinGroupNoCost"
type="alertmodal">
You are joining group [NAME].
Do you wish to proceed?
<tag>group</tag>
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
yestext="Join"/>
</notification>
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="JoinGroupCannotAfford" name="JoinGroupCannotAfford"
@@ -3280,6 +3295,18 @@ To leave a group select the &apos;Groups...&apos; option from the &apos;Edit&apo
yestext="Join"/> yestext="Join"/>
</notification> </notification>
<notification
icon="alert.tga"
name="JoinedTooManyGroups"
type="alert">
You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
<tag>group</tag>
<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification <notification
icon="alert.tga" icon="alert.tga"
name="KickUser" name="KickUser"

View File

@@ -391,6 +391,12 @@ Los demás residentes podrán visitar la URL que hayas elegido cuando vean tu pe
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unirse"/> <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unirse"/>
</notification> </notification>
<notification name="JoinGroupNoCost">
Vas a entrar al grupo [NAME].
¿Quieres seguir?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
</notification>
<notification name="JoinGroupCannotAfford"> <notification name="JoinGroupCannotAfford">
Unirse a este grupo cuesta [CURRENCY][COST]. Unirse a este grupo cuesta [CURRENCY][COST].
No tienes suficientes [CURRENCY] para unirte a este grupo. 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
<usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/> <usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
</notification> </notification>
<notification name="JoinedTooManyGroups">
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.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="KickUser"> <notification name="KickUser">
¿Con qué mensaje se expulsará a este usuario? ¿Con qué mensaje se expulsará a este usuario?
<form name="form"> <form name="form">

View File

@@ -264,6 +264,12 @@ Voulez-vous continuer ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/> <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
</notification> </notification>
<notification name="JoinGroupNoCost">
Vous vous apprêtez à rejoindre le groupe [NAME].
Voulez-vous continuer ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Fusionner"/>
</notification>
<notification name="JoinGroupCannotAfford"> <notification name="JoinGroupCannotAfford">
Rejoindre ce groupe coûte [COST] [CURRENCY]. Rejoindre ce groupe coûte [COST] [CURRENCY].
Vous n'avez pas suffisamment de [CURRENCY] pour rejoindre ce groupe. 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.
<usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/> <usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/>
</notification> </notification>
<notification name="JoinedTooManyGroups">
Vous avez atteint le nombre de groupes maximum. Vous devez en quitter un avant d'en rejoindre ou d'en créer un nouveau.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="KickUser"> <notification name="KickUser">
Éjecter cet utilisateur avec quel message ? Éjecter cet utilisateur avec quel message ?
<form name="form"> <form name="form">

View File

@@ -274,6 +274,11 @@ Outros residentes podem visitar a URL que você definiu, quando eles olharem seu
Deseja prosseguir? Deseja prosseguir?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir-se"/> <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir-se"/>
</notification> </notification>
<notification name="JoinGroupNoCost">
Você está prestes a entrar no grupo [NAME].
Deseja continuar?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
</notification>
<notification name="JoinGroupCannotAfford"> <notification name="JoinGroupCannotAfford">
Associar-se a este grupo custa [CURRENCY][COST]. Associar-se a este grupo custa [CURRENCY][COST].
Você não tem [CURRENCY] suficientes para associar-se a este grupo. 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
<usetemplate name="okcancelbuttons" notext="Recusar" yestext="Entrar"/> <usetemplate name="okcancelbuttons" notext="Recusar" yestext="Entrar"/>
</notification> </notification>
<notification name="JoinedTooManyGroups">
Você atingiu o limite máximo de grupos. Sai de um grupo para entrar ou criar outro.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="KickUser"> <notification name="KickUser">
Expulsar este usuário com qual mensagem? Expulsar este usuário com qual mensagem?
<form name="form"> <form name="form">