[STORM-68b] Default permissions floater overhaul

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.
This commit is contained in:
Inusaito Sayori
2014-06-14 15:32:50 -04:00
parent bfc986a97d
commit eebee9b7c1
31 changed files with 1119 additions and 381 deletions

View File

@@ -934,6 +934,7 @@ P(fetchScriptLimitsRegionDetailsResponder);
P(fetchScriptLimitsRegionInfoResponder);
P(fetchScriptLimitsRegionSummaryResponder);
P(fnPtrResponder);
P(floaterPermsResponder);
P2(gamingDataReceived, transfer_22s_connect_10s);
P2(groupMemberDataResponder, transfer_300s);
P2(groupProposalBallotResponder, transfer_300s);

View File

@@ -6553,17 +6553,6 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>175</integer>
</map>
<key>EveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly created objects</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FPSLogFrequency</key>
<map>
<key>Comment</key>
@@ -10861,39 +10850,6 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>20</integer>
</map>
<key>NextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created objects can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created objects can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created objects can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NewCacheLocation</key>
<map>
<key>Comment</key>
@@ -14549,39 +14505,6 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created scripts can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created scripts can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created scripts can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>SearchURLDefault</key>
<map>
<key>Comment</key>
@@ -14744,17 +14667,6 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly created objects are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ShowActiveSpeakers</key>
<map>
<key>Comment</key>
@@ -17991,6 +17903,336 @@ This should be as low as possible, but too low may break functionality</string>
<integer>0</integer>
</array>
</map>
<key>ObjectsNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created objects can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ObjectsNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created objects can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ObjectsNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created objects can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ObjectsEveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly created object</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ObjectsShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly created objects are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>UploadsNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly uploaded items can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>UploadsNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly uploaded items can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>UploadsNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly uploaded items can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>UploadsEveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly uploaded item</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>UploadsShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly uploaded items are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptsNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created scripts can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptsNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created scripts can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptsNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created scripts can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ScriptsEveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly created script</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptsShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly created scripts are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NotecardsNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created notecards can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NotecardsNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created notecards can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NotecardsNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created notecards can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NotecardsEveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly created notecard</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NotecardsShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly created scripts are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>GesturesNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created gestures can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>GesturesNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created gestures can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>GesturesNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created gestures can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>GesturesEveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly created gesture</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>GesturesShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly created gestures are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>WearablesNextOwnerCopy</key>
<map>
<key>Comment</key>
<string>Newly created clothing or body part can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>WearablesNextOwnerModify</key>
<map>
<key>Comment</key>
<string>Newly created clothing or body part can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>WearablesNextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>Newly created clothing or body part can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>WearablesEveryoneCopy</key>
<map>
<key>Comment</key>
<string>Everyone can copy the newly created clothing or body part</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>WearablesShareWithGroup</key>
<map>
<key>Comment</key>
<string>Newly created clothing or body part is shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SimulateFBOFailure</key>
<map>
<key>Comment</key>
@@ -18263,6 +18505,62 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>EveryoneCopy</key>
<map>
<key>Comment</key>
<string>(obsolete) Everyone can copy the newly created objects</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NextOwnerCopy</key>
<map>
<key>Comment</key>
<string>(obsolete) Newly created objects can be copied by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NextOwnerModify</key>
<map>
<key>Comment</key>
<string>(obsolete) Newly created objects can be modified by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NextOwnerTransfer</key>
<map>
<key>Comment</key>
<string>(obsolete) Newly created objects can be resold or given away by next owner</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ShareWithGroup</key>
<map>
<key>Comment</key>
<string>(obsolete) Newly created objects are shared with the currently active group</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@@ -463,7 +463,40 @@
</map>
<key>DefaultUploadPermissionsConverted</key>
<map>
<key>Comment</key>
<string>Default upload permissions have been converted to default creation permissions</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>EveryoneExport</key>
<map>
<key>Comment</key>
<string>(obsolete) Whether content you upload has exportability permission by default</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ObjectsEveryoneExport</key>
<map>
<key>Comment</key>
<string>Whether objects you create have exportability permission by default</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>UploadsEveryoneExport</key>
<map>
<key>Comment</key>
<string>Whether content you upload has exportability permission by default</string>
@@ -474,6 +507,50 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>ScriptsEveryoneExport</key>
<map>
<key>Comment</key>
<string>Whether scripts you make have exportability permission by default</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>NotecardsEveryoneExport</key>
<map>
<key>Comment</key>
<string>Whether notecards you make have exportability permission by default</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>GesturesEveryoneExport</key>
<map>
<key>Comment</key>
<string>Whether gestures you make have exportability permission by default</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>WearablesEveryoneExport</key>
<map>
<key>Comment</key>
<string>Whether wearables you make have exportability permission by default</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>RLVaLoginLastLocation</key>
<map>
<key>Comment</key>

View File

@@ -121,11 +121,11 @@ void LLPrefsAscentSys::onCommitCheckBox(LLUICtrl* ctrl, const LLSD& value)
}
else if (name == "next_owner_copy")
{
if (!enabled) gSavedSettings.setBOOL("NextOwnerTransfer", true);
if (!enabled) gSavedSettings.setBOOL("ObjectsNextOwnerTransfer", true);
}
else if (name == "script_next_owner_copy")
{
if (!enabled) gSavedSettings.setBOOL("ScriptNextOwnerTransfer", true);
if (!enabled) gSavedSettings.setBOOL("ScriptsNextOwnerTransfer", true);
}
}
@@ -214,12 +214,12 @@ void LLPrefsAscentSys::refreshValues()
mGlow = gSavedSettings.getF32("EmeraldBuildPrefs_Glow");
mItem = gSavedPerAccountSettings.getString("EmeraldBuildPrefs_Item");
mMaterial = gSavedSettings.getString("BuildPrefs_Material");
mNextCopy = gSavedSettings.getBOOL("NextOwnerCopy");
mNextMod = gSavedSettings.getBOOL("NextOwnerModify");
mNextTrans = gSavedSettings.getBOOL("NextOwnerTransfer");
mScriptNextCopy = gSavedSettings.getBOOL("ScriptNextOwnerCopy");
mScriptNextMod = gSavedSettings.getBOOL("ScriptNextOwnerModify");
mScriptNextTrans = gSavedSettings.getBOOL("ScriptNextOwnerTransfer");
mNextCopy = gSavedSettings.getBOOL("ObjectsNextOwnerCopy");
mNextMod = gSavedSettings.getBOOL("ObjectsNextOwnerModify");
mNextTrans = gSavedSettings.getBOOL("ObjectsNextOwnerTransfer");
mScriptNextCopy = gSavedSettings.getBOOL("ScriptsNextOwnerCopy");
mScriptNextMod = gSavedSettings.getBOOL("ScriptsNextOwnerModify");
mScriptNextTrans = gSavedSettings.getBOOL("ScriptsNextOwnerTransfer");
mShiny = gSavedSettings.getString("EmeraldBuildPrefs_Shiny");
mTemporary = gSavedSettings.getBOOL("EmeraldBuildPrefs_Temporary");
mTexture = gSavedSettings.getString("EmeraldBuildPrefs_Texture");
@@ -356,12 +356,12 @@ void LLPrefsAscentSys::cancel()
gSavedSettings.setF32("EmeraldBuildPrefs_Glow", mGlow);
gSavedPerAccountSettings.setString("EmeraldBuildPrefs_Item", mItem);
gSavedSettings.setString("BuildPrefs_Material", mMaterial);
gSavedSettings.setBOOL("NextOwnerCopy", mNextCopy);
gSavedSettings.setBOOL("NextOwnerModify", mNextMod);
gSavedSettings.setBOOL("NextOwnerTransfer", mNextTrans);
gSavedSettings.setBOOL("ScriptNextOwnerCopy", mScriptNextCopy);
gSavedSettings.setBOOL("ScriptNextOwnerModify", mScriptNextMod);
gSavedSettings.setBOOL("ScriptNextOwnerTransfer", mScriptNextTrans);
gSavedSettings.setBOOL("ObjectsNextOwnerCopy", mNextCopy);
gSavedSettings.setBOOL("ObjectsNextOwnerModify", mNextMod);
gSavedSettings.setBOOL("ObjectsNextOwnerTransfer", mNextTrans);
gSavedSettings.setBOOL("ScriptsNextOwnerCopy", mScriptNextCopy);
gSavedSettings.setBOOL("ScriptsNextOwnerModify", mScriptNextMod);
gSavedSettings.setBOOL("ScriptsNextOwnerTransfer", mScriptNextTrans);
gSavedSettings.setBOOL("EmeraldBuildPrefs_Phantom", mPhantom);
gSavedSettings.setBOOL("EmeraldBuildPrefs_Physical", mPhysical);
gSavedSettings.setString("EmeraldBuildPrefs_Shiny", mShiny);

