From 43c85b0dfb4e7e7c9fdfc02954bbb0115ec344c4 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Fri, 9 Apr 2010 15:07:42 +0300
Subject: done EXT-6716 Implement Add button functionality for adding a
 wearable to Current Outfit (Edit Outfit panel)

Added temporary PLUS button on the button bar under the top list of Edit Outfit panel

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/203/

--HG--
branch : product-engine
---
 indra/newview/llappearancemgr.cpp                  | 32 +++++++++++++++
 indra/newview/llappearancemgr.h                    |  3 ++
 indra/newview/llpaneloutfitedit.cpp                | 47 +++++++++++++++-------
 indra/newview/llpaneloutfitedit.h                  |  4 +-
 .../skins/default/xui/en/panel_outfit_edit.xml     | 15 ++++++-
 5 files changed, 84 insertions(+), 17 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 40c1f89f3f..0bd95987d7 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -610,6 +610,38 @@ const LLUUID LLAppearanceMgr::getBaseOutfitUUID()
 	return outfit_cat->getUUID();
 }
 
+bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_update)
+{
+	if (item_id_to_wear.isNull()) return false;
+
+	//only the item from a user's inventory is allowed
+	if (!gInventory.isObjectDescendentOf(item_id_to_wear, gInventory.getRootFolderID())) return false;
+
+	LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
+	if (!item_to_wear) return false;
+
+	switch (item_to_wear->getType())
+	{
+	case LLAssetType::AT_CLOTHING:
+	case LLAssetType::AT_BODYPART:
+		// Don't wear anything until initial wearables are loaded, can
+		// destroy clothing items.
+		if (!gAgentWearables.areWearablesLoaded())
+		{
+			LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
+			return false;
+		}
+		addCOFItemLink(item_to_wear, do_update);
+		break;
+	case LLAssetType::AT_OBJECT:
+		rez_attachment(item_to_wear, NULL);
+		break;
+	default: return false;;
+	}
+
+	return true;
+}
+
 // Update appearance from outfit folder.
 void LLAppearanceMgr::changeOutfit(bool proceed, const LLUUID& category, bool append)
 {
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index f0374048c6..befad591bd 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -78,6 +78,9 @@ public:
 	// find the UUID of the currently worn outfit (Base Outfit)
 	const LLUUID getBaseOutfitUUID();
 
+	// Wear/attach an item (from a user's inventory) on the agent
+	bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update = true);
+
 	// Update the displayed outfit name in UI.
 	void updatePanelOutfitName(const std::string& name);
 
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 70879cedf5..2e94eabb3f 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -117,7 +117,7 @@ private:
 
 LLPanelOutfitEdit::LLPanelOutfitEdit()
 :	LLPanel(), mCurrentOutfitID(), mFetchLook(NULL), mSearchFilter(NULL),
-mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToLookBtn(NULL),
+mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToOutfitBtn(NULL),
 mRemoveFromLookBtn(NULL), mLookObserver(NULL)
 {
 	mSavedFolderState = new LLSaveFolderState();
@@ -175,8 +175,8 @@ BOOL LLPanelOutfitEdit::postBuild()
 	mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items");
 	mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);
 	mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	// mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
-	// mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+	mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
 	
 	LLComboBox* type_filter = getChild<LLComboBox>("inventory_filter");
 	type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));
@@ -200,7 +200,8 @@ BOOL LLPanelOutfitEdit::postBuild()
 	mAddToLookBtn->setEnabled(FALSE);
 	mAddToLookBtn->setVisible(FALSE); */
 	
-	childSetAction("add_item_btn", boost::bind(&LLPanelOutfitEdit::onAddToLookClicked, this), this);
+	childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this));
+	childSetEnabled("add_to_outfit_btn", false);
 
 	mUpBtn = getChild<LLButton>("up_btn");
 	mUpBtn->setEnabled(TRUE);
@@ -250,12 +251,12 @@ void LLPanelOutfitEdit::showAddWearablesPanel()
 
 void LLPanelOutfitEdit::saveOutfit(bool as_new)
 {
-	if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit())
-	{
-		// we don't need to ask for an outfit name, and updateBaseOutfit() successfully saved.
-		// If updateBaseOutfit fails, ask for an outfit name anyways
-		return;
-	}
+	if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit())
+	{
+		// we don't need to ask for an outfit name, and updateBaseOutfit() successfully saved.
+		// If updateBaseOutfit fails, ask for an outfit name anyways
+		return;
+	}
 
 	LLPanelOutfitsInventory* panel_outfits_inventory = LLPanelOutfitsInventory::findInstance();
 	if (panel_outfits_inventory)
@@ -335,15 +336,18 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
 	mInventoryItemsPanel->setFilterSubString(mSearchString);
 }
 
-void LLPanelOutfitEdit::onAddToLookClicked(void)
+void LLPanelOutfitEdit::onAddToOutfitClicked(void)
 {
 	LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
 	if (!curr_item) return;
 
 	LLFolderViewEventListener* listenerp  = curr_item->getListener();
-	link_inventory_item(gAgent.getID(), listenerp->getUUID(), mCurrentOutfitID, listenerp->getName(),
-						LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
-	updateLookInfo();
+	if (!listenerp) return;
+
+	if (LLAppearanceMgr::getInstance()->wearItemOnAvatar(listenerp->getUUID()))
+	{
+		updateLookInfo();
+	}
 }
 
 
@@ -444,6 +448,21 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView
 	{
 		return;
 	}
+
+	LLViewerInventoryItem* item = current_item->getInventoryItem();
+	if (!item) return;
+
+	switch (item->getType())
+	{
+	case LLAssetType::AT_CLOTHING:
+	case LLAssetType::AT_BODYPART:
+	case LLAssetType::AT_OBJECT:
+		childSetEnabled("add_to_outfit_btn", true);
+		break;
+	default:
+		childSetEnabled("add_to_outfit_btn", false);
+		break;
+	}
 	
 	/* Removing add to look inline button (not part of mvp for viewer 2)
 	LLRect btn_rect(current_item->getLocalRect().mRight - 50,
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index d09795156e..1a8d7d2bef 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -93,7 +93,7 @@ public:
 	void onTypeFilterChanged(LLUICtrl* ctrl);
 	void onSearchEdit(const std::string& string);
 	void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
-	void onAddToLookClicked(void);
+	void onAddToOutfitClicked(void);
 	void onLookItemSelectionChange(void);
 	void onRemoveFromLookClicked(void);
 	void onEditWearableClicked(void);
@@ -116,7 +116,7 @@ private:
 	LLFilterEditor*		mSearchFilter;
 	LLSaveFolderState*	mSavedFolderState;
 	std::string			mSearchString;
-	LLButton*			mAddToLookBtn;
+	LLButton*			mAddToOutfitBtn;
 	LLButton*			mRemoveFromLookBtn;
 	LLButton*			mUpBtn;
 	LLButton*			mEditWearableBtn;
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 3fa3d6d039..a5e6506463 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -257,7 +257,7 @@
              text_pad_left="25" />
 
             <inventory_panel
-             allow_multi_select="true"
+             allow_multi_select="false"
              border="false"
              follows="left|top|right|bottom"
              height="176"
@@ -317,6 +317,19 @@
                  name="list_view_btn"
                  top="1"
                  width="31" />
+                <button
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay="AddItem_Off"
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 label=""
+                 layout="topleft"
+                 left_pad="1"
+                 name="add_to_outfit_btn"
+                 top="1"
+                 width="31" />
             </panel>
         </layout_panel>
     </layout_stack>
-- 
cgit v1.2.3