Adds separated default permissions for Objects, Uploads, Scripts, Notecards, Gestures and Wearables. Compatible with Export Permission Backwards compatible with default permissions for objects on regions where AgentPreferences capability is not available (opensim users rejoice!) These changes to llfloaterperms are made available under lgpl, if there's a v3 that wants to adopt default export permission for opensim.
242 lines
7.7 KiB
C++
242 lines
7.7 KiB
C++
/**
|
|
* @file llpanelcontents.cpp
|
|
* @brief Object contents panel in the tools floater.
|
|
*
|
|
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2001-2009, Linden Research, Inc.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
// file include
|
|
#include "llpanelcontents.h"
|
|
|
|
// linden library includes
|
|
#include "llinventorydefines.h"
|
|
|
|
// project includes
|
|
#include "llagent.h"
|
|
#include "llfloaterbulkpermission.h"
|
|
#include "llfloaterperms.h"
|
|
#include "llpanelobjectinventory.h"
|
|
#include "llpreviewscript.h"
|
|
#include "llselectmgr.h"
|
|
#include "llviewerassettype.h"
|
|
#include "llviewerobject.h"
|
|
// [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c)
|
|
#include "rlvhandler.h"
|
|
#include "rlvlocks.h"
|
|
// [/RLVa:KB]
|
|
|
|
//
|
|
// Imported globals
|
|
//
|
|
|
|
|
|
//
|
|
// Globals
|
|
//
|
|
const char* LLPanelContents::TENTATIVE_SUFFIX = "_tentative";
|
|
const char* LLPanelContents::PERMS_OWNER_INTERACT_KEY = "perms_owner_interact";
|
|
const char* LLPanelContents::PERMS_OWNER_CONTROL_KEY = "perms_owner_control";
|
|
const char* LLPanelContents::PERMS_GROUP_INTERACT_KEY = "perms_group_interact";
|
|
const char* LLPanelContents::PERMS_GROUP_CONTROL_KEY = "perms_group_control";
|
|
const char* LLPanelContents::PERMS_ANYONE_INTERACT_KEY = "perms_anyone_interact";
|
|
const char* LLPanelContents::PERMS_ANYONE_CONTROL_KEY = "perms_anyone_control";
|
|
|
|
BOOL LLPanelContents::postBuild()
|
|
{
|
|
setMouseOpaque(FALSE);
|
|
|
|
childSetAction("button new script",&LLPanelContents::onClickNewScript, this);
|
|
childSetAction("button permissions",&LLPanelContents::onClickPermissions, this);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LLPanelContents::LLPanelContents(const std::string& name)
|
|
: LLPanel(name),
|
|
mPanelInventory(NULL)
|
|
{
|
|
}
|
|
|
|
|
|
LLPanelContents::~LLPanelContents()
|
|
{
|
|
// Children all cleaned up by default view destructor.
|
|
}
|
|
|
|
|
|
void LLPanelContents::getState(LLViewerObject *objectp )
|
|
{
|
|
if( !objectp )
|
|
{
|
|
childSetEnabled("button new script",FALSE);
|
|
return;
|
|
}
|
|
|
|
LLUUID group_id; // used for SL-23488
|
|
LLSelectMgr::getInstance()->selectGetGroup(group_id); // sets group_id as a side effect SL-23488
|
|
|
|
// BUG? Check for all objects being editable?
|
|
bool editable = gAgent.isGodlike()
|
|
|| (objectp->permModify() && !objectp->isPermanentEnforced()
|
|
&& ( objectp->permYouOwner() || ( !group_id.isNull() && gAgent.isInGroup(group_id) ))); // solves SL-23488
|
|
BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
|
|
|
|
// [RLVa:KB] - Checked: 2010-04-01 (RLVa-1.2.0c) | Modified: RLVa-1.0.5a
|
|
if ( (rlv_handler_t::isEnabled()) && (editable) )
|
|
{
|
|
// Don't allow creation of new scripts if it's non-detachable
|
|
if (objectp->isAttachment())
|
|
editable = !gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit());
|
|
|
|
// Don't allow creation of new scripts if we're @unsit=n or @sittp=n restricted and we're sitting on the selection
|
|
if ( (editable) && ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) )
|
|
{
|
|
// Only check the first (non-)root object because nothing else would result in enabling the button (see below)
|
|
LLViewerObject* pObj = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(TRUE);
|
|
|
|
editable =
|
|
(pObj) && (isAgentAvatarValid()) && ((!gAgentAvatarp->isSitting()) || (gAgentAvatarp->getRoot() != pObj->getRootEdit()));
|
|
}
|
|
}
|
|
// [/RLVa:KB]
|
|
|
|
// Edit script button - ok if object is editable and there's an unambiguous destination for the object.
|
|
childSetEnabled("button new script",
|
|
editable &&
|
|
all_volume &&
|
|
((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
|
|
|| (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)));
|
|
|
|
getChildView("button permissions")->setEnabled(!objectp->isPermanentEnforced());
|
|
mPanelInventory->setEnabled(!objectp->isPermanentEnforced());
|
|
}
|
|
|
|
|
|
void LLPanelContents::refresh()
|
|
{
|
|
const BOOL children_ok = TRUE;
|
|
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok);
|
|
|
|
getState(object);
|
|
if (mPanelInventory)
|
|
{
|
|
mPanelInventory->refresh();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Static functions
|
|
//
|
|
|
|
// static
|
|
void LLPanelContents::onClickNewScript(void *userdata)
|
|
{
|
|
const BOOL children_ok = TRUE;
|
|
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok);
|
|
if(object)
|
|
{
|
|
// [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c) | Modified: RLVa-1.0.5a
|
|
if (rlv_handler_t::isEnabled()) // Fallback code [see LLPanelContents::getState()]
|
|
{
|
|
if (gRlvAttachmentLocks.isLockedAttachment(object->getRootEdit()))
|
|
{
|
|
return; // Disallow creating new scripts in a locked attachment
|
|
}
|
|
else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) )
|
|
{
|
|
if ( (isAgentAvatarValid()) && (gAgentAvatarp->isSitting()) && (gAgentAvatarp->getRoot() == object->getRootEdit()) )
|
|
return; // .. or in a linkset the avie is sitting on under @unsit=n/@sittp=n
|
|
}
|
|
}
|
|
// [/RLVa:KB]
|
|
|
|
LLPermissions perm;
|
|
perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
|
|
|
|
// Parameters are base, owner, everyone, group, next
|
|
perm.initMasks(
|
|
PERM_ALL,
|
|
PERM_ALL,
|
|
LLFloaterPerms::getEveryonePerms("Scripts"),
|
|
LLFloaterPerms::getGroupPerms("Scripts"),
|
|
LLFloaterPerms::getNextOwnerPerms("Scripts"));
|
|
std::string desc;
|
|
LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
|
|
LLPointer<LLViewerInventoryItem> new_item =
|
|
new LLViewerInventoryItem(
|
|
LLUUID::null,
|
|
LLUUID::null,
|
|
perm,
|
|
LLUUID::null,
|
|
LLAssetType::AT_LSL_TEXT,
|
|
LLInventoryType::IT_LSL,
|
|
std::string("New Script"),
|
|
desc,
|
|
LLSaleInfo::DEFAULT,
|
|
LLInventoryItemFlags::II_FLAGS_NONE,
|
|
time_corrected());
|
|
object->saveScript(new_item, TRUE, true);
|
|
|
|
// *NOTE: In order to resolve SL-22177, we needed to create
|
|
// the script first, and then you have to click it in
|
|
// inventory to edit it.
|
|
// *TODO: The script creation should round-trip back to the
|
|
// viewer so the viewer can auto-open the script and start
|
|
// editing ASAP.
|
|
#if 0
|
|
S32 left, top;
|
|
gFloaterView->getNewFloaterPosition(&left, &top);
|
|
LLRect rect = gSavedSettings.getRect("PreviewScriptRect");
|
|
rect.translate( left - rect.mLeft, top - rect.mTop );
|
|
|
|
LLLiveLSLEditor* editor;
|
|
editor = new LLLiveLSLEditor("script ed",
|
|
rect,
|
|
"Script: New Script",
|
|
object->mID,
|
|
LLUUID::null);
|
|
editor->open(); /*Flawfinder: ignore*/
|
|
|
|
// keep onscreen
|
|
gFloaterView->adjustToFitScreen(editor, FALSE);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
// static
|
|
void LLPanelContents::onClickPermissions(void *userdata)
|
|
{
|
|
LLPanelContents* self = (LLPanelContents*)userdata;
|
|
gFloaterView->getParentFloater(self)->addDependentFloater(LLFloaterBulkPermission::showInstance());
|
|
}
|