View File

@@ -226,7 +226,9 @@ void ImportTracker::get_update(S32 newid, BOOL justCreated, BOOL createSelected)
}
}
}
// Anything below here must be permissions!!!
if (gAgent.getRegion()->getCapability("AgentPreferences").empty()) break; // This cap automates perm setting on the server
msg->newMessageFast(_PREHASH_ObjectPermissions);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
@@ -238,16 +240,16 @@ void ImportTracker::get_update(S32 newid, BOOL justCreated, BOOL createSelected)
msg->addU8Fast(_PREHASH_Field, PERM_NEXT_OWNER);
msg->addU8Fast(_PREHASH_Set, PERM_SET_TRUE);
U32 flags = 0;
if ( gSavedSettings.getBOOL("NextOwnerCopy") )
if ( gSavedSettings.getBOOL("ObjectsNextOwnerCopy") )
{
flags |= PERM_COPY;
}
if ( gSavedSettings.getBOOL("NextOwnerModify") )
if ( gSavedSettings.getBOOL("ObjectsNextOwnerModify") )
{
flags |= PERM_MODIFY;
}
bool next_owner_trans;
if ( next_owner_trans = gSavedSettings.getBOOL("NextOwnerTransfer") )
if ( next_owner_trans = gSavedSettings.getBOOL("ObjectsNextOwnerTransfer") )
{
flags |= PERM_TRANSFER;
}
@@ -399,7 +401,7 @@ public:
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH), data->tid, data->name,
data->description, data->type, LLInventoryType::defaultForAssetType(data->type), data->wear_type,
LLFloaterPerms::getNextOwnerPerms(),
LLFloaterPerms::getNextOwnerPerms("Uploads"),
cb);
}
@@ -542,7 +544,7 @@ void JCImportInventorycallback(const LLUUID& uuid, void* user_data, S32 result,
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH), data->tid, data->name,
data->description, data->type, LLInventoryType::defaultForAssetType(data->type), data->wear_type,
LLFloaterPerms::getNextOwnerPerms(),
LLFloaterPerms::getNextOwnerPerms("Uploads"),
cb);
}else cmdline_printchat("err: "+std::string(LLAssetStorage::getErrorString(result)));
}
@@ -690,7 +692,7 @@ void ImportTracker::send_inventory(LLSD& prim)
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH), data->tid, data->name,
data->description, data->type, LLInventoryType::defaultForAssetType(data->type), data->wear_type,
LLFloaterPerms::getNextOwnerPerms(),
LLFloaterPerms::getNextOwnerPerms("Notecards"),
cb);
}
break;
@@ -702,7 +704,7 @@ void ImportTracker::send_inventory(LLSD& prim)
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH), data->tid, data->name,
data->description, data->type, LLInventoryType::defaultForAssetType(data->type), data->wear_type,
LLFloaterPerms::getNextOwnerPerms(),
LLFloaterPerms::getNextOwnerPerms("Scripts"),
cb);
}
break;

View File

@@ -50,6 +50,7 @@
#include "llwearablelist.h"
#include "llfloatercustomize.h"
#include "llfloaterperms.h"
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1)
@@ -77,7 +78,20 @@ using namespace LLAvatarAppearanceDefines;
void wear_and_edit_cb(const LLUUID& inv_item)
{
if (inv_item.isNull()) return;
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (!item) return;
LLPermissions perm = item->getPermissions();
perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));
perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));
perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables"));
item->setPermissions(perm);
item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
// Request editing the item after it gets worn.
gAgentWearables.requestEditingWearable(inv_item);
@@ -85,6 +99,26 @@ void wear_and_edit_cb(const LLUUID& inv_item)
LLAppearanceMgr::instance().wearItemOnAvatar(inv_item);
}
void wear_cb(const LLUUID& inv_item)
{
if (!inv_item.isNull())
{
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (item)
{
LLPermissions perm = item->getPermissions();
perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));
perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));
perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables"));
item->setPermissions(perm);
item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
}
}
}
///////////////////////////////////////////////////////////////////////////////
// HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look"
@@ -502,6 +536,7 @@ LLViewerWearable* LLAgentWearables::saveWearableAs(const LLWearableType::EType t
old_wearable,
trunc_name,
trunc_description);
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
@@ -1976,7 +2011,7 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);
LLAssetType::EType asset_type = wearable->getAssetType();
LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
LLPointer<LLInventoryCallback> cb = wear ? new LLBoostFuncInventoryCallback(wear_and_edit_cb) : NULL;
LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(wear ? wear_and_edit_cb : wear_cb);
LLUUID folder_id;
if (parent_id.notNull())
@@ -1989,10 +2024,16 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
folder_id = gInventory.findCategoryUUIDForType(folder_type);
}
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
folder_id, wearable->getTransactionID(), wearable->getName(),
wearable->getDescription(), asset_type, inv_type, wearable->getType(),
wearable->getPermissions().getMaskNextOwner(),
create_inventory_item(gAgent.getID(),
gAgent.getSessionID(),
folder_id,
wearable->getTransactionID(),
wearable->getName(),
wearable->getDescription(),
asset_type,
inv_type,
wearable->getType(),
LLFloaterPerms::getNextOwnerPerms("Wearables"),
cb);
}

View File

@@ -1269,7 +1269,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
0,
LLFolderType::FT_NONE,
LLInventoryType::IT_ANIMATION,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
name,
callback, expected_upload_cost, userdata);
}

View File

@@ -34,32 +34,24 @@
#include "llfloatergesture.h"
#include "lldir.h"
#include "llinventory.h"
#include "llmultigesture.h"
#include "llagent.h"
#include "llviewerwindow.h"
#include "llbutton.h"
#include "llcombobox.h"
#include "llgesturemgr.h"
#include "llfloaterinventory.h"
#include "llfloaterperms.h"
#include "llgesturemgr.h"
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llpreviewgesture.h"
#include "llresizehandle.h"
#include "llscrollbar.h"
#include "llscrollcontainer.h"
#include "llscrolllistctrl.h"
#include "lltextbox.h"
#include "lluictrlfactory.h"
#include "llviewergesture.h"
#include "llviewertexturelist.h"
#include "llviewerinventory.h"
#include "llviewertexturelist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
#include "llviewercontrol.h"
// static
LLFloaterGesture* LLFloaterGesture::sInstance = NULL;
@@ -367,27 +359,38 @@ void LLFloaterGesture::onClickPlay(void* data)
class GestureShowCallback : public LLInventoryCallback
{
public:
GestureShowCallback(std::string &title)
{
mTitle = title;
}
void fire(const LLUUID &inv_item)
{
LLPreviewGesture::show(mTitle, inv_item, LLUUID::null);
LLPreviewGesture::show("Gesture: New Gesture", inv_item, LLUUID::null);
LLInventoryItem* item = gInventory.getItem(inv_item);
if (item)
{
LLPermissions perm = item->getPermissions();
perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Gestures"));
perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures"));
perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures"));
item->setPermissions(perm);
item->updateServer(FALSE);
}
}
private:
std::string mTitle;
};
// static
void LLFloaterGesture::onClickNew(void* data)
{
std::string title("Gesture: ");
title.append("New Gesture");
LLPointer<LLInventoryCallback> cb = new GestureShowCallback(title);
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
LLUUID::null, LLTransactionID::tnull, "New Gesture", "", LLAssetType::AT_GESTURE,
LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
LLPointer<LLInventoryCallback> cb = new GestureShowCallback();
create_inventory_item(gAgent.getID(),
gAgent.getSessionID(),
LLUUID::null,
LLTransactionID::tnull,
"New Gesture",
"",
LLAssetType::AT_GESTURE,
LLInventoryType::IT_GESTURE,
NOT_WEARABLE,
LLFloaterPerms::getNextOwnerPerms("Gestures"),
cb);
}

