diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llappearancemgr.cpp | 59 | 
1 files changed, 38 insertions, 21 deletions
| diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6aefecc787..5586b3cd4d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1059,6 +1059,10 @@ bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* it  void LLAppearanceMgr::updateAppearanceFromCOF()  { +	//checking integrity of the COF in terms of ordering of wearables,  +	//checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state) +	updateClothingOrderingInfo(); +  	// update dirty flag to see if the state of the COF matches  	// the saved outfit stored as a folder link  	llinfos << "starting" << llendl; @@ -1067,8 +1071,6 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  	dumpCat(getCOF(),"COF, start"); -	updateClothingOrderingInfo(); -  	bool follow_folder_links = true;  	LLUUID current_outfit_id = getCOF(); @@ -1523,6 +1525,17 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update)  	}  } +bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) +{ +	if (!item1 || !item2) +	{ +		llwarning("item1, item2 cannot be null, something is very wrong", 0); +		return true; +	} + +	return item1->getLinkedUUID() < item2->getLinkedUUID(); +} +  void LLAppearanceMgr::updateIsDirty()  {  	LLUUID cof = getCOF(); @@ -1562,33 +1575,37 @@ void LLAppearanceMgr::updateIsDirty()  			// Current outfit folder should have one more item than the outfit folder.  			// this one item is the link back to the outfit folder itself.  			mOutfitIsDirty = true; +			return;  		} -		else -		{ -			typedef std::set<LLUUID> item_set_t; -			item_set_t cof_set; -			item_set_t outfit_set; -			// sort COF items by UUID -			for (S32 i = 0; i < cof_items.count(); ++i) +		//getting rid of base outfit folder link to simplify comparison +		for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it) +		{ +			if (*it == base_outfit_item)  			{ -				LLViewerInventoryItem *item = cof_items.get(i); -				// don't add the base outfit link to the list of objects we're comparing -				if(item != base_outfit_item) -				{ -					cof_set.insert(item->getLinkedUUID()); -				} +				cof_items.erase(it); +				break;  			} +		} -			// sort outfit folder by UUID -			for (S32 i = 0; i < outfit_items.count(); ++i) +		//"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions) +		std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid); +		std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid); + +		for (U32 i = 0; i < cof_items.size(); ++i) +		{ +			LLViewerInventoryItem *item1 = cof_items.get(i); +			LLViewerInventoryItem *item2 = outfit_items.get(i); + +			if (item1->getLinkedUUID() != item2->getLinkedUUID() ||  +				item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription())  			{ -				LLViewerInventoryItem *item = outfit_items.get(i); -				outfit_set.insert(item->getLinkedUUID()); +				mOutfitIsDirty = true; +				return;  			} - -			mOutfitIsDirty = (outfit_set != cof_set);  		} + +		mOutfitIsDirty = false;  	}  } | 
