diff options
| author | Sergei Litovchuk <slitovchuk@productengine.com> | 2010-06-02 16:16:26 +0300 | 
|---|---|---|
| committer | Sergei Litovchuk <slitovchuk@productengine.com> | 2010-06-02 16:16:26 +0300 | 
| commit | b678d2888c5da04cf4d778b29a60a78c8c1aff5f (patch) | |
| tree | 2ff6930119837f31141f60e288b653c3f4328e60 | |
| parent | 508923ac0025a590996ade8503acaad850f26376 (diff) | |
EXT-7239 FIXED Added wearing double-clicked item or uutfit.
- Added outfit list item with double click support.
- Added wearing/detaching single item on double click.
- Added replacing current outfit with an outfit from double clicked accordion tab.
Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/493/.
--HG--
branch : product-engine
| -rw-r--r-- | indra/newview/lloutfitslist.cpp | 52 | ||||
| -rw-r--r-- | indra/newview/lloutfitslist.h | 2 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.cpp | 62 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.h | 25 | 
4 files changed, 125 insertions, 16 deletions
| diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 8f189a1e9f..66002d4044 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -49,6 +49,8 @@  #include "llvoavatarself.h"  #include "llwearableitemslist.h" +static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y); +  //////////////////////////////////////////////////////////////////////////  class OutfitContextMenu : public LLListContextMenu @@ -176,8 +178,6 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode();  		LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL); -		tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this, -			_1, _2, _3, cat_id));  		tab->setName(name);  		tab->setTitle(name); @@ -198,6 +198,12 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		// Map the new tab with outfit category UUID.  		mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab)); +		tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this, +			_1, _2, _3, cat_id)); + +		tab->setDoubleClickCallback(boost::bind(&LLOutfitsList::onAccordionTabDoubleClick, this, +			_1, _2, _3, cat_id)); +  		// Setting tab focus callback to monitor currently selected outfit.  		tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id)); @@ -510,22 +516,30 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)  void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)  {  	LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl); -	if(mOutfitMenu && tab && tab->getHeaderVisible() && cat_id.notNull()) +	if(mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull())  	{ -		S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight(); -		if(y >= header_bottom) +		// Focus tab header to trigger tab selection change. +		LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header"); +		if (header)  		{ -			// Focus tab header to trigger tab selection change. -			LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header"); -			if (header) -			{ -				header->setFocus(TRUE); -			} - -			uuid_vec_t selected_uuids; -			selected_uuids.push_back(cat_id); -			mOutfitMenu->show(ctrl, selected_uuids, x, y); +			header->setFocus(TRUE);  		} + +		uuid_vec_t selected_uuids; +		selected_uuids.push_back(cat_id); +		mOutfitMenu->show(ctrl, selected_uuids, x, y); +	} +} + +void LLOutfitsList::onAccordionTabDoubleClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id) +{ +	LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl); +	if(is_tab_header_clicked(tab, y) && cat_id.notNull()) +	{ +		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); +		if (!cat) return; + +		LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, FALSE );  	}  } @@ -551,4 +565,12 @@ void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)  	LLWearableItemsList::ContextMenu::instance().show(list, selected_uuids, x, y);  } + +bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y) +{ +	if(!tab || !tab->getHeaderVisible()) return false; + +	S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight(); +	return y >= header_bottom; +}  // EOF diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 1da7360c2e..d3da850e19 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -107,7 +107,7 @@ private:  	void applyFilter(const std::string& new_filter_substring);  	void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id); - +	void onAccordionTabDoubleClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);  	void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);  	LLInventoryCategoriesObserver* 	mCategoriesObserver; diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 161cd40cfc..cfb48a22bb 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -94,6 +94,47 @@ LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item)  //////////////////////////////////////////////////////////////////////////  // static +LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item) +{ +	LLPanelWearableOutfitItem* list_item = NULL; +	if (item) +	{ +		list_item = new LLPanelWearableOutfitItem(item); +		list_item->init(); +	} +	return list_item; +} + +BOOL LLPanelWearableOutfitItem::handleDoubleClick(S32 x, S32 y, MASK mask) +{ +	LLViewerInventoryItem* item = getItem(); +	if (item) +	{ +		LLUUID id = item->getUUID(); + +		if (get_is_item_worn(id)) +		{ +			LLAppearanceMgr::getInstance()->removeItemFromAvatar(id); +		} +		else +		{ +			LLAppearanceMgr::getInstance()->wearItemOnAvatar(id, true, false); +		} +	} + +	return LLUICtrl::handleDoubleClick(x, y, mask); +} + +LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item) +: LLPanelInventoryListItemBase(item) +{ +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +// static  LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item)  {  	LLPanelClothingListItem* list_item = NULL; @@ -402,6 +443,27 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)  LLWearableItemsList::~LLWearableItemsList()  {} +// virtual +void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/) +{ +	if (!item) +	{ +		llwarns << "No inventory item. Couldn't create flat list item." << llendl; +		llassert(item != NULL); +	} + +	LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item); +	if (!list_item) +		return; + +	bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange); +	if (!is_item_added) +	{ +		llwarns << "Couldn't add flat list item." << llendl; +		llassert(is_item_added); +	} +} +  void LLWearableItemsList::updateList(const LLUUID& category_id)  {  	LLInventoryModel::cat_array_t cat_array; diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index de024ed220..995a8976f3 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -70,6 +70,29 @@ protected:  	LLPanelWearableListItem(LLViewerInventoryItem* item);  }; +/** + * @class LLPanelWearableOutfitItem + * + * Outfit item for "My Outfits" list. + * Extends LLPanelInventoryListItemBase with handling + * double click to wear the item. + */ +class LLPanelWearableOutfitItem : public LLPanelInventoryListItemBase +{ +	LOG_CLASS(LLPanelWearableOutfitItem); +public: +	static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item); + +	/** +	* Puts item on if it is not worn by agent +	* otherwise takes it off on double click. +	*/ +	/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + +protected: + +	LLPanelWearableOutfitItem(LLViewerInventoryItem* item); +};  class LLPanelDeletableWearableListItem : public LLPanelWearableListItem  { @@ -309,6 +332,8 @@ public:  	virtual ~LLWearableItemsList(); +	/*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true); +  	void updateList(const LLUUID& category_id);  protected: | 