View File

@@ -176,11 +176,14 @@ void LLFloaterNameDesc::onBtnOK()
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
void *nruserdata = NULL;
std::string display_name = LLStringUtil::null;
upload_new_resource(mFilenameAndPath, // file
getChild<LLUICtrl>("name_form")->getValue().asString(),
getChild<LLUICtrl>("description_form")->getValue().asString(),
0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
display_name, callback, expected_upload_cost, nruserdata);
close(false);
}

View File

@@ -1,7 +1,7 @@
/**
* @file llfloaterperms.cpp
* @brief Asset creation permission preferences.
* @author Coco
* @author Jonathan Yap
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -33,152 +33,57 @@
#include "llviewerprecompiledheaders.h"
#include "lfsimfeaturehandler.h"
#include "llagent.h"
#include "llcheckboxctrl.h"
#include "llfloaterperms.h"
#include "llnotificationsutil.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "lluictrlfactory.h"
#include "llpermissions.h"
#include "hippogridmanager.h"
namespace
{
bool everyone_export;
void handle_checkboxes(LLUICtrl* ctrl, const LLSD& value)
{
LLPanel* view = static_cast<LLPanel*>(ctrl->getParent());
if (ctrl->getName() == "everyone_export")
{
view->childSetEnabled("next_owner_copy", !value);
view->childSetEnabled("next_owner_modify", !value);
view->childSetEnabled("next_owner_transfer", !value);
}
else
{
if (ctrl->getName() == "next_owner_copy")
{
if (!value) // Implements fair use
gSavedSettings.setBOOL("NextOwnerTransfer", true);
view->childSetEnabled("next_owner_transfer", value);
}
if (!value) // If any of these are unchecked, export can no longer be checked.
view->childSetEnabled("everyone_export", false);
else
view->childSetEnabled("everyone_export", LFSimFeatureHandler::instance().simSupportsExport() && (LLFloaterPerms::getNextOwnerPerms() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED);
}
}
}
extern class AIHTTPTimeoutPolicy floaterPermsResponder_timeout;
LLFloaterPerms::LLFloaterPerms(const LLSD& seed)
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_perm_prefs.xml");
}
BOOL LLFloaterPerms::postBuild()
{
//handle_checkboxes
{
bool export_support = LFSimFeatureHandler::instance().simSupportsExport();
const U32 next_owner_perms = getNextOwnerPerms();
childSetEnabled("everyone_export", export_support && (next_owner_perms & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED);
if (!gHippoGridManager->getCurrentGrid()->isSecondLife())
childSetVisible("everyone_export", false);
if (!(next_owner_perms & PERM_COPY))
{
childSetEnabled("next_owner_transfer", false);
}
else if (export_support)
{
bool export_off = !gSavedPerAccountSettings.getBOOL("EveryoneExport");
childSetEnabled("next_owner_copy", export_off);
childSetEnabled("next_owner_modify", export_off);
childSetEnabled("next_owner_transfer", export_off);
}
else // Set EveryoneExport false, just in case.
gSavedPerAccountSettings.setBOOL("EveryoneExport", false);
}
childSetAction("help", onClickHelp, this);
childSetAction("ok", onClickOK, this);
childSetAction("cancel", onClickCancel, this);
getChild<LLUICtrl>("next_owner_copy")->setCommitCallback(handle_checkboxes);
getChild<LLUICtrl>("next_owner_modify")->setCommitCallback(handle_checkboxes);
getChild<LLUICtrl>("next_owner_transfer")->setCommitCallback(handle_checkboxes);
getChild<LLUICtrl>("everyone_export")->setCommitCallback(handle_checkboxes);
refresh();
return TRUE;
}
//static
void LLFloaterPerms::onClickOK(void* data)
{
LLFloaterPerms* self = static_cast<LLFloaterPerms*>(data);
self->ok();
self->close();
}
//static
void LLFloaterPerms::onClickCancel(void* data)
{
LLFloaterPerms* self = static_cast<LLFloaterPerms*>(data);
self->cancel();
self->close();
}
void LLFloaterPerms::ok()
{
refresh(); // Changes were already applied to saved settings. Refreshing internal values makes it official.
}
void LLFloaterPerms::cancel()
{
gSavedSettings.setBOOL("ShareWithGroup", mShareWithGroup);
gSavedSettings.setBOOL("EveryoneCopy", mEveryoneCopy);
gSavedSettings.setBOOL("NextOwnerCopy", mNextOwnerCopy);
gSavedSettings.setBOOL("NextOwnerModify", mNextOwnerModify);
gSavedSettings.setBOOL("NextOwnerTransfer", mNextOwnerTransfer);
gSavedPerAccountSettings.setBOOL("EveryoneExport", everyone_export);
}
void LLFloaterPerms::refresh()
{
mShareWithGroup = gSavedSettings.getBOOL("ShareWithGroup");
mEveryoneCopy = gSavedSettings.getBOOL("EveryoneCopy");
mNextOwnerCopy = gSavedSettings.getBOOL("NextOwnerCopy");
mNextOwnerModify = gSavedSettings.getBOOL("NextOwnerModify");
mNextOwnerTransfer = gSavedSettings.getBOOL("NextOwnerTransfer");
everyone_export = gSavedPerAccountSettings.getBOOL("EveryoneExport");
}
void LLFloaterPerms::onClose(bool app_quitting)
{
// Cancel any unsaved changes before closing.
// Note: when closed due to the OK button this amounts to a no-op.
cancel();
LLFloater::onClose(app_quitting);
}
//static
//static
U32 LLFloaterPerms::getGroupPerms(std::string prefix)
{
return gSavedSettings.getBOOL(prefix+"ShareWithGroup") ? PERM_COPY : PERM_NONE;
{
return gSavedSettings.getBOOL(prefix+"ShareWithGroup") ? PERM_COPY | PERM_MOVE | PERM_MODIFY : PERM_NONE;
}
//static
//static
U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
{
U32 flags = PERM_NONE;
if (LFSimFeatureHandler::instance().simSupportsExport() && prefix.empty() && gSavedPerAccountSettings.getBOOL("EveryoneExport")) // TODO: Bulk enable export?
if (prefix != "Bulk" && LFSimFeatureHandler::instance().simSupportsExport() && prefix.empty() && gSavedPerAccountSettings.getBOOL(prefix+"EveryoneExport")) // Singu TODO: Bulk?
flags |= PERM_EXPORT;
if (gSavedSettings.getBOOL(prefix+"EveryoneCopy"))
flags |= PERM_COPY;
return flags;
}
//static
//static
U32 LLFloaterPerms::getNextOwnerPermsInverted(std::string prefix)
{
// Sets bits for permissions that are off
U32 flags = PERM_MOVE;
if (!gSavedSettings.getBOOL(prefix+"NextOwnerCopy"))
{
flags |= PERM_COPY;
}
if (!gSavedSettings.getBOOL(prefix+"NextOwnerModify"))
{
flags |= PERM_MODIFY;
}
if (!gSavedSettings.getBOOL(prefix+"NextOwnerTransfer"))
{
flags |= PERM_TRANSFER;
}
return flags;
}
//static
U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
{
U32 flags = PERM_MOVE;
@@ -197,9 +102,228 @@ U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
return flags;
}
//static
void LLFloaterPerms::onClickHelp(void* data)
namespace
{
LLNotificationsUtil::add("ClickUploadHelpPermissions");
bool everyone_export;
void handle_checkboxes(LLView* view, const std::string& ctrl_name, const LLSD& value, const std::string& type)
{
if (ctrl_name == type+"everyone_export")
{
view->getChildView(type+"next_owner_copy")->setEnabled(!value);
view->getChildView(type+"next_owner_modify")->setEnabled(!value);
view->getChildView(type+"next_owner_transfer")->setEnabled(!value);
}
else
{
if (ctrl_name == type+"next_owner_copy")
{
if (!value) // Implements fair use
gSavedSettings.setBOOL(type+"NextOwnerTransfer", true);
view->getChildView(type+"next_owner_transfer")->setEnabled(value);
}
if (!value) // If any of these are unchecked, export can no longer be checked.
view->getChildView(type+"everyone_export")->setEnabled(false);
else
view->getChildView(type+"everyone_export")->setEnabled(LFSimFeatureHandler::instance().simSupportsExport() && LLFloaterPerms::getNextOwnerPerms(type) == PERM_ITEM_UNRESTRICTED);
}
}
}
static bool mCapSent = false;
LLFloaterPermsDefault::LLFloaterPermsDefault(const LLSD& seed)
: LLFloater()
{
mCommitCallbackRegistrar.add("PermsDefault.OK", boost::bind(&LLFloaterPermsDefault::onClickOK, this));
mCommitCallbackRegistrar.add("PermsDefault.Cancel", boost::bind(&LLFloaterPermsDefault::onClickCancel, this));
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_perm_prefs.xml");
}
// String equivalents of enum Categories - initialization order must match enum order!
const std::string LLFloaterPermsDefault::sCategoryNames[CAT_LAST] =
{
"Objects",
"Uploads",
"Scripts",
"Notecards",
"Gestures",
"Wearables"
};
void LLFloaterPermsDefault::initCheckboxes(bool export_support, const std::string& type)
{
const U32 next_owner_perms = LLFloaterPerms::getNextOwnerPerms(type);
getChildView(type + "everyone_export")->setEnabled(export_support && next_owner_perms == PERM_ITEM_UNRESTRICTED);
if (!(next_owner_perms & PERM_COPY))
{
getChildView(type + "next_owner_transfer")->setEnabled(false);
}
else if (export_support)
{
bool export_off = !gSavedPerAccountSettings.getBOOL(type+"EveryoneExport");
getChildView(type + "next_owner_copy")->setEnabled(export_off);
getChildView(type + "next_owner_modify")->setEnabled(export_off);
getChildView(type + "next_owner_transfer")->setEnabled(export_off);
}
else // Set type+EveryoneExport false, just in case.
gSavedPerAccountSettings.setBOOL(type+"EveryoneExport", false);
}
BOOL LLFloaterPermsDefault::postBuild()
{
//handle_checkboxes
bool export_support = LFSimFeatureHandler::instance().simSupportsExport();
bool is_sl = gHippoGridManager->getCurrentGrid()->isSecondLife();
for (S32 i = 0; i < CAT_LAST; ++i)
{
const std::string& type(sCategoryNames[i]);
initCheckboxes(export_support, type);
commit_callback_t handle_checks(boost::bind(handle_checkboxes, this, boost::bind(&LLView::getName, _1), _2, type));
getChild<LLUICtrl>(type + "next_owner_copy")->setCommitCallback(handle_checks);
getChild<LLUICtrl>(type + "next_owner_modify")->setCommitCallback(handle_checks);
getChild<LLUICtrl>(type + "next_owner_transfer")->setCommitCallback(handle_checks);
if (is_sl)
getChildView(type + "everyone_export")->setVisible(false);
else
getChild<LLUICtrl>(type + "everyone_export")->setCommitCallback(handle_checks);
}
if (is_sl)
{
LLView* view(getChildView("ExportationLabel"));
S32 shift(view->getRect().getWidth()); // Determine size of export area
LLRect rect(getRect());
rect.mRight -= shift;
setRect(rect); // Cut off the export side
view->setVisible(false); // Hide label
// Move bottom buttons over so they look nice.
shift /= -2;
view = getChildView("ok");
rect = view->getRect();
rect.translate(shift, 0);
view->setRect(rect);
view = getChildView("cancel");
rect = view->getRect();
rect.translate(shift, 0);
view->setRect(rect);
}
refresh();
return TRUE;
}
void LLFloaterPermsDefault::onClickOK()
{
ok();
close();
}
void LLFloaterPermsDefault::onClickCancel()
{
cancel();
close();
}
class LLFloaterPermsResponder : public LLHTTPClient::ResponderWithResult
{
public:
LLFloaterPermsResponder() : LLHTTPClient::ResponderWithResult() {}
private:
static std::string sPreviousReason;
void error(U32 status, const std::string& reason)
{
// Do not display the same error more than once in a row
if (reason != sPreviousReason)
{
sPreviousReason = reason;
LLSD args;
args["REASON"] = reason;
LLNotificationsUtil::add("DefaultObjectPermissions", args);
}
}
void result(const LLSD& content)
{
// Since we have had a successful POST call be sure to display the next error message
// even if it is the same as a previous one.
sPreviousReason = "";
mCapSent = true;
LL_INFOS("FloaterPermsResponder") << "Sent default permissions to simulator" << LL_ENDL;
}
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy() const { return floaterPermsResponder_timeout; }
/*virtual*/ char const* getName() const { return "LLFloaterPermsResponder"; }
};
std::string LLFloaterPermsResponder::sPreviousReason;
void LLFloaterPermsDefault::sendInitialPerms()
{
if (!mCapSent)
{
updateCap();
}
}
void LLFloaterPermsDefault::updateCap()
{
std::string object_url = gAgent.getRegion()->getCapability("AgentPreferences");
if (!object_url.empty())
{
LLSD report = LLSD::emptyMap();
report["default_object_perm_masks"]["Group"] =
(LLSD::Integer)LLFloaterPerms::getGroupPerms(sCategoryNames[CAT_OBJECTS]);
report["default_object_perm_masks"]["Everyone"] =
(LLSD::Integer)LLFloaterPerms::getEveryonePerms(sCategoryNames[CAT_OBJECTS]);
report["default_object_perm_masks"]["NextOwner"] =
(LLSD::Integer)LLFloaterPerms::getNextOwnerPerms(sCategoryNames[CAT_OBJECTS]);
LLHTTPClient::post(object_url, report, new LLFloaterPermsResponder());
}
}
void LLFloaterPermsDefault::ok()
{
// Changes were already applied to saved settings.
// Refreshing internal values makes it official.
refresh();
// We know some setting has changed but not which one. Just in case it was a setting for
// object permissions tell the server what the values are.
updateCap();
}
void LLFloaterPermsDefault::cancel()
{
for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
{
gSavedSettings.setBOOL(sCategoryNames[iter]+"ShareWithGroup", mShareWithGroup[iter]);
gSavedSettings.setBOOL(sCategoryNames[iter]+"EveryoneCopy", mEveryoneCopy[iter]);
gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerCopy", mNextOwnerCopy[iter]);
gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerModify", mNextOwnerModify[iter]);
gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerTransfer", mNextOwnerTransfer[iter]);
gSavedPerAccountSettings.setBOOL(sCategoryNames[iter]+"EveryoneExport", mEveryoneExport[iter]);
}
}
void LLFloaterPermsDefault::refresh()
{
for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
{
mShareWithGroup[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"ShareWithGroup");
mEveryoneCopy[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"EveryoneCopy");
mNextOwnerCopy[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"NextOwnerCopy");
mNextOwnerModify[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"NextOwnerModify");
mNextOwnerTransfer[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"NextOwnerTransfer");
mEveryoneExport[iter] = gSavedPerAccountSettings.getBOOL(sCategoryNames[iter]+"EveryoneExport");
}
}
void LLFloaterPermsDefault::onClose(bool app_quitting)
{
// Cancel any unsaved changes before closing.
// Note: when closed due to the OK button this amounts to a no-op.
cancel();
LLFloater::onClose(app_quitting);
}

