diff options
| author | Sergei Litovchuk <slitovchuk@productengine.com> | 2010-05-17 18:57:03 +0300 | 
|---|---|---|
| committer | Sergei Litovchuk <slitovchuk@productengine.com> | 2010-05-17 18:57:03 +0300 | 
| commit | d8b989a87b94fd851404b42094e88c0a0c213ac8 (patch) | |
| tree | 27ab803f2744eff49c944cc5a5b8291aa7465636 | |
| parent | fcea61df76ce69b438d26037df4bafc3380f129d (diff) | |
EXT-7158 ADDITIONAL FIX Optimization and implementation fix
- Fixed issue with filter not applied to outfit newly added while filtering is active.
- Optimization of refreshing outfit list when filter is applied - list is not refreshed on every list visibility change.
Reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/394/
--HG--
branch : product-engine
| -rw-r--r-- | indra/newview/llinventoryitemslist.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llinventoryitemslist.h | 8 | ||||
| -rw-r--r-- | indra/newview/lloutfitslist.cpp | 35 | ||||
| -rw-r--r-- | indra/newview/lloutfitslist.h | 2 | 
4 files changed, 43 insertions, 12 deletions
| diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index 2d1d401cd4..9b592e79af 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -322,7 +322,7 @@ LLInventoryItemsList::Params::Params()  LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)  :	LLFlatListViewEx(p)  ,	mNeedsRefresh(false) -,	mPrevVisibility(false) +,	mForceRefresh(false)  {  	// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView  	// but reset to true in all derived classes. This settings might need to @@ -356,14 +356,13 @@ boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(con  void LLInventoryItemsList::doIdle()  { -	bool cur_visibility = getVisible(); -	if(cur_visibility != mPrevVisibility || mNeedsRefresh) +	if (!mNeedsRefresh) return; + +	if (isInVisibleChain() || mForceRefresh)  	{  		refresh();  		mRefreshCompleteSignal(this, LLSD()); - -		mPrevVisibility = getVisible();  	}  } @@ -414,6 +413,7 @@ void LLInventoryItemsList::refresh()  	bool needs_refresh = add_limit_exceeded;  	setNeedsRefresh(needs_refresh); +	setForceRefresh(needs_refresh);  }  void LLInventoryItemsList::computeDifference( diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index 60cccc0f4f..a3863b511c 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -222,6 +222,12 @@ public:  	bool getNeedsRefresh(){ return mNeedsRefresh; }  	/** +	 * Sets the flag indicating that the list needs to be refreshed even if it is +	 * not currently visible. +	 */ +	void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; } + +	/**  	 * Idle routine used to refresh the list regardless of the current list  	 * visibility, unlike draw() which is called only for the visible list.  	 * This is needed for example to filter items of the list hidden by closed @@ -259,7 +265,7 @@ private:  					 // Will be used in refresh() to determine added and removed ids  	bool mNeedsRefresh; -	bool mPrevVisibility; +	bool mForceRefresh;  	commit_signal_t mRefreshCompleteSignal;  }; diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 12d5203429..43b7e15977 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -170,7 +170,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));  		// Setting list refresh callback to apply filter on list change. -		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onWearableItemsListRefresh, this, _1)); +		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));  		// Fetch the new outfit contents.  		cat->fetch(); @@ -178,6 +178,21 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		// Refresh the list of outfit items after fetch().  		// Further list updates will be triggered by the category observer.  		list->updateList(cat_id); + +		// If filter is currently applied we store the initial tab state and +		// open it to show matched items if any. +		if (!mFilterSubString.empty()) +		{ +			tab->notifyChildren(LLSD().with("action","store_state")); +			tab->setDisplayChildren(true); + +			// Setting mForceRefresh flag will make the list refresh its contents +			// even if it is not currently visible. This is required to apply the +			// filter to the newly added list. +			list->setForceRefresh(true); + +			list->setFilterSubString(mFilterSubString); +		}  	}  	// Handle removed tabs. @@ -327,7 +342,7 @@ void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUI  	mSelectedOutfitUUID = category_id;  } -void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl) +void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)  {  	if (!ctrl || mFilterSubString.empty())  		return; @@ -338,7 +353,7 @@ void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)  		 iter != iter_end; ++iter)  	{  		LLAccordionCtrlTab* tab = iter->second; -		if (tab) continue; +		if (!tab) continue;  		LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());  		if (list != ctrl) continue; @@ -395,8 +410,6 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)  		if (!new_filter_substring.empty())  		{ -			tab->setDisplayChildren(true); -  			std::string title = tab->getTitle();  			LLStringUtil::toUpper(title); @@ -413,6 +426,18 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)  			{  				tab->setTitle(tab->getTitle(), cur_filter);  			} + +			if (tab->getVisible()) +			{ +				// Open tab if it has passed the filter. +				tab->setDisplayChildren(true); +			} +			else +			{ +				// Set force refresh flag to refresh not visible list +				// when some changes occur in it. +				list->setForceRefresh(true); +			}  		}  		else  		{ diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index bcb393b12a..8eaa39e6f1 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -98,7 +98,7 @@ private:  	 * Called upon list refresh event to update tab visibility depending on  	 * the results of applying filter to the title and list items of the tab.  	 */ -	void onWearableItemsListRefresh(LLUICtrl* ctrl); +	void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);  	/**  	 * Highlights filtered items and hides tabs which haven't passed filter. | 
