From 8d18056e8296472d58a820fd77a6a66100e70661 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 25 Jun 2010 16:04:45 -0700
Subject: Fix for EXT-8025 ('+' button on My Appearance > Edit Outfit panel
 does nothing)

Button now gets disabled in the early-exit case in LLPanelOutfitEdit::onInventorySelectionChange().

onInventorySelectionChange() also uses the new predicate get_can_item_be_worn(), which both checks whether the item is already being worn and whether it's of a type that could be worn.

Reviewed by Nyx at http://codereview.lindenlab.com/2451030 .
---
 indra/newview/llinventoryfunctions.cpp | 41 ++++++++++++++++++++++++++++++++++
 indra/newview/llinventoryfunctions.h   |  3 +++
 indra/newview/llpaneloutfitedit.cpp    |  7 ++++--
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 37088064c6..7e9a2cb716 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -245,6 +245,47 @@ BOOL get_is_item_worn(const LLUUID& id)
 	return FALSE;
 }
 
+BOOL get_can_item_be_worn(const LLUUID& id)
+{
+	const LLViewerInventoryItem* item = gInventory.getItem(id);
+	if (!item)
+		return FALSE;
+	
+	switch(item->getType())
+	{
+		case LLAssetType::AT_OBJECT:
+		{
+			if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getLinkedUUID()))
+			{
+				// Already being worn
+				return FALSE;
+			}
+			else
+			{
+				// Not being worn yet.
+				return TRUE;
+			}
+			break;
+		}
+		case LLAssetType::AT_BODYPART:
+		case LLAssetType::AT_CLOTHING:
+			if(gAgentWearables.isWearingItem(item->getLinkedUUID()))
+			{
+				// Already being worn
+				return FALSE;
+			}
+			else
+			{
+				// Not being worn yet.
+				return TRUE;
+			}
+			break;
+		default:
+			break;
+	}
+	return FALSE;
+}
+
 BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)
 {
 	if (!model)
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 6619a50d28..1c3f82c531 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -46,6 +46,9 @@
 // Is this item or its baseitem is worn, attached, etc...
 BOOL get_is_item_worn(const LLUUID& id);
 
+// Could this item be worn (correct type + not already being worn)
+BOOL get_can_item_be_worn(const LLUUID& id);
+
 BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id);
 
 BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id);
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 1544717873..ffd879dfd7 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -661,10 +661,13 @@ void LLPanelOutfitEdit::onInventorySelectionChange()
 	getSelectedItemsUUID(selected_items);
 	if (selected_items.empty())
 	{
+		mPlusBtn->setEnabled(false);
 		return;
 	}
-	uuid_vec_t::iterator worn_item = std::find_if(selected_items.begin(), selected_items.end(), boost::bind(&get_is_item_worn, _1));
-	bool can_add = ( worn_item == selected_items.end() );
+
+	// If any of the selected items are not wearable (due to already being worn OR being of the wrong type), disable the add button.
+	uuid_vec_t::iterator unwearable_item = std::find_if(selected_items.begin(), selected_items.end(), !boost::bind(& get_can_item_be_worn, _1));
+	bool can_add = ( unwearable_item == selected_items.end() );
 
 	mPlusBtn->setEnabled(can_add);
 
-- 
cgit v1.2.3