From f6dfd6bf0f3ea0e9b5f56a939867353c393539d6 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Wed, 25 Jul 2012 18:20:54 -0700
Subject: [PATCH] CHUI-222 FIX Selecting None in inventory filters does not
 update until inventory selected

---
 indra/llui/llfolderview.cpp                  |  2 -
 indra/llui/llfolderviewitem.cpp              | 11 +--
 indra/llui/llfolderviewmodel.h               |  4 +-
 indra/newview/llfolderviewmodelinventory.cpp | 74 +++++++++-----------
 indra/newview/llfolderviewmodelinventory.h   |  4 +-
 indra/newview/llimfloatercontainer.h         |  2 +-
 indra/newview/llpanelobjectinventory.cpp     |  2 +-
 7 files changed, 49 insertions(+), 50 deletions(-)

diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 10729a3eaee..147af04f306 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -266,8 +266,6 @@ LLFolderView::~LLFolderView( void )
 	mItems.clear();
 	mFolders.clear();
 
-	//product engine bugfix, prevent deletion of non-heap data
-	//delete mViewModel;
 	mViewModel = NULL;
 }
 
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 741fc9c324a..a356d587f96 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -1543,11 +1543,14 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
 
 void LLFolderViewFolder::requestArrange()
 { 
-	mLastArrangeGeneration = -1; 
-	// flag all items up to root
-	if (mParentFolder)
+	//if ( mLastArrangeGeneration != -1)
 	{
-		mParentFolder->requestArrange();
+		mLastArrangeGeneration = -1; 
+		// flag all items up to root
+		if (mParentFolder)
+		{
+			mParentFolder->requestArrange();
+		}
 	}
 }
 
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 268ae8eea84..acdec53602e 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -152,7 +152,7 @@ class LLFolderViewModelItem
 	
 	virtual bool potentiallyVisible() = 0; // is the item definitely visible or we haven't made up our minds yet?
 
-	virtual bool filter( LLFolderViewFilter& filter) = 0;
+	virtual void filter( LLFolderViewFilter& filter) = 0;
 	virtual bool passedFilter(S32 filter_generation = -1) = 0;
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1) = 0;
 	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) = 0;
@@ -192,6 +192,7 @@ class LLFolderViewModelItemCommon : public LLFolderViewModelItem
 	:	mSortVersion(-1),
 		mPassedFilter(true),
 		mPassedFolderFilter(true),
+		mPrevPassedAllFilters(false),
 		mFolderViewItem(NULL),
 		mLastFilterGeneration(-1),
 		mMostFilteredDescendantGeneration(-1),
@@ -232,6 +233,7 @@ class LLFolderViewModelItemCommon : public LLFolderViewModelItem
 	S32						mSortVersion;
 	bool					mPassedFilter;
 	bool					mPassedFolderFilter;
+	bool					mPrevPassedAllFilters;
 
 	S32						mLastFilterGeneration;
 	S32						mMostFilteredDescendantGeneration;
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index e8135496d58..13ca73917bb 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -133,8 +133,9 @@ bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)
 		filter_generation = mRootViewModel.getFilter()->getFirstSuccessGeneration();
 
 	return mPassedFolderFilter 
-		&& mLastFilterGeneration >= filter_generation
-		&& (mPassedFilter || descendantsPassedFilter(filter_generation));
+		&& (descendantsPassedFilter(filter_generation)
+			|| (mLastFilterGeneration >= filter_generation 
+				&& mPassedFilter));
 }
 
 bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation)
@@ -148,30 +149,29 @@ void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_fo
 	mPassedFilter = passed;
 	mPassedFolderFilter = passed_folder;
 	mLastFilterGeneration = filter_generation;
+
+	bool passed_filter_before = mPrevPassedAllFilters;
+	mPrevPassedAllFilters = passedFilter(filter_generation);
+
+	if (passed_filter_before != mPrevPassedAllFilters)
+	{
+		//TODO RN: ensure this still happens, but without dependency on folderview
+		LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
+		if (parent_folder)
+		{
+			parent_folder->requestArrange();
+		}
+	}
 }
 
-bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter )
+void LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter )
 {
-	bool passed_filter_before = item->passedFilter();
 	S32 filter_generation = filter.getCurrentGeneration();
-	S32 must_pass_generation = filter.getFirstRequiredGeneration();
 
 	if (item->getLastFilterGeneration() < filter_generation)
 	{
 		// recursive application of the filter for child items
 		item->filter( filter );
-
-		if (item->getLastFilterGeneration() >= must_pass_generation 
-			&& !item->passedFilter(must_pass_generation))
-		{
-			// failed to pass an earlier filter that was a subset of the current one
-			// go ahead and flag this item as done
-			if (item->passedFilter())
-			{
-				llerrs << "Invalid shortcut in inventory filtering!" << llendl;
-			}
-			item->setPassedFilter(false, false, filter_generation);
-		}
 	}
 
 	// track latest generation to pass any child items, for each folder up to root
@@ -184,39 +184,36 @@ bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
 			view_model->mMostFilteredDescendantGeneration = filter_generation;
 			view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent);
 		}
-		
-		return !passed_filter_before;
-	}
-	else // !item->passedfilter()
-	{
-		return passed_filter_before;
 	}
 }
 
-bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
+void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 {
-	bool changed = false;
+	const S32 filter_generation = filter.getCurrentGeneration();
+	const S32 must_pass_generation = filter.getFirstRequiredGeneration();
+
+	if (getLastFilterGeneration() >= must_pass_generation 
+		&& !passedFilter(must_pass_generation))
+	{
+		// failed to pass an earlier filter that was a subset of the current one
+		// go ahead and flag this item as done
+		setPassedFilter(false, false, filter_generation);
+		return;
+	}
 
 	if(!mChildren.empty()
-		&& (getLastFilterGeneration() < filter.getFirstRequiredGeneration() // haven't checked descendants against minimum required generation to pass
-			|| descendantsPassedFilter(filter.getFirstRequiredGeneration()))) // or at least one descendant has passed the minimum requirement
+		&& (getLastFilterGeneration() < must_pass_generation // haven't checked descendants against minimum required generation to pass
+			|| descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
 	{
 		// now query children
-		for (child_list_t::iterator iter = mChildren.begin();
-			iter != mChildren.end() && filter.getFilterCount() > 0;
+		for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end();
+			iter != end_iter && filter.getFilterCount() > 0;
 			++iter)
 		{
-			changed |= filterChildItem((*iter), filter);
+			filterChildItem((*iter), filter);
 		}
 	}
 
-	if (changed)
-	{
-		//TODO RN: ensure this still happens, but without dependency on folderview
-		LLFolderViewFolder* folder = static_cast<LLFolderViewFolder*>(mFolderViewItem);
-		folder->requestArrange();
-	}
-
 	// if we didn't use all filter iterations
 	// that means we filtered all of our descendants
 	// so filter ourselves now
@@ -229,11 +226,10 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 								? filter.checkFolder(this)
 								: true;
 
-		setPassedFilter(passed_filter, passed_filter_folder, filter.getCurrentGeneration());
+		setPassedFilter(passed_filter, passed_filter_folder, filter_generation);
 		//TODO RN: create interface for string highlighting
 		//mStringMatchOffset = filter.getStringMatchOffset(this);
 	}
-	return changed;
 }
 
 LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel()
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index eb2a4bfdec3..ab67c93897f 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -59,8 +59,8 @@ class LLFolderViewModelItemInventory
 	virtual bool passedFilter(S32 filter_generation = -1);
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1);
 	virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation);
-	virtual bool filter( LLFolderViewFilter& filter);
-	virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
+	virtual void filter( LLFolderViewFilter& filter);
+	virtual void filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
 
 	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
 	virtual LLToolDragAndDrop::ESource getDragSource() const = 0;
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index a25ea0ab462..7005ab7b6a4 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -89,7 +89,7 @@ class LLConversationItem : public LLFolderViewModelItemCommon
 	virtual bool hasChildren() const { return FALSE; }
 
 	virtual bool potentiallyVisible() { return true; }
-	virtual bool filter( LLFolderViewFilter& filter) { return true; }
+	virtual void filter( LLFolderViewFilter& filter) { }
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; }
 	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) { }
 	virtual bool passedFilter(S32 filter_generation = -1) { return true; }
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 9bd716e9003..4719191231a 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1616,7 +1616,7 @@ void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
 			 iter != inventory->end(); )
 		{
 			LLInventoryObject* item = *iter++;
-			LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID());
+			LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properties", item->getUUID());
 			if(floater)
 			{
 				floater->refresh();
-- 
GitLab