Merged with RLV-2.1.2 branch

--HG--
branch : RLVa
meow-7.2.2
Kitty Barnett 2010-09-25 22:10:36 +02:00
commit d264c7308e
8 changed files with 133 additions and 49 deletions

View File

@ -37,7 +37,7 @@
<key>RestrainedLoveForbidGiveToRLV</key>
<map>
<key>Comment</key>
<string>When FALSE, allows to give sub-folders to the #RLV RestrainedLove folder.</string>
<string>When TRUE, forbids to give sub-folders to the #RLV RestrainedLove folder.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -45,6 +45,28 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>RestrainedLoveReplaceWhenFolderBeginsWith</key>
<map>
<key>Comment</key>
<string>If a folder name begins with this string, its attach behavior will always be "replace", never "stack". Default is blank (disabled).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>RestrainedLoveStackWhenFolderBeginsWith</key>
<map>
<key>Comment</key>
<string>If a folder name begins with this string, its attach behavior will always be "stack", never "replace". Default is "+".</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>+</string>
</map>
<key>RLVaDebugHideUnsetDuplicate</key>
<map>
<key>Comment</key>

View File

@ -77,11 +77,11 @@ void RlvNotifications::onGiveToRLVConfirmation(const LLSD& notification, const L
//
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
BOOL RlvSettings::fCompositeFolders = FALSE;
bool RlvSettings::fCompositeFolders = FALSE;
#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS
BOOL RlvSettings::fLegacyNaming = TRUE;
BOOL RlvSettings::fNoSetEnv = FALSE;
BOOL RlvSettings::fShowNameTags = FALSE;
bool RlvSettings::fLegacyNaming = TRUE;
bool RlvSettings::fNoSetEnv = FALSE;
bool RlvSettings::fShowNameTags = FALSE;
// Checked: 2010-02-27 (RLVa-1.2.0a) | Modified: RLVa-1.1.0i
void RlvSettings::initClass()
@ -90,18 +90,18 @@ void RlvSettings::initClass()
if (!fInitialized)
{
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
fCompositeFolders = rlvGetSettingBOOL(RLV_SETTING_ENABLECOMPOSITES, FALSE);
fCompositeFolders = rlvGetSetting<bool>(RLV_SETTING_ENABLECOMPOSITES, false);
if (gSavedSettings.controlExists(RLV_SETTING_ENABLECOMPOSITES))
gSavedSettings.getControl(RLV_SETTING_ENABLECOMPOSITES)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &fCompositeFolders));
#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS
fLegacyNaming = rlvGetSettingBOOL(RLV_SETTING_ENABLELEGACYNAMING, TRUE);
fLegacyNaming = rlvGetSetting<bool>(RLV_SETTING_ENABLELEGACYNAMING, true);
if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING))
gSavedSettings.getControl(RLV_SETTING_ENABLELEGACYNAMING)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &fLegacyNaming));
fNoSetEnv = rlvGetSettingBOOL(RLV_SETTING_NOSETENV, FALSE);
fNoSetEnv = rlvGetSetting<bool>(RLV_SETTING_NOSETENV, false);
fShowNameTags = rlvGetSettingBOOL(RLV_SETTING_SHOWNAMETAGS, FALSE);
fShowNameTags = rlvGetSetting<bool>(RLV_SETTING_SHOWNAMETAGS, false);
if (gSavedSettings.controlExists(RLV_SETTING_SHOWNAMETAGS))
gSavedSettings.getControl(RLV_SETTING_SHOWNAMETAGS)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &fShowNameTags));
@ -126,7 +126,7 @@ void RlvSettings::initClass()
#endif // RLV_EXTENSION_STARTLOCATION
// Checked: 2010-02-27 (RLVa-1.2.0a) | Added: RLVa-1.1.0i
bool RlvSettings::onChangedSettingBOOL(const LLSD& sdValue, BOOL* pfSetting)
bool RlvSettings::onChangedSettingBOOL(const LLSD& sdValue, bool* pfSetting)
{
if (pfSetting)
*pfSetting = sdValue.asBoolean();

View File

@ -37,51 +37,55 @@ typedef std::vector<const LLViewerObject*> c_llvo_vec_t;
// RlvSettings
//
inline BOOL rlvGetSettingBOOL(const std::string& strSetting, BOOL fDefault)
template<typename T> T rlvGetSetting(const std::string& strSetting, const T& defaultValue)
{
RLV_ASSERT_DBG(gSavedSettings.controlExists(strSetting));
return (gSavedSettings.controlExists(strSetting)) ? gSavedSettings.getBOOL(strSetting) : fDefault;
return (gSavedSettings.controlExists(strSetting)) ? gSavedSettings.get<T>(strSetting) : defaultValue;
}
inline BOOL rlvGetPerUserSettingsBOOL(const std::string& strSetting, BOOL fDefault)
template<typename T> T rlvGetPerUserSettings(const std::string& strSetting, const T& defaultValue)
{
RLV_ASSERT_DBG(gSavedPerAccountSettings.controlExists(strSetting));
return (gSavedPerAccountSettings.controlExists(strSetting)) ? gSavedPerAccountSettings.getBOOL(strSetting) : fDefault;
return (gSavedPerAccountSettings.controlExists(strSetting)) ? gSavedPerAccountSettings.get<T>(strSetting) : defaultValue;
}
class RlvSettings
{
public:
static BOOL getDebug() { return rlvGetSettingBOOL(RLV_SETTING_DEBUG, FALSE); }
static BOOL getForbidGiveToRLV() { return rlvGetSettingBOOL(RLV_SETTING_FORBIDGIVETORLV, TRUE); }
static BOOL getNoSetEnv() { return fNoSetEnv; }
static bool getDebug() { return rlvGetSetting<bool>(RLV_SETTING_DEBUG, false); }
static bool getForbidGiveToRLV() { return rlvGetSetting<bool>(RLV_SETTING_FORBIDGIVETORLV, true); }
static bool getNoSetEnv() { return fNoSetEnv; }
static BOOL getDebugHideUnsetDup() { return rlvGetSettingBOOL(RLV_SETTING_DEBUGHIDEUNSETDUP, FALSE); }
static std::string getWearAddPrefix() { return rlvGetSetting<std::string>(RLV_SETTING_WEARADDPREFIX, LLStringUtil::null); }
static std::string getWearReplacePrefix() { return rlvGetSetting<std::string>(RLV_SETTING_WEARREPLACEPREFIX, LLStringUtil::null); }
static bool getDebugHideUnsetDup() { return rlvGetSetting<bool>(RLV_SETTING_DEBUGHIDEUNSETDUP, false); }
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
static BOOL getEnableComposites() { return fCompositeFolders; }
static BOOL getEnableComposites() { return fCompositeFolders; }
#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS
static BOOL getEnableLegacyNaming() { return fLegacyNaming; }
static BOOL getEnableSharedWear() { return rlvGetSettingBOOL(RLV_SETTING_ENABLESHAREDWEAR, FALSE); }
static BOOL getHideLockedLayers() { return rlvGetSettingBOOL(RLV_SETTING_HIDELOCKEDLAYER, FALSE); }
static BOOL getHideLockedAttach() { return rlvGetSettingBOOL(RLV_SETTING_HIDELOCKEDATTACH, FALSE); }
static BOOL getHideLockedInventory() { return rlvGetSettingBOOL(RLV_SETTING_HIDELOCKEDINVENTORY, FALSE); }
static BOOL getSharedInvAutoRename() { return rlvGetSettingBOOL(RLV_SETTING_SHAREDINVAUTORENAME, TRUE); }
static BOOL getShowNameTags() { return fShowNameTags; }
static bool getEnableLegacyNaming() { return fLegacyNaming; }
static bool getEnableSharedWear() { return rlvGetSetting<bool>(RLV_SETTING_ENABLESHAREDWEAR, false); }
static bool getHideLockedLayers() { return rlvGetSetting<bool>(RLV_SETTING_HIDELOCKEDLAYER, false); }
static bool getHideLockedAttach() { return rlvGetSetting<bool>(RLV_SETTING_HIDELOCKEDATTACH, false); }
static bool getHideLockedInventory() { return rlvGetSetting<bool>(RLV_SETTING_HIDELOCKEDINVENTORY, false); }
static bool getSharedInvAutoRename() { return rlvGetSetting<bool>(RLV_SETTING_SHAREDINVAUTORENAME, true); }
static bool getShowNameTags() { return fShowNameTags; }
#ifdef RLV_EXTENSION_STARTLOCATION
static BOOL getLoginLastLocation() { return rlvGetPerUserSettingsBOOL(RLV_SETTING_LOGINLASTLOCATION, TRUE); }
static bool getLoginLastLocation() { return rlvGetPerUserSettings<bool>(RLV_SETTING_LOGINLASTLOCATION, true); }
static void updateLoginLastLocation();
#endif // RLV_EXTENSION_STARTLOCATION
static void initClass();
protected:
static bool onChangedSettingBOOL(const LLSD& sdValue, BOOL* pfSetting);
static bool onChangedSettingBOOL(const LLSD& sdValue, bool* pfSetting);
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
static BOOL fCompositeFolders;
#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS
static BOOL fLegacyNaming;
static BOOL fNoSetEnv;
static BOOL fShowNameTags;
static bool fLegacyNaming;
static bool fNoSetEnv;
static bool fShowNameTags;
};
// ============================================================================

View File

@ -279,6 +279,8 @@ enum ERlvAttachGroupType
#define RLV_SETTING_DEBUG "RestrainedLoveDebug"
#define RLV_SETTING_NOSETENV "RestrainedLoveNoSetEnv"
#define RLV_SETTING_FORBIDGIVETORLV "RestrainedLoveForbidGiveToRLV"
#define RLV_SETTING_WEARADDPREFIX "RestrainedLoveStackWhenFolderBeginsWith"
#define RLV_SETTING_WEARREPLACEPREFIX "RestrainedLoveReplaceWhenFolderBeginsWith"
#define RLV_SETTING_DEBUGHIDEUNSETDUP "RLVaDebugHideUnsetDuplicate"
#define RLV_SETTING_ENABLECOMPOSITES "RLVaEnableCompositeFolders"

View File

@ -1779,7 +1779,7 @@ ERlvCmdRet RlvHandler::onGetInvWorn(const RlvCommand& rlvCmd, std::string& strRe
// Collect everything @attachall would be attaching
LLInventoryModel::cat_array_t folders; LLInventoryModel::item_array_t items;
RlvWearableItemCollector f(pFolder->getUUID(), true, true);
RlvWearableItemCollector f(pFolder, RlvForceWear::ACTION_WEAR_REPLACE, RlvForceWear::FLAG_MATCHALL);
gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, f);
rlv_wear_info wi = {0};

View File

@ -334,7 +334,7 @@ void RlvForceWear::forceFolder(const LLViewerInventoryCategory* pFolder, EWearAc
// Grab a list of all the items we'll be wearing/attaching
LLInventoryModel::cat_array_t folders; LLInventoryModel::item_array_t items;
RlvWearableItemCollector f(pFolder->getUUID(), isWearAction(eAction), (eFlags & FLAG_MATCHALL));
RlvWearableItemCollector f(pFolder, eAction, eFlags);
gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, f);
for (S32 idxItem = 0, cntItem = items.count(); idxItem < cntItem; idxItem++)
@ -357,7 +357,7 @@ void RlvForceWear::forceFolder(const LLViewerInventoryCategory* pFolder, EWearAc
{
// The check for whether we're replacing a currently worn composite item happens in onWearableArrived()
if (!isAddWearable(pItem))
addWearable(pRlvItem, eAction);
addWearable(pRlvItem, f.getWearAction(pRlvItem->getParentUUID()));
}
else
{
@ -394,7 +394,7 @@ void RlvForceWear::forceFolder(const LLViewerInventoryCategory* pFolder, EWearAc
else
#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS
{
addAttachment(pRlvItem, eAction);
addAttachment(pRlvItem, f.getWearAction(pRlvItem->getParentUUID()));
}
}
}

View File

@ -29,6 +29,8 @@
#include "rlvinventory.h"
#include "rlvhandler.h"
#include "boost/algorithm/string.hpp"
// ============================================================================
// Static variable initialization
//
@ -546,6 +548,23 @@ void RlvGiveToRLVAgentOffer::doneIdle()
// RlvWearableItemCollector
//
// Checked: 2010-09-25 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
RlvForceWear::EWearAction RlvWearableItemCollector::getWearActionNormal(const LLInventoryCategory* pFolder)
{
RLV_ASSERT_DBG(!RlvInventory::isFoldedFolder(pFolder, false));
if ( (RlvForceWear::ACTION_WEAR_REPLACE == m_eWearAction) && (!m_strWearAddPrefix.empty()) &&
(boost::algorithm::starts_with(pFolder->getName(), m_strWearAddPrefix)))
{
return RlvForceWear::ACTION_WEAR_ADD;
}
else if ( (RlvForceWear::ACTION_WEAR_ADD == m_eWearAction) && (!m_strWearReplacePrefix.empty()) &&
(boost::algorithm::starts_with(pFolder->getName(), m_strWearReplacePrefix)) )
{
return RlvForceWear::ACTION_WEAR_REPLACE;
}
return (pFolder->getUUID() != m_idFolder) ? getWearAction(pFolder->getParentUUID()) : m_eWearAction;
}
// Checked: 2010-04-07 (RLVa-1.2.0d) | Added: RLVa-0.2.0e
const LLUUID& RlvWearableItemCollector::getFoldedParent(const LLUUID& idFolder) const
{
@ -558,6 +577,20 @@ const LLUUID& RlvWearableItemCollector::getFoldedParent(const LLUUID& idFolder)
return (m_FoldingMap.end() == itFolder) ? idFolder : itFolder->second;
}
// Checked: 2010-09-25 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
RlvForceWear::EWearAction RlvWearableItemCollector::getWearAction(const LLUUID& idFolder) const
{
std::map<LLUUID, RlvForceWear::EWearAction>::const_iterator itFolder = m_WearActionMap.find(idFolder);
while (itFolder == m_WearActionMap.end())
{
const LLViewerInventoryCategory* pFolder = gInventory.getCategory(idFolder);
if ((!pFolder) || (gInventory.getRootFolderID() == pFolder->getParentUUID()))
break;
itFolder = m_WearActionMap.find(pFolder->getParentUUID());
}
return (itFolder != m_WearActionMap.end()) ? itFolder->second : m_eWearAction;
}
// Checked: 2010-03-20 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
bool RlvWearableItemCollector::onCollectFolder(const LLInventoryCategory* pFolder)
{
@ -569,15 +602,18 @@ bool RlvWearableItemCollector::onCollectFolder(const LLInventoryCategory* pFolde
if (strFolder.empty()) // Shouldn't happen but does... naughty Lindens
return false;
bool fAttach = RlvForceWear::isWearAction(m_eWearAction);
bool fMatchAll = (m_eWearFlags | RlvForceWear::FLAG_MATCHALL);
if (RlvInventory::isFoldedFolder(pFolder, false)) // Check for folder that should get folded under its parent
{
if ( (!m_fAttach) || (1 == RlvInventory::getDirectDescendentsCount(pFolder, LLAssetType::AT_OBJECT)) )
if ( (!fAttach) || (1 == RlvInventory::getDirectDescendentsCount(pFolder, LLAssetType::AT_OBJECT)) )
{ // When attaching there should only be 1 attachment in it
m_Folded.push_front(pFolder->getUUID());
m_FoldingMap.insert(std::pair<LLUUID, LLUUID>(pFolder->getUUID(), idParent));
}
}
else if ( (RLV_FOLDER_PREFIX_HIDDEN != strFolder[0]) && (m_fMatchAll) ) // Collect from any non-hidden child folder for *all
else if ( (RLV_FOLDER_PREFIX_HIDDEN != strFolder[0]) && (fMatchAll) ) // Collect from any non-hidden child folder for *all
{
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
if ( (!RlvSettings::getEnableComposites()) || // ... if we're not checking composite folders
@ -587,6 +623,7 @@ bool RlvWearableItemCollector::onCollectFolder(const LLInventoryCategory* pFolde
#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS
{
m_Wearable.push_front(pFolder->getUUID());
m_WearActionMap.insert(std::pair<LLUUID, RlvForceWear::EWearAction>(m_idFolder, getWearActionNormal(pFolder)));
}
return (idParent == m_idFolder); // (Convenience for @getinvworn)
}
@ -608,8 +645,10 @@ bool RlvWearableItemCollector::onCollectFolder(const LLInventoryCategory* pFolde
// Checked: 2010-03-20 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
bool RlvWearableItemCollector::onCollectItem(const LLInventoryItem* pItem)
{
bool fAttach = RlvForceWear::isWearAction(m_eWearAction);
#ifdef RLV_EXTENSION_FLAG_NOSTRIP
if ( (!m_fAttach) && (!RlvForceWear::isStrippable(pItem)) ) // Don't process "nostrip" items on detach
if ( (!fAttach) && (!RlvForceWear::isStrippable(pItem)) ) // Don't process "nostrip" items on detach
return false;
#endif // RLV_EXTENSION_FLAG_NOSTRIP
@ -617,12 +656,12 @@ bool RlvWearableItemCollector::onCollectItem(const LLInventoryItem* pItem)
switch (pItem->getType())
{
case LLAssetType::AT_BODYPART:
if (!m_fAttach)
if (!fAttach)
break; // Don't process body parts on detach
case LLAssetType::AT_CLOTHING:
#ifdef RLV_EXTENSION_FLAG_NOSTRIP
fRet = ( (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent)) ||
( (m_fAttach) && (m_Folded.end() != std::find(m_Folded.begin(), m_Folded.end(), idParent)) &&
( (fAttach) && (m_Folded.end() != std::find(m_Folded.begin(), m_Folded.end(), idParent)) &&
(RlvForceWear::isStrippable(pItem)) ) );
#else
fRet = (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent));
@ -631,7 +670,7 @@ bool RlvWearableItemCollector::onCollectItem(const LLInventoryItem* pItem)
case LLAssetType::AT_OBJECT:
fRet = ( (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent)) ||
(m_Folded.end() != std::find(m_Folded.begin(), m_Folded.end(), idParent)) ) &&
( (!m_fAttach) || (RlvAttachPtLookup::hasAttachPointName(pItem)) || (RlvSettings::getEnableSharedWear()) );
( (!fAttach) || (RlvAttachPtLookup::hasAttachPointName(pItem)) || (RlvSettings::getEnableSharedWear()) );
break;
#ifdef RLV_EXTENSION_FORCEWEAR_GESTURES
case LLAssetType::AT_GESTURE:

View File

@ -183,28 +183,45 @@ protected:
class RlvWearableItemCollector : public LLInventoryCollectFunctor
{
public:
RlvWearableItemCollector(const LLUUID& idFolder, bool fAttach, bool fMatchAll)
: m_idFolder(idFolder), m_fAttach(fAttach), m_fMatchAll(fMatchAll)
RlvWearableItemCollector(const LLInventoryCategory* pFolder, RlvForceWear::EWearAction eAction, RlvForceWear::EWearFlags eFlags)
: m_idFolder(pFolder->getUUID()), m_eWearAction(eAction), m_eWearFlags(eFlags),
m_strWearAddPrefix(RlvSettings::getWearAddPrefix()), m_strWearReplacePrefix(RlvSettings::getWearReplacePrefix())
{
m_Wearable.push_back(idFolder);
m_Wearable.push_back(m_idFolder);
// Wear prefixes can't/shouldn't start with '.'
if ( (m_strWearAddPrefix.length() > 1) && (RLV_FOLDER_PREFIX_HIDDEN == m_strWearAddPrefix[0]) )
m_strWearAddPrefix.clear();
if ( (m_strWearReplacePrefix.length() > 1) && (RLV_FOLDER_PREFIX_HIDDEN == m_strWearReplacePrefix[0]) )
m_strWearReplacePrefix.clear();
// If there's a prefix on the "root" folder then it will override what we were passed in the constructor
m_eWearAction = getWearActionNormal(pFolder);
m_WearActionMap.insert(std::pair<LLUUID, RlvForceWear::EWearAction>(m_idFolder, m_eWearAction));
}
virtual ~RlvWearableItemCollector() {}
virtual bool operator()(LLInventoryCategory* pFolder, LLInventoryItem* pItem);
const LLUUID& getFoldedParent(const LLUUID& idFolder) const;
const LLUUID& getFoldedParent(const LLUUID& idFolder) const;
RlvForceWear::EWearAction getWearAction(const LLUUID& idFolder) const;
RlvForceWear::EWearAction getWearActionNormal(const LLInventoryCategory* pFolder);
RlvForceWear::EWearAction getWearActionFolded(const LLInventoryCategory* pFolder);
protected:
bool m_fAttach;
bool m_fMatchAll;
const LLUUID m_idFolder;
const LLUUID m_idFolder;
RlvForceWear::EWearAction m_eWearAction;
RlvForceWear::EWearFlags m_eWearFlags;
bool onCollectFolder(const LLInventoryCategory* pFolder);
bool onCollectItem(const LLInventoryItem* pItem);
std::list<LLUUID> m_Folded;
std::list<LLUUID> m_Wearable;
std::map<LLUUID, LLUUID> m_FoldingMap;
std::map<LLUUID, RlvForceWear::EWearAction> m_WearActionMap;
std::map<LLUUID, LLUUID> m_FoldingMap;
std::string m_strWearAddPrefix;
std::string m_strWearReplacePrefix;
};
// ============================================================================