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:
@@ -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
|
||||||
|
|||||||
81
indra/newview/groupchatlistener.cpp
Normal file
81
indra/newview/groupchatlistener.cpp
Normal 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);
|
||||||
|
*/
|
||||||
|
|
||||||
41
indra/newview/groupchatlistener.h
Normal file
41
indra/newview/groupchatlistener.h
Normal 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) */
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
489
indra/newview/llgroupactions.cpp
Normal file
489
indra/newview/llgroupactions.cpp
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
125
indra/newview/llgroupactions.h
Normal file
125
indra/newview/llgroupactions.h
Normal 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
|
||||||
|
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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 'Groups...' option from the '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"
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
Reference in New Issue
Block a user