View File

@@ -36,35 +36,55 @@
#include "llfloater.h"
class LLFloaterPerms : public LLFloater, public LLFloaterSingleton<LLFloaterPerms>
namespace LLFloaterPerms
{
friend class LLUISingleton<LLFloaterPerms, VisibilityPolicy<LLFloater> >;
// Convenience methods to get current permission preference bitfields from saved settings:
U32 getEveryonePerms(std::string prefix=""); // prefix + "EveryoneCopy"
U32 getGroupPerms(std::string prefix=""); // prefix + "ShareWithGroup"
U32 getNextOwnerPerms(std::string prefix=""); // bitfield for prefix + "NextOwner" + "Copy", "Modify", and "Transfer"
U32 getNextOwnerPermsInverted(std::string prefix="");
}
class LLFloaterPermsDefault : public LLFloater, public LLFloaterSingleton<LLFloaterPermsDefault>
{
friend class LLUISingleton<LLFloaterPermsDefault, VisibilityPolicy<LLFloater> >;
public:
/*virtual*/ void onClose(bool app_quitting = false);
/*virtual*/ BOOL postBuild();
void initCheckboxes(bool export_support, const std::string& type);
void ok();
void cancel();
static void onClickOK(void*);
static void onClickCancel(void*);
// Convenience methods to get current permission preference bitfields from saved settings:
static U32 getEveryonePerms(std::string prefix=""); // prefix + "EveryoneCopy"
static U32 getGroupPerms(std::string prefix=""); // prefix + "ShareWithGroup"
static U32 getNextOwnerPerms(std::string prefix=""); // bitfield for prefix + "NextOwner" + "Copy", "Modify", and "Transfer"
void onClickOK();
void onClickCancel();
static void sendInitialPerms();
static void updateCap();
// Update instantiation of sCategoryNames in the .cpp file to match if you change this!
enum Categories
{
CAT_OBJECTS,
CAT_UPLOADS,
CAT_SCRIPTS,
CAT_NOTECARDS,
CAT_GESTURES,
CAT_WEARABLES,
CAT_LAST
};
private:
LLFloaterPerms(const LLSD& seed);
LLFloaterPermsDefault(const LLSD& seed);
void refresh();
/// callback for the menus help button
static void onClickHelp(void* data);
static const std::string sCategoryNames[CAT_LAST];
BOOL // cached values only for implementing cancel.
mShareWithGroup,
mEveryoneCopy,
mNextOwnerCopy,
mNextOwnerModify,
mNextOwnerTransfer;
// cached values only for implementing cancel.
bool mShareWithGroup[CAT_LAST];
bool mEveryoneCopy[CAT_LAST];
bool mEveryoneExport[CAT_LAST];
bool mNextOwnerCopy[CAT_LAST];
bool mNextOwnerModify[CAT_LAST];
bool mNextOwnerTransfer[CAT_LAST];
};
#endif

