From e6d5cc3bd1d678eaad7869a70b75d92772db3fc7 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 4 Aug 2010 17:21:33 -0400
Subject: [PATCH] EXT-8283 FIX, EXT-8360 FIX - original fixes got broken,
 presumably during some merge

---
 indra/newview/llcofwearables.cpp      |  6 +++++-
 indra/newview/llinventoryobserver.cpp | 31 +++++++++++++++++++++------
 indra/newview/llinventoryobserver.h   | 10 +++------
 indra/newview/llpaneloutfitedit.cpp   |  6 +++++-
 4 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index eb950bf6c1..acb513106d 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -396,7 +396,11 @@ void LLCOFWearables::refresh()
 		return;
 	}
 
-	if (mCOFVersion == catp->getVersion()) return;
+	// BAP - this check has to be removed because an item name change does not
+	// change cat version - ie, checking version is not a complete way
+	// of finding out whether anything has changed in this category.
+	//if (mCOFVersion == catp->getVersion()) return;
+
 	mCOFVersion = catp->getVersion();
 
 	typedef std::vector<LLSD> values_vector_t;
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 5416f01033..54b8f3a8a4 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -708,7 +708,7 @@ void LLInventoryCategoriesObserver::changed(U32 mask)
 		
 		const S32 current_num_known_descendents = cats->count() + items->count();
 
-		LLCategoryData cat_data = (*iter).second;
+		LLCategoryData& cat_data = (*iter).second;
 
 		bool cat_changed = false;
 
@@ -722,11 +722,17 @@ void LLInventoryCategoriesObserver::changed(U32 mask)
 		}
 
 		// If any item names have changed, update the name hash 
-		LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
-		if (cat_data.mItemNameHash != item_name_hash)
+		// Only need to check if (a) name hash has not previously been
+		// computed, or (b) a name has changed.
+		if (!cat_data.mIsNameHashInitialized || (mask & LLInventoryObserver::LABEL))
 		{
-			cat_data.mItemNameHash = item_name_hash;
-			cat_changed = true;
+			LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
+			if (cat_data.mItemNameHash != item_name_hash)
+			{
+				cat_data.mIsNameHashInitialized = true;
+				cat_data.mItemNameHash = item_name_hash;
+				cat_changed = true;
+			}
 		}
 
 		// If anything has changed above, fire the callback.
@@ -773,7 +779,8 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
 
 	if (can_be_added)
 	{
-		mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version, current_num_known_descendents)));
+		mCategoryMap.insert(category_map_value_t(
+								cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents)));
 	}
 
 	return can_be_added;
@@ -783,3 +790,15 @@ void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id)
 {
 	mCategoryMap.erase(cat_id);
 }
+
+LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
+	const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents)
+	
+	: mCatID(cat_id)
+	, mCallback(cb)
+	, mVersion(version)
+	, mDescendentsCount(num_descendents)
+	, mIsNameHashInitialized(false)
+{
+	mItemNameHash.finalize();
+}
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index ccd5fa5f4e..d535250970 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -295,18 +295,14 @@ public:
 protected:
 	struct LLCategoryData
 	{
-		LLCategoryData(callback_t cb, S32 version, S32 num_descendents)
-		: mCallback(cb)
-		, mVersion(version)
-		, mDescendentsCount(num_descendents)
-		{
-			mItemNameHash.finalize();
-		}
+		LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents);
 
 		callback_t	mCallback;
 		S32			mVersion;
 		S32			mDescendentsCount;
 		LLMD5		mItemNameHash;
+		bool		mIsNameHashInitialized;
+		LLUUID		mCatID;
 	};
 
 	typedef	std::map<LLUUID, LLCategoryData>	category_map_t;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index c12f1fbe99..07a66eaf10 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -1100,7 +1100,11 @@ void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list)
 void LLPanelOutfitEdit::onCOFChanged()
 {
 	//the panel is only updated when is visible to a user
-	if (!isInVisibleChain()) return;
+
+	// BAP - this check has to be removed because otherwise item name
+	// changes made when the panel is not visible will not be
+	// propagated to the panel.
+	// if (!isInVisibleChain()) return;
 
 	update();
 }
-- 
GitLab