From 092d49cb3a0ca090ffd792661c9cf335fec4c5c6 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Tue, 27 Jul 2010 15:59:11 +0300
Subject: EXT-7015 FIXED Avoided wearing item moved to trash. Details: Disabled
 wear button and hidden related context menu entries if base object of
 inventory link is in trash.

reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/806/

--HG--
branch : product-engine
---
 indra/newview/lloutfitslist.cpp       | 32 +++++++++++++++++++++++++++++++-
 indra/newview/lloutfitslist.h         |  5 +++++
 indra/newview/llwearableitemslist.cpp | 15 ++++++++++++---
 3 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 63ffb80ff2..ccde5be900 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -665,7 +665,14 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)
 	}
 	if (command_name == "wear")
 	{
-		return !gAgentWearables.isCOFChangeInProgress();
+		if (gAgentWearables.isCOFChangeInProgress())
+		{
+			return false;
+		}
+		uuid_vec_t ids;
+		getSelectedItemsUUIDs(ids);
+
+		return !ids.empty() && !isSelectedInTrash();
 	}
 	if (command_name == "take_off")
 	{
@@ -711,6 +718,29 @@ void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
 	}
 }
 
+bool LLOutfitsList::isSelectedInTrash()
+{
+	bool res = false;
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(
+			LLFolderType::FT_TRASH);
+
+	uuid_vec_t selected_uuids;
+	getSelectedItemsUUIDs(selected_uuids);
+
+	for (uuid_vec_t::const_iterator it = selected_uuids.begin(); it != selected_uuids.end(); it++)
+	{
+		const LLInventoryItem* item = gInventory.getItem(*it);
+		if (item != NULL && gInventory.isObjectDescendentOf(
+				item->getLinkedUUID(), trash_id))
+		{
+			res = true;
+			break;
+		}
+	}
+
+	return res;
+}
+
 boost::signals2::connection LLOutfitsList::setSelectionChangeCallback(selection_change_callback_t cb)
 {
 	return mSelectionChangeSignal.connect(cb);
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index d7cf8a8c08..dbb35c4d5f 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -105,6 +105,11 @@ public:
 
 	void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
 
+	/**
+	 * Returns true in case any of selected item is in trash.
+	 */
+	bool isSelectedInTrash();
+
 	boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb);
 
 	// Collects selected items from all selected lists and wears them(if possible- adds, else replaces)
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index b614860b74..1ce89b13ac 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -767,6 +767,9 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 	U32 n_links = 0;				// number of links among the selected items
 	U32 n_editable = 0;				// number of editable items among the selected ones
 
+	bool item_in_trash = false;
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+
 	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
 	{
 		LLUUID id = *it;
@@ -802,16 +805,22 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
 		{
 			++n_already_worn;
 		}
+
+		// if any in trash
+		if (!item_in_trash)
+		{
+			item_in_trash = gInventory.isObjectDescendentOf(item->getLinkedUUID(), trash_id);
+		}
 	} // for
 
 	bool standalone = mParent ? mParent->isStandalone() : false;
 
 	// *TODO: eliminate multiple traversals over the menu items
-	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0);
+	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0 && !item_in_trash);
 	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0);
-	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0 && n_already_worn != 0);
+	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0 && n_already_worn != 0 && !item_in_trash);
 	setMenuItemEnabled(menu, "wear_add",			n_items == 1 && canAddWearable(ids.front()) && n_already_worn != 0);
-	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0);
+	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0 && !item_in_trash);
 	//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);
-- 
cgit v1.2.3