View File

@@ -1434,8 +1434,8 @@ void LLSnapshotLivePreview::saveTexture()
LLFolderType::FT_SNAPSHOT_CATEGORY,
LLInventoryType::IT_SNAPSHOT,
PERM_ALL, // Note: Snapshots to inventory is a special case of content upload
LLFloaterPerms::getGroupPerms(), // that is more permissive than other uploads
LLFloaterPerms::getEveryonePerms(),
LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads
LLFloaterPerms::getEveryonePerms("Uploads"),
"Snapshot : " + pos_string,
callback, expected_upload_cost, user_data, &LLSnapshotLivePreview::saveTextureDone2))
{

View File

@@ -305,7 +305,7 @@ void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, std::string type,
parent_id,
LLAssetType::AT_LSL_TEXT,
LLInventoryType::IT_LSL,
LLFloaterPerms::getNextOwnerPerms("Script"));
LLFloaterPerms::getNextOwnerPerms("Scripts"));
}
else if ("notecard" == type)
{
@@ -314,7 +314,7 @@ void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, std::string type,
parent_id,
LLAssetType::AT_NOTECARD,
LLInventoryType::IT_NOTECARD,
PERM_ALL);
LLFloaterPerms::getNextOwnerPerms("Notecards"));
}
else if ("gesture" == type)
{
@@ -323,7 +323,7 @@ void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, std::string type,
parent_id,
LLAssetType::AT_GESTURE,
LLInventoryType::IT_GESTURE,
PERM_ALL);
LLFloaterPerms::getNextOwnerPerms("Gestures"));
}
else if ("outfit" == type || ("update outfit" == type && !LLAppearanceMgr::getInstance()->updateBaseOutfit())) // If updateBaseOutfit fails, prompt to make a new outfit
{

View File

@@ -237,7 +237,7 @@ struct MenuFloaterDict : public LLSingleton<MenuFloaterDict>
registerFloater<LLFloaterOutbox> ("outbox");
registerFloater<LLFloaterPathfindingCharacters> ("pathfinding_characters");
registerFloater<LLFloaterPathfindingLinksets> ("pathfinding_linksets");
registerFloater<LLFloaterPerms> ("perm prefs");
registerFloater<LLFloaterPermsDefault> ("perm prefs");
registerFloater<LLFloaterAvatarList> ("radar");
registerFloater<LLFloaterScriptLimits> ("script info");
registerFloater<LLFloaterStats> ("stat bar");

View File

@@ -1544,9 +1544,9 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
result["asset_type"] = "mesh";
result["inventory_type"] = "object";
result["description"] = "(No Description)";
result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms());
result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms());
result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms());
result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads"));
result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads"));
result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads"));
res["mesh_list"] = LLSD::emptyArray();
res["texture_list"] = LLSD::emptyArray();

View File

@@ -181,12 +181,14 @@ void LLPanelContents::onClickNewScript(void *userdata)
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,
PERM_NONE,
PERM_NONE,
LLFloaterPerms::getNextOwnerPerms("Script"));
LLFloaterPerms::getEveryonePerms("Scripts"),
LLFloaterPerms::getGroupPerms("Scripts"),
LLFloaterPerms::getNextOwnerPerms("Scripts"));
std::string desc;
LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
LLPointer<LLViewerInventoryItem> new_item =

View File

@@ -1904,7 +1904,7 @@ void LLLiveLSLEditor::loadAsset()
mScriptEd->enableSave(FALSE);
LLPermissions perm;
perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, gAgent.getGroupID());
perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, LLFloaterPerms::getNextOwnerPerms("Script"));
perm.initMasks(PERM_ALL, PERM_ALL, LLFloaterPerms::getEveryonePerms("Scripts"), LLFloaterPerms::getGroupPerms("Scripts"), LLFloaterPerms::getNextOwnerPerms("Scripts"));
mItem = new LLViewerInventoryItem(mItemUUID,
mObjectUUID,
perm,

View File

@@ -374,6 +374,30 @@ void hooked_process_sound_trigger(LLMessageSystem *msg, void **)
LLFloaterAvatarList::sound_trigger_hook(msg,NULL);
}
void convert_legacy_settings()
{
// Convert legacy settings to new ones here.
if (!gSavedPerAccountSettings.getBOOL("DefaultUploadPermissionsConverted"))
{
gSavedSettings.setBOOL("UploadsEveryoneCopy", gSavedSettings.getBOOL("EveryoneCopy"));
bool val = gSavedPerAccountSettings.getBOOL("EveryoneExport");
gSavedPerAccountSettings.setBOOL("UploadsEveryoneExport", val);
gSavedPerAccountSettings.setBOOL("ObjectsEveryoneExport", val);
val = gSavedSettings.getBOOL("NextOwnerCopy");
gSavedSettings.setBOOL("UploadsNextOwnerCopy", val);
gSavedSettings.setBOOL("ObjectsNextOwnerCopy", val);
val = gSavedSettings.getBOOL("NextOwnerModify");
gSavedSettings.setBOOL("UploadsNextOwnerModify", val);
gSavedSettings.setBOOL("ObjectsNextOwnerModify", val);
val = gSavedSettings.getBOOL("NextOwnerTransfer");
gSavedSettings.setBOOL("UploadsNextOwnerTransfer", val);
gSavedSettings.setBOOL("ObjectsNextOwnerTransfer", val);
val = gSavedSettings.getBOOL("NextOwnerTransfer");
gSavedSettings.setBOOL("UploadsShareWithGroup", gSavedSettings.getBOOL("ShareWithGroup"));
gSavedPerAccountSettings.setBOOL("DefaultUploadPermissionsConverted", true);
}
}
void init_audio()
{
if (FALSE == gSavedSettings.getBOOL("NoAudio"))
@@ -1039,6 +1063,8 @@ bool idle_startup()
gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
}
convert_legacy_settings();
//Default the path if one isn't set.
if (gSavedPerAccountSettings.getString("InstantMessageLogPath").empty())
{
@@ -1554,6 +1580,7 @@ bool idle_startup()
}
if (gSavedSettings.getBOOL("LiruGridInTitle")) gWindowTitle += "- " + gHippoGridManager->getCurrentGrid()->getGridName() + " ";
gViewerWindow->getWindow()->setTitle(gWindowTitle += "- " + name);
// Pass the user information to the voice chat server interface.
LLVoiceClient::getInstance()->userAuthorized(name, gAgentID);
// create the default proximal channel

