From de81d9d8a7d2b12626c3929817a8ccdf20ba16c7 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Fri, 23 Jul 2010 18:06:49 +0300
Subject: EXT-8481 FIXED Wear button in My Outfits being enabled when worn item
 is selected.

- Fixed condition for enabling the Wear button in My Outfits.
- The button was always enabled when when COF change completes, I fixed that as well.

Reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/800/

--HG--
branch : product-engine
---
 indra/newview/lloutfitslist.cpp           | 49 ++++++++++++++++++++++++++++++-
 indra/newview/lloutfitslist.h             |  5 ++++
 indra/newview/llpaneloutfitsinventory.cpp |  2 +-
 3 files changed, 54 insertions(+), 2 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 63ffb80ff2..146684288b 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -665,7 +665,18 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)
 	}
 	if (command_name == "wear")
 	{
-		return !gAgentWearables.isCOFChangeInProgress();
+		if (gAgentWearables.isCOFChangeInProgress())
+		{
+			return false;
+		}
+
+		if (hasItemSelected())
+		{
+			return canWearSelected();
+		}
+
+		// outfit selected
+		return LLAppearanceMgr::getCanAddToCOF(mSelectedOutfitUUID);
 	}
 	if (command_name == "take_off")
 	{
@@ -677,6 +688,7 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)
 
 	if (command_name == "wear_add")
 	{
+		// *TODO: do we ever get here?
 		if (gAgentWearables.isCOFChangeInProgress())
 		{
 			return false;
@@ -984,6 +996,41 @@ bool LLOutfitsList::canTakeOffSelected()
 	return false;
 }
 
+bool LLOutfitsList::canWearSelected()
+{
+	uuid_vec_t selected_items;
+	getSelectedItemsUUIDs(selected_items);
+
+	for (uuid_vec_t::const_iterator it = selected_items.begin(); it != selected_items.end(); ++it)
+	{
+		const LLUUID& id = *it;
+
+		// Find links to the current item in COF.
+		// *TODO: share this?
+		LLInventoryModel::cat_array_t cats;
+		LLInventoryModel::item_array_t items;
+		LLLinkedItemIDMatches find_links(gInventory.getLinkedItemID(id));
+		gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(),
+										cats,
+										items,
+										LLInventoryModel::EXCLUDE_TRASH,
+										find_links);
+		if (!items.empty())
+		{
+			return false;
+		}
+
+		// Check whether the item is worn.
+		if (!get_can_item_be_worn(id))
+		{
+			return false;
+		}
+	}
+
+	// All selected items can be worn.
+	return true;
+}
+
 void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
 {
 	LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index d7cf8a8c08..206854b232 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -183,6 +183,11 @@ private:
 	 */
 	bool canTakeOffSelected();
 
+	/**
+	 * Returns true if all selected items can be worn.
+	 */
+	bool canWearSelected();
+
 	void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
 	void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
 	void onCOFChanged();
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index ca5679d5b0..16ef7998b3 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -337,7 +337,7 @@ bool LLPanelOutfitsInventory::isCOFPanelActive() const
 
 void LLPanelOutfitsInventory::setWearablesLoading(bool val)
 {
-	mListCommands->childSetEnabled("wear_btn", !val);
+	updateVerbs();
 }
 
 void LLPanelOutfitsInventory::onWearablesLoaded()
-- 
cgit v1.2.3