Vadim ProductEngine avatar Vadim ProductEngine committed d54a8e3

EXT-8564 FIXED Ability to take off wearables via "Wearing" Tab of My Outfits.

Added Take Off / Detach options to the Wearing tab context menu.

Reviewed by Sergey Litovchuk at https://codereview.productengine.com/secondlife/r/864/

Comments (0)

Files changed (2)

indra/newview/llpanelwearing.cpp

 	{
 		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 
+		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
+
 		registrar.add("Wearing.Edit", boost::bind(&edit_outfit));
+		registrar.add("Wearing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs));
+		registrar.add("Wearing.Detach", boost::bind(handleMultiple, take_off, mUUIDs));
 
-		return createFromFile("menu_wearing_tab.xml");
+		LLContextMenu* menu = createFromFile("menu_wearing_tab.xml");
+
+		updateMenuItemsVisibility(menu);
+
+		return menu;
+	}
+
+	void updateMenuItemsVisibility(LLContextMenu* menu)
+	{
+		bool bp_selected			= false;	// true if body parts selected
+		bool clothes_selected		= false;
+		bool attachments_selected	= false;
+
+		// See what types of wearables are selected.
+		for (uuid_vec_t::const_iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it)
+		{
+			LLViewerInventoryItem* item = gInventory.getItem(*it);
+
+			if (!item)
+			{
+				llwarns << "Invalid item" << llendl;
+				continue;
+			}
+
+			LLAssetType::EType type = item->getType();
+			if (type == LLAssetType::AT_CLOTHING)
+			{
+				clothes_selected = true;
+			}
+			else if (type == LLAssetType::AT_BODYPART)
+			{
+				bp_selected = true;
+			}
+			else if (type == LLAssetType::AT_OBJECT)
+			{
+				attachments_selected = true;
+			}
+		}
+
+		// Enable/disable some menu items depending on the selection.
+		bool allow_detach = !bp_selected && !clothes_selected && attachments_selected;
+		bool allow_take_off = !bp_selected && clothes_selected && !attachments_selected;
+
+		menu->setItemVisible("take_off",	allow_take_off);
+		menu->setItemVisible("detach",		allow_detach);
+		menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach);
 	}
 };
 

indra/newview/skins/default/xui/en/menu_wearing_tab.xml

  layout="topleft"
  name="Wearing">
     <menu_item_call
+     label="Take Off"
+     layout="topleft"
+     name="take_off">
+        <on_click
+         function="Wearing.TakeOff" />
+    </menu_item_call>
+    <menu_item_call
+     label="Detach"
+     layout="topleft"
+     name="detach">
+        <on_click
+         function="Wearing.Detach"
+         parameter="detach"/>
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft"
+     name="edit_outfit_separator" />
+    <menu_item_call
      label="Edit Outfit"
      layout="topleft"
      name="edit">
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.