View File

@@ -47,6 +47,7 @@
#include "llinventorybridge.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
#include "llfloaterperms.h"
#include "lllandmark.h"
#include "llviewerassettype.h"
@@ -950,23 +951,72 @@ void activate_gesture_cb(const LLUUID& inv_item)
LLGestureMgr::instance().activateGesture(inv_item);
}
void create_script_cb(const LLUUID& inv_item)
{
if (!inv_item.isNull())
{
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (item)
{
LLPermissions perm = item->getPermissions();
perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Scripts"));
perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Scripts"));
item->setPermissions(perm);
item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
}
}
}
void create_gesture_cb(const LLUUID& inv_item)
{
if (inv_item.isNull())
return;
LLGestureMgr::instance().activateGesture(inv_item);
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (!item) return;
gInventory.updateItem(item);
gInventory.notifyObservers();
if(!LLPreview::show(inv_item,FALSE))
if (!inv_item.isNull())
{
LLPreviewGesture* preview = LLPreviewGesture::show(std::string("Gesture: ") + item->getName(), inv_item, LLUUID::null);
// Force to be entirely onscreen.
gFloaterView->adjustToFitScreen(preview, FALSE);
LLGestureMgr::instance().activateGesture(inv_item);
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (item)
{
LLPermissions perm = item->getPermissions();
perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures"));
perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures"));
item->setPermissions(perm);
item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
if (!LLPreview::show(inv_item,FALSE))
{
LLPreviewGesture* preview = LLPreviewGesture::show(std::string("Gesture: ") + item->getName(), inv_item, LLUUID::null);
// Force to be entirely onscreen.
gFloaterView->adjustToFitScreen(preview, FALSE);
}
}
}
}
void create_notecard_cb(const LLUUID& inv_item)
{
if (!inv_item.isNull())
{
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (item)
{
LLPermissions perm = item->getPermissions();
perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Notecards"));
perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Notecards"));
item->setPermissions(perm);
item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
}
}
}
@@ -1225,22 +1275,45 @@ void create_new_item(const std::string& name,
LLViewerAssetType::generateDescriptionFor(asset_type, desc);
next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER;
if (inv_type == LLInventoryType::IT_GESTURE)
LLPointer<LLInventoryCallback> cb = NULL;
switch(inv_type)
{
LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(create_gesture_cb);
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type,
NOT_WEARABLE, next_owner_perm, cb);
case LLInventoryType::IT_LSL:
{
cb = new LLBoostFuncInventoryCallback(create_script_cb);
next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Scripts");
break;
}
case LLInventoryType::IT_GESTURE:
{
cb = new LLBoostFuncInventoryCallback(create_gesture_cb);
next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Gestures");
break;
}
case LLInventoryType::IT_NOTECARD:
{
cb = new LLBoostFuncInventoryCallback(create_notecard_cb);
next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Notecards");
break;
}
default:
break;
}
else
{
LLPointer<LLInventoryCallback> cb = NULL;
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type,
NOT_WEARABLE, next_owner_perm, cb);
}
create_inventory_item(gAgent.getID(),
gAgent.getSessionID(),
parent_id,
LLTransactionID::tnull,
name,
desc,
asset_type,
inv_type,
NOT_WEARABLE,
next_owner_perm,
cb);
}
const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not)
@@ -1281,7 +1354,7 @@ const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probabl
parent_id,
LLAssetType::AT_LSL_TEXT,
LLInventoryType::IT_LSL,
PERM_MOVE | PERM_TRANSFER);
PERM_MOVE | PERM_TRANSFER); // overridden in create_new_item
}
else if ("notecard" == type_name)
{
@@ -1290,7 +1363,7 @@ const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probabl
parent_id,
LLAssetType::AT_NOTECARD,
LLInventoryType::IT_NOTECARD,
PERM_ALL);
PERM_ALL); // overridden in create_new_item
}
else if ("gesture" == type_name)
{
@@ -1299,7 +1372,7 @@ const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probabl
parent_id,
LLAssetType::AT_GESTURE,
LLInventoryType::IT_GESTURE,
PERM_ALL);
PERM_ALL); // overridden in create_new_item
}
else
{

View File

@@ -440,9 +440,20 @@ class LLFileUploadBulk : public view_listener_t
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
gSavedSettings.setBOOL("TemporaryUpload", enabled);
upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
display_name, callback, expected_upload_cost, userdata);
upload_new_resource(
filename,
asset_name,
asset_name,
0,
LLFolderType::FT_NONE,
LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms("Uploads"),
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
display_name,
callback,
expected_upload_cost,
userdata);
}
}
@@ -925,7 +936,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
if(exten == "lsl" || exten == "gesture" || exten == "notecard") // added notecard Oct 15 2009
{
LLInventoryType::EType inv_type = LLInventoryType::IT_GESTURE;
if(exten == "lsl") inv_type = LLInventoryType::IT_LSL;
if (exten == "lsl") inv_type = LLInventoryType::IT_LSL;
else if(exten == "gesture") inv_type = LLInventoryType::IT_GESTURE;
else if(exten == "notecard") inv_type = LLInventoryType::IT_NOTECARD;
create_inventory_item( gAgent.getID(),
@@ -1374,6 +1385,18 @@ void NewResourceItemCallback::fire(const LLUUID& new_item_id)
LLUUID vfile_id = LLUUID(new_item->getDescription());
if(vfile_id.isNull()) return;
new_item->setDescription("(No Description)");
std::string type("Uploads");
switch(new_item->getInventoryType())
{
case LLInventoryType::IT_LSL: type = "Scripts"; break;
case LLInventoryType::IT_GESTURE: type = "Gestures"; break;
case LLInventoryType::IT_NOTECARD: type = "Notecard"; break;
}
LLPermissions perms = new_item->getPermissions();
perms.setMaskNext(LLFloaterPerms::getNextOwnerPerms(type));
perms.setMaskGroup(LLFloaterPerms::getGroupPerms(type));
perms.setMaskEveryone(LLFloaterPerms::getEveryonePerms(type));
new_item->setPermissions(perms);
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();

View File

@@ -2622,6 +2622,7 @@ void LLViewerObject::saveScript(
* interaction with doUpdateInventory() called below.
*/
lldebugs << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << llendl;
LLPointer<LLViewerInventoryItem> task_item =
new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
item->getAssetUUID(), item->getType(),

View File

@@ -967,8 +967,8 @@ void LLObjectBackup::importObject_continued(AIFilePicker* filepicker)
// User canceled save.
return;
}
std::string file_name = filepicker->getFilename();
std::string file_name = filepicker->getFilename();
mFolder = gDirUtilp->getDirName(file_name);
llifstream import_file(file_name);
LLSDSerialize::fromXML(mLLSD, import_file);

View File

@@ -58,6 +58,7 @@
#include "lldir.h"
#include "lleventpoll.h"
#include "llfloatergodtools.h"
#include "llfloaterperms.h"
#include "llfloaterreporter.h"
#include "llfloaterregioninfo.h"
#include "llhttpnode.h"
@@ -1694,6 +1695,7 @@ void LLViewerRegion::unpackRegionHandshake()
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
capabilityNames.append("AgentPreferences");
capabilityNames.append("AgentState");
capabilityNames.append("AttachmentResources");
//capabilityNames.append("AvatarPickerSearch"); //Display name/SLID lookup (llfloateravatarpicker.cpp)
@@ -1998,6 +2000,8 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
{
mCapabilitiesReceivedSignal(getRegionID());
LLFloaterPermsDefault::sendInitialPerms();
// This is a single-shot signal. Forget callbacks to save resources.
mCapabilitiesReceivedSignal.disconnect_all_slots();

View File

@@ -210,8 +210,6 @@ Dieses Kontrollk&#xE4;stchen zeigt Folgendes an:
Die Second Life Website f&#xFC;r weitere Informationen &#xFC;ber Partnerschaften &#xF6;ffnen?<usetemplate name="okcancelbuttons" yestext="Gehe zu Seite"/></notification>
<notification name="ClickUploadHelpPermissions">Ihre Standardberechtigung funktionieren in &#xE4;lteren Regionen m&#xF6;glicherweise nicht.</notification>
<notification name="ClickWebProfileHelpAvatar">Wenn dieser Einwohner einen Webprofil-URL angegeben hat, k&#xF6;nnen Sie:
* Auf &#x201E;Laden&#x201C; klicken und die Seite in dieser Web-Registerkarte anzeigen.
* Auf Laden &gt; &#x201E;In externem Browser&#x201C; klicken und die Seite im Standard-Browser anzeigen.

View File

@@ -1,15 +1,67 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="perm prefs" title="Default Upload Permissions" width="315" height="180" rect_control="FloaterPermPrefsRect" can_close="true" can_minimize="true">
<panel label="Permissions" name="permissions" width="292" height="120" left="10" border="true" bottom="-140">
<button name="help" label="?" label_selected="?" bottom_delta="-25" height="18" width="22" left="260"/>
<check_box bottom_delta="0" width="106" height="16" left="10" initial_value="false" label="Share with group" name="share_with_group" control_name="ShareWithGroup"/>
<check_box bottom_delta="-20" width="130" height="16" initial_value="false" label="Allow anyone to copy" name="everyone_copy" control_name="EveryoneCopy"/>
<check_box bottom_delta="-20" label="Allow exportation" name="everyone_export" control_name="EveryoneExport"/>
<text bottom_delta="-18" name="NextOwnerLabel" height="10">Next owner can:</text>
<check_box bottom_delta="-30" width="78" height="16" initial_value="false" label="Modify" name="next_owner_modify" control_name="NextOwnerModify"/>
<check_box bottom_delta="0" width="88" height="16" left_delta="78" initial_value="false" label="Copy" name="next_owner_copy" control_name="NextOwnerCopy"/>
<check_box bottom_delta="0" width="106" height="16" left_delta="88" initial_value="true" label="Resell/Give away" name="next_owner_transfer" control_name="NextOwnerTransfer"/>
<floater name="perm prefs" title="Default Creation Permissions" width="820" height="250" rect_control="FloaterPermPrefsRect" can_close="true" can_minimize="true">
<panel label="Permissions" name="permissions" width="800" height="180" left="10" border="false" bottom="-210" mouse_opaque="false">
<view_border bevel_style="none" height="18" bottom_delta="-26" left="0" width="430"/>
<text follows="left|top" bottom_delta="0" left="4" name="NextOwnerLabel" height="16">Next owner:</text>
<text follows="left|top" bottom_delta="0" left_delta="120" name="NextOwnerCopyLabel" height="16">Copy</text>
<text follows="left|top" bottom_delta="0" left_delta="105" name="NextOwnerModifyLabel" height="16">Modify</text>
<text follows="left|top" bottom_delta="0" left_delta="105" name="NextOwnerTransferLabel" height="16">Transfer</text>
<text follows="left|top" bottom_delta="0" left_delta="105" name="ShareWithGroupLabel" height="16">Share With Group</text>
<text follows="left|top" bottom_delta="0" left_delta="105" name="AnyoneCopyLabel" height="16">Allow anyone to copy</text>
<text follows="left|top" bottom_delta="0" left_delta="125" width="120" name="ExportationLabel" height="16">Allow exportation</text>
<text follows="left|top" bottom_delta="-26" left="4" name="ObjectsLabel" height="16" tool_tip="Set default permissions for when Objects are created">Objects</text>
<icon follows="left|top" bottom_delta="0" left_delta="102" image_name="inv_item_object.tga" width="18" height="16"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="18" label="" name="Objectsnext_owner_copy" control_name="ObjectsNextOwnerCopy"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Objectsnext_owner_modify" control_name="ObjectsNextOwnerModify"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Objectsnext_owner_transfer" control_name="ObjectsNextOwnerTransfer"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Objectsshare_with_group" control_name="ObjectsShareWithGroup"/>
<check_box follows="left|top" bottom_delta="0" width="120" height="16" left_delta="110" label="" name="Objectseveryone_copy" control_name="ObjectsEveryoneCopy"/>
<check_box follows="left|top" bottom_delta="0" height="16" left_delta="130" label="" name="Objectseveryone_export" control_name="ObjectsEveryoneExport"/>
<text follows="left|top" bottom_delta="-20" left="4" name="UploadsLabel" height="16" tool_tip="Set default permissions for uploaded items">Uploads</text>
<icon follows="left|top" bottom_delta="0" left_delta="102" image_name="inv_item_texture.tga" width="18" height="16"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="18" label="" name="Uploadsnext_owner_copy" control_name="UploadsNextOwnerCopy"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Uploadsnext_owner_modify" control_name="UploadsNextOwnerModify"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Uploadsnext_owner_transfer" control_name="UploadsNextOwnerTransfer"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Uploadsshare_with_group" control_name="UploadsShareWithGroup"/>
<check_box follows="left|top" bottom_delta="0" width="120" height="16" left_delta="110" label="" name="Uploadseveryone_copy" control_name="UploadsEveryoneCopy"/>
<check_box follows="left|top" bottom_delta="0" height="16" left_delta="130" label="" name="Uploadseveryone_export" control_name="UploadsEveryoneExport"/>
<text follows="left|top" bottom_delta="-20" left="4" name="ScriptsLabel" height="16" tool_tip="Set default permissions for when Scripts are created">Scripts</text>
<icon follows="left|top" bottom_delta="0" left_delta="102" image_name="inv_item_script.tga" width="18" height="16"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="18" label="" name="Scriptsnext_owner_copy" control_name="ScriptsNextOwnerCopy"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Scriptsnext_owner_modify" control_name="ScriptsNextOwnerModify"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Scriptsnext_owner_transfer" control_name="ScriptsNextOwnerTransfer"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Scriptsshare_with_group" control_name="ScriptsShareWithGroup"/>
<check_box follows="left|top" bottom_delta="0" width="120" height="16" left_delta="110" label="" name="Scriptseveryone_copy" control_name="ScriptsEveryoneCopy"/>
<check_box follows="left|top" bottom_delta="0" height="16" left_delta="130" label="" name="Scriptseveryone_export" control_name="ScriptsEveryoneExport"/>
<text follows="left|top" bottom_delta="-20" left="4" name="NotecardsLabel" height="16" tool_tip="Set default permissions for when Notecards are created">Notecards</text>
<icon follows="left|top" bottom_delta="0" left_delta="102" image_name="inv_item_notecard.tga" width="18" height="16"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="18" label="" name="Notecardsnext_owner_copy" control_name="NotecardsNextOwnerCopy"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Notecardsnext_owner_modify" control_name="NotecardsNextOwnerModify"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Notecardsnext_owner_transfer" control_name="NotecardsNextOwnerTransfer"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Notecardsshare_with_group" control_name="NotecardsShareWithGroup"/>
<check_box follows="left|top" bottom_delta="0" width="120" height="16" left_delta="110" label="" name="Notecardseveryone_copy" control_name="NotecardsEveryoneCopy"/>
<check_box follows="left|top" bottom_delta="0" height="16" left_delta="130" label="" name="Notecardseveryone_export" control_name="NotecardsEveryoneExport"/>
<text follows="left|top" bottom_delta="-20" left="4" name="GesturesLabel" height="16" tool_tip="Set default permissions for when Gestures are created">Gestures</text>
<icon follows="left|top" bottom_delta="0" left_delta="102" image_name="inv_item_gesture.tga" width="18" height="16"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="18" label="" name="Gesturesnext_owner_copy" control_name="GesturesNextOwnerCopy"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Gesturesnext_owner_modify" control_name="GesturesNextOwnerModify"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Gesturesnext_owner_transfer" control_name="GesturesNextOwnerTransfer"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Gesturesshare_with_group" control_name="ShareWithGroup"/>
<check_box follows="left|top" bottom_delta="0" width="120" height="16" left_delta="110" label="" name="Gestureseveryone_copy" control_name="GesturesEveryoneCopy"/>
<check_box follows="left|top" bottom_delta="0" height="16" left_delta="130" label="" name="Gestureseveryone_export" control_name="GesturesEveryoneExport"/>
<text follows="left|top" bottom_delta="-20" left="4" name="WearablesLabel" height="16" tool_tip="Set default permissions for when Clothing or Body Parts are created">Wearables</text>
<icon follows="left|top" bottom_delta="0" left_delta="102" image_name="inv_item_clothing.tga" width="18" height="16"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="18" label="" name="Wearablesnext_owner_copy" control_name="WearablesNextOwnerCopy"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Wearablesnext_owner_modify" control_name="WearablesNextOwnerModify"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Wearablesnext_owner_transfer" control_name="WearablesNextOwnerTransfer"/>
<check_box follows="left|top" bottom_delta="0" width="100" height="16" left_delta="110" label="" name="Wearablesshare_with_group" control_name="WearablesShareWithGroup"/>
<check_box follows="left|top" bottom_delta="0" width="120" height="16" left_delta="110" label="" name="Wearableseveryone_copy" control_name="WearablesEveryoneCopy"/>
<check_box follows="left|top" bottom_delta="0" height="16" left_delta="130" label="" name="Wearableseveryone_export" control_name="WearablesEveryoneExport"/>
</panel>
<button bottom_delta="-30" height="20" label="OK" label_selected="OK" left="90" name="ok" width="100"/>
<button bottom_delta="0" height="20" label="Cancel" label_selected="Cancel" left_delta="105" name="cancel" width="100"/>
<button bottom_delta="-30" height="20" label="OK" label_selected="OK" left="297" name="ok" width="100">
<button.commit_callback function="PermsDefault.OK"/>
</button>
<button bottom_delta="0" height="20" label="Cancel" label_selected="Cancel" left_delta="105" name="cancel" width="100">
<button.commit_callback function="PermsDefault.Cancel"/>
</button>
</floater>

View File

@@ -693,13 +693,6 @@ Go to the [SECOND_LIFE] web site for more information on partnering?
yestext="Go to Page"/>
</notification>
<notification
icon="alertmodal.tga"
name="ClickUploadHelpPermissions"
type="alertmodal">
Your default permissions may not work in older regions.
</notification>
<notification
icon="alertmodal.tga"
name="ClickWebProfileHelpAvatar"
@@ -9750,6 +9743,17 @@ An internal error prevented us from properly updating your viewer. The L$ balan
Cannot create large prims that intersect other players. Please re-try when other players have moved.
</notification>
<notification
icon="alertmodal.tga"
name="DefaultObjectPermissions"
type="alert">
There was a problem saving the default permissions due to the following reason: [REASON]. Please try setting the default permissions later.
<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<!-- Singularity Specific notifications should go below here, alphabetically -->
<!-- Singu Note: RLVa notifications come first here -->

View File

@@ -137,13 +137,13 @@
</combo_box>
<text bottom="-19" left_delta="85" name="text_box7" halign="center" width="145">Next Owner Perms</text>
<text bottom="-34" left_delta="0" name="text_box8" halign="center" width="65">Objects</text>
<check_box follows="top" height="16" initial_value="false" label="Copy" tool_tip="Next owner can make copies of creations" name="next_owner_copy" control_name="NextOwnerCopy"/>
<check_box follows="top" height="16" initial_value="false" label="Modify" tool_tip="Next owner can edit creations" name="next_owner_modify" control_name="NextOwnerModify"/>
<check_box follows="top" height="16" initial_value="true" label="Transfer" tool_tip="Next owner can give(or sell) creations" name="next_owner_transfer" control_name="NextOwnerTransfer" enabled_control="NextOwnerCopy"/>
<check_box follows="top" height="16" initial_value="false" label="Copy" tool_tip="Next owner can make copies of creations" name="next_owner_copy" control_name="ObjectsNextOwnerCopy"/>
<check_box follows="top" height="16" initial_value="false" label="Modify" tool_tip="Next owner can edit creations" name="next_owner_modify" control_name="ObjectsNextOwnerModify"/>
<check_box follows="top" height="16" initial_value="true" label="Transfer" tool_tip="Next owner can give(or sell) creations" name="next_owner_transfer" control_name="ObjectsNextOwnerTransfer" enabled_control="ObjectsNextOwnerCopy"/>
<text bottom="-34" left_delta="85" name="text_box9" halign="center" width="65">Scripts</text>
<check_box follows="top" height="16" label="Copy" tool_tip="Next owner can make copies of scripts" name="script_next_owner_copy" control_name="ScriptNextOwnerCopy"/>
<check_box follows="top" height="16" label="Modify" tool_tip="Next owner can edit scripts" name="script_next_owner_modify" control_name="ScriptNextOwnerModify"/>
<check_box follows="top" height="16" label="Transfer" tool_tip="Next owner can give(or sell) scripts" name="script_next_owner_transfer" control_name="ScriptNextOwnerTransfer" enabled_control="ScriptNextOwnerCopy"/>
<check_box follows="top" height="16" label="Copy" tool_tip="Next owner can make copies of scripts" name="script_next_owner_copy" control_name="ScriptsNextOwnerCopy"/>
<check_box follows="top" height="16" label="Modify" tool_tip="Next owner can edit scripts" name="script_next_owner_modify" control_name="ScriptsNextOwnerModify"/>
<check_box follows="top" height="16" label="Transfer" tool_tip="Next owner can give(or sell) scripts" name="script_next_owner_transfer" control_name="ScriptsNextOwnerTransfer" enabled_control="ScriptsNextOwnerCopy"/>
<check_box bottom="-131" left="5" follows="top" height="16" label="Phantom" name="EmPhantomToggle" control_name="EmeraldBuildPrefs_Phantom"/>
<check_box follows="top" height="16" label="Physical" name="EmPhysicalToggle" control_name="EmeraldBuildPrefs_Physical"/>
<check_box follows="top" height="16" label="Temporary" name="EmTemporaryToggle" control_name="EmeraldBuildPrefs_Temporary"/>

View File

@@ -372,10 +372,6 @@ Marcando este ítem, se mostrará:
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir a la Página"/>
</notification>
<notification name="ClickUploadHelpPermissions">
Tus permisos por defecto no funcionarán en regiones antiguas.
</notification>
<notification name="ClickWebProfileHelpAvatar">
Si este residente ha indicado una URL para mostrar un perfil en la web, tu puedes:
* Pulsar &apos;Cargar&apos; para ver la página en esta pestaña web.

View File

@@ -244,10 +244,6 @@ Aller sur le site de [SECOND_LIFE_GRID] pour avoir plus d'informations sur les p
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Aller sur cette page"/>
</notification>
<notification name="ClickUploadHelpPermissions">
Il est possible que vos droits par défaut ne fonctionnent pas dans les anciennes régions.
</notification>
<notification name="ClickWebProfileHelpAvatar">
Si ce résident a défini une URL de profil web, vous pouvez:
* Cliquer sur Charger pour afficher la page dans cet onglet;

View File

@@ -235,9 +235,6 @@ Marcando questo campo si mostrerà:
Vai al sito web di Second Life per ulteriori informazioni sulla partnership?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="ClickUploadHelpPermissions">
I tuoi permessi di base possono non funzionare nelle regioni più vecchie.
</notification>
<notification name="ClickWebProfileHelpAvatar">
Se questo/a residente ha impostato una URL nel suo profilo puoi:
* Cliccare &apos;Carica&apos; per vedere la pagina in questa finestra web.

View File

@@ -300,10 +300,6 @@ Ir para o site do [SECOND_LIFE] para mais informações sobre parceria?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir para a Página"/>
</notification>
<notification name="ClickUploadHelpPermissions">
Suas permissões padrão podem não funcionar em regiões antigas.
</notification>
<notification name="ClickWebProfileHelpAvatar">
Se este Residente definiu uma URL de perfil na web, então você pode:
* Clicar em 'Carregar' para ver a página na aba Web.