From 7619bf972b37f45dfc615816ebe38b7807fae17e Mon Sep 17 00:00:00 2001
From: Kitty Barnett <none@none>
Date: Sat, 4 Sep 2010 02:22:38 +0200
Subject: [PATCH] - fixed : "Wear Replace" shouldn't be (silently) changed to
 "Wear Add" for clothing wearables - fixed : "Wear Add" for attachments isn't
 properly supported in LLAppearanceMgr::wearItemOnAvatar() - fixed : "wearable
 list" context menu options aren't visually disabled to reflect
 attachment/wearable restrictions/locks

--HG--
branch : RLVa
---
 indra/newview/llappearancemgr.cpp     |  9 +++--
 indra/newview/llwearableitemslist.cpp | 49 +++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 9caf31d23b..3d083db859 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1009,7 +1009,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 		return false;
 	}
 
-// [RLVa:KB] - Checked: 2010-06-08 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
+// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a) | Modified: RLVa-1.2.1a
 	if ( (rlv_handler_t::isEnabled()) && 
 		 ((gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) || (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY))) )
 	{
@@ -1019,15 +1019,14 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 			case LLAssetType::AT_CLOTHING:
 				{
 					ERlvWearMask eWear = gRlvWearableLocks.canWear(item_to_wear);
-					if (RLV_WEAR_LOCKED == eWear)
+					if ( (RLV_WEAR_LOCKED == eWear) || ((replace) && ((RLV_WEAR_REPLACE & eWear) == 0)) )
 						return false;
-					replace &= ((RLV_WEAR_REPLACE & eWear) == RLV_WEAR_REPLACE);
 				}
 				break;
 			case LLAssetType::AT_OBJECT:
 				{
-					// TODO-RLVa: [SL-2.1.0] Rewrite for MULTI_ATTACHMENTS
-					if (!gRlvAttachmentLocks.canAttach(item_to_wear))
+					ERlvWearMask eWear = gRlvAttachmentLocks.canAttach(item_to_wear);
+					if ( (RLV_WEAR_LOCKED == eWear) || ((replace) && ((RLV_WEAR_REPLACE & eWear) == 0)) )
 						return false;
 				}
 				break;
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index a49dc1b59d..793771c5ad 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -37,6 +37,9 @@
 #include "lltransutil.h"
 #include "llviewerattachmenu.h"
 #include "llvoavatarself.h"
+// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a)
+#include "rlvhandler.h"
+// [/RLVa:KB]
 
 class LLFindOutfitItems : public LLInventoryCollectFunctor
 {
@@ -833,6 +836,13 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 
 	bool can_be_worn = true;
 
+// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
+	// We'll enable a menu option if at least one item in the selection is wearable/removable
+	bool rlvCanWearReplace = !rlv_handler_t::isEnabled();
+	bool rlvCanWearAdd = !rlv_handler_t::isEnabled();
+	bool rlvCanRemove = !rlv_handler_t::isEnabled();
+// [/RLVa:KB]
+
 	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
 	{
 		LLUUID id = *it;
@@ -873,6 +883,29 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 		{
 			can_be_worn = get_can_item_be_worn(item->getLinkedUUID());
 		}
+
+// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
+		if (rlv_handler_t::isEnabled())
+		{
+			ERlvWearMask eWearMask = RLV_WEAR_LOCKED;
+			switch (item->getType())
+			{
+				case LLAssetType::AT_BODYPART:
+				case LLAssetType::AT_CLOTHING:
+					eWearMask = gRlvWearableLocks.canWear(item);
+					rlvCanRemove |= (is_worn) ? gRlvWearableLocks.canRemove(item) : false;
+					break;
+				case LLAssetType::AT_OBJECT:
+					eWearMask = gRlvAttachmentLocks.canAttach(item);
+					rlvCanRemove |= (is_worn) ? gRlvAttachmentLocks.canDetach(item) : false;
+					break;
+				default:
+					break;
+			}
+			rlvCanWearReplace |= ((eWearMask & RLV_WEAR_REPLACE) == RLV_WEAR_REPLACE);
+			rlvCanWearAdd |= ((eWearMask & RLV_WEAR_ADD) == RLV_WEAR_ADD);
+		}
+// [/RLVa:KB]
 	} // for
 
 	bool standalone = mParent ? mParent->isStandalone() : false;
@@ -880,10 +913,15 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 
 	// *TODO: eliminate multiple traversals over the menu items
 	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0 && can_be_worn);
-	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0);
+//	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0);
 	setMenuItemVisible(menu, "wear_add",			wear_add_visible);
-	setMenuItemEnabled(menu, "wear_add",			canAddWearables(ids));
+//	setMenuItemEnabled(menu, "wear_add",			canAddWearables(ids));
 	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0 && can_be_worn);
+// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
+	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0 && rlvCanWearReplace);
+	setMenuItemEnabled(menu, "wear_add",			canAddWearables(ids) && rlvCanWearAdd);
+	setMenuItemEnabled(menu, "wear_replace",		rlvCanWearReplace);
+// [/RLVa:KB]
 	//visible only when one item selected and this item is worn
 	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
 	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1);
@@ -893,7 +931,12 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 	setMenuItemVisible(menu, "take_off",			mask == MASK_CLOTHING && n_worn == n_items);
 	setMenuItemVisible(menu, "detach",				mask == MASK_ATTACHMENT && n_worn == n_items);
 	setMenuItemVisible(menu, "take_off_or_detach",	mask == (MASK_ATTACHMENT|MASK_CLOTHING));
-	setMenuItemEnabled(menu, "take_off_or_detach",	n_worn == n_items);
+//	setMenuItemEnabled(menu, "take_off_or_detach",	n_worn == n_items);
+// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
+	setMenuItemEnabled(menu, "take_off",			rlvCanRemove);
+	setMenuItemEnabled(menu, "detach",				rlvCanRemove);
+	setMenuItemEnabled(menu, "take_off_or_detach",	(n_worn == n_items) && (rlvCanRemove));
+// [/RLVa:KB]
 	setMenuItemVisible(menu, "object_profile",		!standalone);
 	setMenuItemEnabled(menu, "object_profile",		n_items == 1);
 	setMenuItemVisible(menu, "--no options--", 		FALSE);
-- 
GitLab