From 18154abe0bcfcd4885ca92941abf795764d390db Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 25 Sep 2010 19:03:13 +0200 Subject: [PATCH 1/3] - internal : added "Wear Add"/"Wear Replace" RLV debug settings to the RlvSettings class --HG-- branch : RLVa --- indra/newview/app_settings/settings.xml | 24 ++++++++++++- indra/newview/rlvcommon.cpp | 18 +++++----- indra/newview/rlvcommon.h | 46 ++++++++++++++----------- indra/newview/rlvdefines.h | 2 ++ 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a436e6ee78..9302d4da2d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -37,7 +37,7 @@ RestrainedLoveForbidGiveToRLV Comment - When FALSE, allows to give sub-folders to the #RLV RestrainedLove folder. + When TRUE, forbids to give sub-folders to the #RLV RestrainedLove folder. Persist 1 Type @@ -45,6 +45,28 @@ Value 1 + RestrainedLoveReplaceWhenFolderBeginsWith + + Comment + If a folder name begins with this string, its attach behavior will always be "replace", never "stack". Default is blank (disabled). + Persist + 1 + Type + String + Value + + + RestrainedLoveStackWhenFolderBeginsWith + + Comment + If a folder name begins with this string, its attach behavior will always be "stack", never "replace". Default is "+". + Persist + 1 + Type + String + Value + + + RLVaDebugHideUnsetDuplicate Comment diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index 76039f992b..70b023b859 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -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(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(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(RLV_SETTING_NOSETENV, false); - fShowNameTags = rlvGetSettingBOOL(RLV_SETTING_SHOWNAMETAGS, FALSE); + fShowNameTags = rlvGetSetting(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(); diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index 3c1936608e..59f12dbee2 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -34,51 +34,55 @@ class RlvCommand; // RlvSettings // -inline BOOL rlvGetSettingBOOL(const std::string& strSetting, BOOL fDefault) +template 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(strSetting) : defaultValue; } -inline BOOL rlvGetPerUserSettingsBOOL(const std::string& strSetting, BOOL fDefault) + +template 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(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(RLV_SETTING_DEBUG, false); } + static bool getForbidGiveToRLV() { return rlvGetSetting(RLV_SETTING_FORBIDGIVETORLV, true); } + static bool getNoSetEnv() { return fNoSetEnv; } - static BOOL getDebugHideUnsetDup() { return rlvGetSettingBOOL(RLV_SETTING_DEBUGHIDEUNSETDUP, FALSE); } + static std::string getWearAddPrefix() { return rlvGetSetting(RLV_SETTING_WEARADDPREFIX, LLStringUtil::null); } + static std::string getWearReplacePrefix() { return rlvGetSetting(RLV_SETTING_WEARREPLACEPREFIX, LLStringUtil::null); } + + static bool getDebugHideUnsetDup() { return rlvGetSetting(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(RLV_SETTING_ENABLESHAREDWEAR, false); } + static bool getHideLockedLayers() { return rlvGetSetting(RLV_SETTING_HIDELOCKEDLAYER, false); } + static bool getHideLockedAttach() { return rlvGetSetting(RLV_SETTING_HIDELOCKEDATTACH, false); } + static bool getHideLockedInventory() { return rlvGetSetting(RLV_SETTING_HIDELOCKEDINVENTORY, false); } + static bool getSharedInvAutoRename() { return rlvGetSetting(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(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; }; // ============================================================================ diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 707339fec8..f1f64e1c40 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -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" From 6fb1f9c9f5419139da53d3d980326299203255c7 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 25 Sep 2010 19:10:38 +0200 Subject: [PATCH 2/3] - internal : changed RlvWearableItemCollector to use the EWearAction and EWearFlags enumeration --HG-- branch : RLVa --- indra/newview/rlvhandler.cpp | 2 +- indra/newview/rlvhelper.cpp | 2 +- indra/newview/rlvinventory.cpp | 17 +++++++++++------ indra/newview/rlvinventory.h | 10 +++++----- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index f939f81f24..4b4024eed9 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1767,7 +1767,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->getUUID(), RlvForceWear::ACTION_WEAR_REPLACE, RlvForceWear::FLAG_MATCHALL); gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, f); rlv_wear_info wi = {0}; diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 92b565d355..245b2f4fce 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -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->getUUID(), eAction, eFlags); gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, f); for (S32 idxItem = 0, cntItem = items.count(); idxItem < cntItem; idxItem++) diff --git a/indra/newview/rlvinventory.cpp b/indra/newview/rlvinventory.cpp index 4f4c1667a0..d90e48c207 100644 --- a/indra/newview/rlvinventory.cpp +++ b/indra/newview/rlvinventory.cpp @@ -569,15 +569,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(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 @@ -608,8 +611,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 +622,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 +636,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: diff --git a/indra/newview/rlvinventory.h b/indra/newview/rlvinventory.h index 22e451bcfb..6d69d92e7a 100644 --- a/indra/newview/rlvinventory.h +++ b/indra/newview/rlvinventory.h @@ -183,8 +183,8 @@ 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 LLUUID& idFolder, RlvForceWear::EWearAction eAction, RlvForceWear::EWearFlags eFlags) + : m_idFolder(idFolder), m_eWearAction(eAction), m_eWearFlags(eFlags) { m_Wearable.push_back(idFolder); } @@ -194,9 +194,9 @@ public: const LLUUID& getFoldedParent(const LLUUID& idFolder) const; 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); From b73c0767b1ac9399c0c608633938be0a3e92d97c Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 25 Sep 2010 20:06:13 +0200 Subject: [PATCH 3/3] - added : "RestrainedLoveStackWhenFolderBeginsWith" setting as a per-folder override to make @attach:=force "Wear Add" rather than "Wear Replace" -> see RLV-2.1 specification - added : "RestrainedLoveReplaceWhenFolderBeginsWith" setting as a per-folder override to make @attachover:=force "Wear Replace" rather than "Wear Add" -> not part of the official specification --HG-- branch : RLVa --- indra/newview/rlvhandler.cpp | 2 +- indra/newview/rlvhelper.cpp | 6 +++--- indra/newview/rlvinventory.cpp | 34 ++++++++++++++++++++++++++++++++++ indra/newview/rlvinventory.h | 27 ++++++++++++++++++++++----- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 4b4024eed9..ba6fe30bee 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1767,7 +1767,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(), RlvForceWear::ACTION_WEAR_REPLACE, RlvForceWear::FLAG_MATCHALL); + RlvWearableItemCollector f(pFolder, RlvForceWear::ACTION_WEAR_REPLACE, RlvForceWear::FLAG_MATCHALL); gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, f); rlv_wear_info wi = {0}; diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 245b2f4fce..be855e3b35 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -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(), eAction, eFlags); + 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())); } } } diff --git a/indra/newview/rlvinventory.cpp b/indra/newview/rlvinventory.cpp index d90e48c207..2b2aaee9ad 100644 --- a/indra/newview/rlvinventory.cpp +++ b/indra/newview/rlvinventory.cpp @@ -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::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) { @@ -590,6 +623,7 @@ bool RlvWearableItemCollector::onCollectFolder(const LLInventoryCategory* pFolde #endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS { m_Wearable.push_front(pFolder->getUUID()); + m_WearActionMap.insert(std::pair(m_idFolder, getWearActionNormal(pFolder))); } return (idParent == m_idFolder); // (Convenience for @getinvworn) } diff --git a/indra/newview/rlvinventory.h b/indra/newview/rlvinventory.h index 6d69d92e7a..767e0f7d09 100644 --- a/indra/newview/rlvinventory.h +++ b/indra/newview/rlvinventory.h @@ -183,16 +183,30 @@ protected: class RlvWearableItemCollector : public LLInventoryCollectFunctor { public: - RlvWearableItemCollector(const LLUUID& idFolder, RlvForceWear::EWearAction eAction, RlvForceWear::EWearFlags eFlags) - : m_idFolder(idFolder), m_eWearAction(eAction), m_eWearFlags(eFlags) + 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(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: const LLUUID m_idFolder; RlvForceWear::EWearAction m_eWearAction; @@ -203,8 +217,11 @@ protected: std::list m_Folded; std::list m_Wearable; + std::map m_FoldingMap; + std::map m_WearActionMap; - std::map m_FoldingMap; + std::string m_strWearAddPrefix; + std::string m_strWearReplacePrefix; }; // ============================================================================