diff options
| author | Sergei Litovchuk <slitovchuk@productengine.com> | 2010-08-16 23:23:48 +0300 | 
|---|---|---|
| committer | Sergei Litovchuk <slitovchuk@productengine.com> | 2010-08-16 23:23:48 +0300 | 
| commit | 6be8313c9777a48ccf60ff8006c0223bed79de69 (patch) | |
| tree | 19a33540ee3b3fca02265e66f117a974962cb44f /indra | |
| parent | 462b629be51be9d9d13e7731403930a825e9d20e (diff) | |
EXT-8636 FIXED updating wearables (worn) prefix in 'My Outfits' list.
- Fixed LLOutfitsList COF changes handler to update worn status of items removed from COF. Now they are updated based on the differences in original items' ids in COF.
- Fixed 'My Outfits' items worn status check to update depending on whether the item is linked in COF or not.
This is a kind of workaround to fix updating attachments' worn status because LLAppearanceMgr::updateAppearanceFromCOF is triggered erlier than new attachment links are fetched. When dumpItemArray(obj_items,"asset_dump: obj_item") is called from LLAppearanceMgr::updateAppearanceFromCOF, all attachment links have empty asset ids.
Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/859/.
--HG--
branch : product-engine
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/lloutfitslist.cpp | 48 | ||||
| -rw-r--r-- | indra/newview/lloutfitslist.h | 4 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.h | 3 | 
4 files changed, 44 insertions, 21 deletions
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 2b6c80bac8..a471158c3d 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -1055,25 +1055,37 @@ void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)  void LLOutfitsList::onCOFChanged()  { -	LLInventoryModel::changed_items_t changed_linked_items; +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; -	const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs(); -	for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items.begin(); -		 iter != changed_items.end(); -		 ++iter) +	// Collect current COF items +	gInventory.collectDescendents( +		LLAppearanceMgr::instance().getCOF(), +		cat_array, +		item_array, +		LLInventoryModel::EXCLUDE_TRASH); + +	uuid_vec_t vnew; +	uuid_vec_t vadded; +	uuid_vec_t vremoved; + +	// From gInventory we get the UUIDs of links that are currently in COF. +	// These links UUIDs are not the same UUIDs that we have in each wearable items list. +	// So we collect base items' UUIDs to find them or links that point to them in wearable +	// items lists and update their worn state there. +	for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); +		iter != item_array.end(); +		++iter)  	{ -		LLViewerInventoryItem* item = gInventory.getItem(*iter); -		if (item) -		{ -			// From gInventory we get the UUIDs of new links added to COF -			// or removed from COF. These links UUIDs are not the same UUIDs -			// that we have in each wearable items list. So we collect base items -			// UUIDs to find all items or links that point to same base items in wearable -			// items lists and update their worn state there. -			changed_linked_items.insert(item->getLinkedUUID()); -		} +		vnew.push_back((*iter)->getLinkedUUID());  	} +	// We need to update only items that were added or removed from COF. +	LLCommonUtils::computeDifference(vnew, mCOFLinkedItems, vadded, vremoved); + +	// Store the ids of items currently linked from COF. +	mCOFLinkedItems = vnew; +  	for (outfits_map_t::iterator iter = mOutfitsMap.begin();  			iter != mOutfitsMap.end();  			++iter) @@ -1084,9 +1096,13 @@ void LLOutfitsList::onCOFChanged()  		LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());  		if (!list) continue; +		// Append removed ids to added ids because we should update all of them. +		vadded.reserve(vadded.size() + vremoved.size()); +		vadded.insert(vadded.end(), vremoved.begin(), vremoved.end()); +  		// Every list updates the labels of changed items  or  		// the links that point to these items. -		list->updateChangedItems(changed_linked_items); +		list->updateChangedItems(vadded);  	}  } diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 206854b232..4613bdfeb9 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -214,6 +214,10 @@ private:  	typedef outfits_map_t::value_type					outfits_map_value_t;  	outfits_map_t					mOutfitsMap; +	// IDs of original items which are worn and linked in COF. +	// Used to monitor COF changes for updating items worn state. See EXT-8636. +	uuid_vec_t						mCOFLinkedItems; +  	LLOutfitListGearMenu*			mGearMenu;  	LLListContextMenu*				mOutfitMenu; diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 5e23965f62..bff4b9bcbd 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -124,7 +124,11 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,  {  	std::string search_label = name; -	if (mWornIndicationEnabled && get_is_item_worn(mInventoryItemUUID)) +	// Updating item's worn status depending on whether it is linked in COF or not. +	// We don't use get_is_item_worn() here because this update is triggered by +	// an inventory observer upon link in COF beind added or removed so actual +	// worn status of a linked item may still remain unchanged. +	if (mWornIndicationEnabled && LLAppearanceMgr::instance().isLinkInCOF(mInventoryItemUUID))  	{  		search_label += LLTrans::getString("worn");  		item_state = IS_WORN; @@ -659,7 +663,7 @@ void LLWearableItemsList::updateList(const LLUUID& category_id)  	refreshList(item_array);  } -void LLWearableItemsList::updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids) +void LLWearableItemsList::updateChangedItems(const uuid_vec_t& changed_items_uuids)  {  	// nothing to update  	if (changed_items_uuids.empty()) return; @@ -681,7 +685,7 @@ void LLWearableItemsList::updateChangedItems(const LLInventoryModel::changed_ite  		LLUUID linked_uuid = inv_item->getLinkedUUID(); -		for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items_uuids.begin(); +		for (uuid_vec_t::const_iterator iter = changed_items_uuids.begin();  				iter != changed_items_uuids.end();  				++iter)  		{ diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 237ba1af43..ac4eac4764 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -39,7 +39,6 @@  // newview  #include "llinventoryitemslist.h"  #include "llinventorylistitem.h" -#include "llinventorymodel.h"  #include "lllistcontextmenu.h"  #include "llwearabletype.h" @@ -441,7 +440,7 @@ public:  	 * Update items that match UUIDs from changed_items_uuids  	 * or links that point at such items.  	 */ -	void updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids); +	void updateChangedItems(const uuid_vec_t& changed_items_uuids);  	bool isStandalone() const { return mIsStandalone; }  | 
