From a14ba78dbbfc925c94f1e8ed94b52bc08e626e3d Mon Sep 17 00:00:00 2001
From: andreykproductengine <akleshchev@productengine.com>
Date: Tue, 12 Aug 2014 19:45:53 +0300
Subject: MAINT-4218 FIXED Adding clothing from inventory closes THAT clothing
 folder and hides THAT folder

---
 indra/llui/llfolderviewitem.cpp              | 19 +++++++++----------
 indra/llui/llfolderviewmodel.h               | 11 ++++++++++-
 indra/newview/llfolderviewmodelinventory.cpp |  9 +++++++--
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index d251544ee5..6ae03adcb9 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -258,20 +258,19 @@ BOOL LLFolderViewItem::passedFilter(S32 filter_generation)
 
 BOOL LLFolderViewItem::isPotentiallyVisible(S32 filter_generation)
 {
-	// Item should be visible if:
-	// 1. item passed current filter
-	// 2. item was updated (gen < 0) but has descendants that passed filter
-	// 3. item was recently updated and was visible before update
-
-	LLFolderViewModelItem* model = getViewModelItem();
-	if (model->getLastFilterGeneration() < 0 && !getFolderViewModel()->getFilter().isModified())
+	if (filter_generation < 0)
 	{
-		return model->descendantsPassedFilter(filter_generation) || getVisible();
+		filter_generation = getFolderViewModel()->getFilter().getFirstSuccessGeneration();
 	}
-	else
+	LLFolderViewModelItem* model = getViewModelItem();
+	BOOL visible = model->passedFilter(filter_generation);
+	if (model->getMarkedDirtyGeneration() >= filter_generation)
 	{
-		return model->passedFilter(filter_generation);
+		// unsure visibility state
+		// retaining previous visibility until item is updated or filter generation changes
+		visible |= getVisible();
 	}
+	return visible;
 }
 
 void LLFolderViewItem::refresh()
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 8d98363c5f..cad3ca9d8d 100755
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -190,6 +190,7 @@ public:
 	virtual std::string::size_type getFilterStringSize() = 0;
 
 	virtual S32	getLastFilterGeneration() const = 0;
+	virtual S32 getMarkedDirtyGeneration() const = 0;
 
 	virtual bool hasChildren() const = 0;
 	virtual void addChild(LLFolderViewModelItem* child) = 0;
@@ -230,6 +231,7 @@ public:
 		mFolderViewItem(NULL),
 		mLastFilterGeneration(-1),
 		mLastFolderFilterGeneration(-1),
+		mMarkedDirtyGeneration(-1),
 		mMostFilteredDescendantGeneration(-1),
 		mParent(NULL),
 		mRootViewModel(root_view_model)
@@ -243,8 +245,13 @@ public:
 
 	S32	getLastFilterGeneration() const { return mLastFilterGeneration; }
 	S32	getLastFolderFilterGeneration() const { return mLastFolderFilterGeneration; }
+	S32	getMarkedDirtyGeneration() const { return mMarkedDirtyGeneration; }
 	void dirtyFilter()
 	{
+		if(mMarkedDirtyGeneration < 0)
+		{
+			mMarkedDirtyGeneration = mLastFilterGeneration;
+		}
 		mLastFilterGeneration = -1;
 		mLastFolderFilterGeneration = -1;
 
@@ -303,6 +310,7 @@ public:
 		mLastFilterGeneration = filter_generation;
 		mStringMatchOffsetFilter = string_offset;
 		mStringFilterSize = string_size;
+		mMarkedDirtyGeneration = -1;
 	}
 
 	void setPassedFolderFilter(bool passed, S32 filter_generation)
@@ -351,7 +359,8 @@ protected:
 
 	S32							mLastFilterGeneration,
 								mLastFolderFilterGeneration,
-								mMostFilteredDescendantGeneration;
+								mMostFilteredDescendantGeneration,
+								mMarkedDirtyGeneration;
 
 	child_list_t				mChildren;
 	LLFolderViewModelItem*		mParent;
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index 7615c12043..2eca2a8974 100755
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -129,13 +129,18 @@ void LLFolderViewModelItemInventory::requestSort()
 
 void LLFolderViewModelItemInventory::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)
 {
+	bool generation_skip = mMarkedDirtyGeneration >= 0
+		&& mPrevPassedAllFilters
+		&& mMarkedDirtyGeneration < mRootViewModel.getFilter().getFirstSuccessGeneration();
 	LLFolderViewModelItemCommon::setPassedFilter(passed, filter_generation, string_offset, string_size);
 	bool before = mPrevPassedAllFilters;
 	mPrevPassedAllFilters = passedFilter(filter_generation);
 
-	if (before != mPrevPassedAllFilters)
+	if (before != mPrevPassedAllFilters || generation_skip)
 	{
-		// Need to rearrange the folder if the filtered state of the item changed
+		// Need to rearrange the folder if the filtered state of the item changed,
+		// previously passed item skipped filter generation changes while being dirty
+		// or previously passed not yet filtered item was marked dirty
 		LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
 		if (parent_folder)
 		{
-- 
cgit v1.2.3