diff options
| -rw-r--r-- | indra/newview/llfolderview.cpp | 50 | ||||
| -rw-r--r-- | indra/newview/llfolderviewitem.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llfolderviewitem.h | 3 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.h | 1 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.cpp | 16 | 
6 files changed, 47 insertions, 36 deletions
| diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 068a6407f7..70899014cb 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -797,7 +797,7 @@ void LLFolderView::sanitizeSelection()  	// if nothing selected after prior constraints...  	if (mSelectedItems.empty())  	{ -		// ...select first available parent of original selection, or "My Inventory" otherwise +		// ...select first available parent of original selection  		LLFolderViewItem* new_selection = NULL;  		if (original_selected_item)  		{ @@ -2023,19 +2023,13 @@ void LLFolderView::deleteAllChildren()  void LLFolderView::scrollToShowSelection()  { -	// If items are filtered while background fetch is in progress -	// scrollbar resets to the first filtered item. See EXT-3981. -	// However we allow scrolling for folder views with mAutoSelectOverride -	// (used in Places SP) as an exception because the selection in them -	// is not reset during items filtering. See STORM-133. -	if ( (!LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mAutoSelectOverride) -			&& mSelectedItems.size() ) +	if ( mSelectedItems.size() )  	{  		mNeedsScroll = TRUE;  	}  } -// If the parent is scroll containter, scroll it to make the selection +// If the parent is scroll container, scroll it to make the selection  // is maximally visible.  void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect)  { @@ -2254,46 +2248,50 @@ void LLFolderView::doIdle()  		arrangeAll();  	} +	if (mFilter->isModified() && mFilter->isNotDefault()) +	{ +		mNeedsAutoSelect = TRUE; +	}  	mFilter->clearModified(); -	BOOL filter_modified_and_active = mCompletedFilterGeneration < mFilter->getCurrentGeneration() &&  -										mFilter->isNotDefault(); -	mNeedsAutoSelect = filter_modified_and_active && -							!(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture()); -	// filter to determine visiblity before arranging +	// filter to determine visibility before arranging  	filterFromRoot();  	// automatically show matching items, and select first one if we had a selection -	// do this every frame until user puts keyboard focus into the inventory window -	// signaling the end of the automatic update -	// only do this when mNeedsFilter is set, meaning filtered items have -	// potentially changed  	if (mNeedsAutoSelect)  	{  		LLFastTimer t3(FTM_AUTO_SELECT);  		// select new item only if a filtered item not currently selected  		LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back(); -		if ((selected_itemp && !selected_itemp->getFiltered()) && !mAutoSelectOverride) +		if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyFiltered()))  		{ -			// select first filtered item -			LLSelectFirstFilteredItem filter; -			applyFunctorRecursively(filter); +			applyFunctorRecursively(LLSelectFirstFilteredItem());  		}  		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.  		// Used by LLPlacesFolderView.  		if (mAutoSelectOverride && !mFilter->getFilterSubString().empty())  		{ -			LLOpenFilteredFolders filter; -			applyFunctorRecursively(filter); +			applyFunctorRecursively(LLOpenFilteredFolders());  		}  		scrollToShowSelection();  	} +	BOOL filter_finished = mCompletedFilterGeneration >= mFilter->getCurrentGeneration()  +						&& !LLInventoryModelBackgroundFetch::instance().folderFetchActive(); +	if (filter_finished  +		|| gFocusMgr.childHasKeyboardFocus(inventory_panel)  +		|| gFocusMgr.childHasMouseCapture(inventory_panel)) +	{ +		// finishing the filter process, giving focus to the folder view, or dragging the scrollbar all stop the auto select process +		mNeedsAutoSelect = FALSE; +	} + +  	// during filtering process, try to pin selected item's location on screen  	// this will happen when searching your inventory and when new items arrive -	if (filter_modified_and_active) +	if (!filter_finished)  	{  		// calculate rectangle to pin item to at start of animated rearrange  		if (!mPinningSelectedItem && !mSelectedItems.empty()) @@ -2359,7 +2357,7 @@ void LLFolderView::doIdle()  	{  		scrollToShowItem(mSelectedItems.back(), constraint_rect);  		// continue scrolling until animated layout change is done -		if (!filter_modified_and_active  +		if (filter_finished  			&& (!needsArrange() || !is_visible))  		{  			mNeedsScroll = FALSE; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 712d3e4583..dce0981a3e 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -221,6 +221,11 @@ BOOL LLFolderViewItem::potentiallyVisible()  {  	// we haven't been checked against min required filter  	// or we have and we passed +	return potentiallyFiltered(); +} + +BOOL LLFolderViewItem::potentiallyFiltered() +{  	return getLastFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration() || getFiltered();  } @@ -1375,7 +1380,8 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)  			&& !mPassedFilter)									// and did not pass the filter  		{  			// go ahead and flag this folder as done -			mLastFilterGeneration = filter_generation;			 +			mLastFilterGeneration = filter_generation; +			mStringMatchOffset = std::string::npos;  		}  		else // filter self only on first pass through  		{ diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 4e8dc2da16..3c7592046a 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -304,7 +304,8 @@ public:  	BOOL			isDescendantOf( const LLFolderViewFolder* potential_ancestor );  	S32				getIndentation() { return mIndentation; } -	virtual BOOL	potentiallyVisible(); // do we know for a fact that this item has been filtered out? +	virtual BOOL	potentiallyVisible(); // do we know for a fact that this item won't be displayed? +	virtual BOOL	potentiallyFiltered(); // do we know for a fact that this item has been filtered out?  	virtual BOOL	getFiltered();  	virtual BOOL	getFiltered(S32 filter_generation); diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index e859535d18..4d0af94f9f 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -402,6 +402,11 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const  	return mSubStringMatchOffset;  } +BOOL LLInventoryFilter::isDefault() const +{ +	return !isNotDefault(); +} +  // has user modified default filter params?  BOOL LLInventoryFilter::isNotDefault() const  { diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 1804637a04..9e600c036f 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -163,6 +163,7 @@ public:  	// +-------------------------------------------------------------------+  	// + Default  	// +-------------------------------------------------------------------+ +	BOOL 				isDefault() const;  	BOOL 				isNotDefault() const;  	void 				markDefault();  	void 				resetDefault(); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 236c997ef6..f74a239fd3 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -1059,20 +1059,24 @@ void LLSaveFolderState::setApply(BOOL apply)  void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)  {  	LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER); +	LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); +	if(!bridge) return; +	  	if(mApply)  	{  		// we're applying the open state -		LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); -		if(!bridge) return;  		LLUUID id(bridge->getUUID());  		if(mOpenFolders.find(id) != mOpenFolders.end())  		{ -			folder->setOpen(TRUE); +			if (!folder->isOpen()) +			{ +				folder->setOpen(TRUE); +			}  		}  		else  		{  			// keep selected filter in its current state, this is less jarring to user -			if (!folder->isSelected()) +			if (!folder->isSelected() && folder->isOpen())  			{  				folder->setOpen(FALSE);  			} @@ -1083,8 +1087,6 @@ void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)  		// we're recording state at this point  		if(folder->isOpen())  		{ -			LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); -			if(!bridge) return;  			mOpenFolders.insert(bridge->getUUID());  		}  	} @@ -1120,7 +1122,6 @@ void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)  		{  			item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);  		} -		item->getRoot()->scrollToShowSelection();  		mItemSelected = TRUE;  	}  } @@ -1134,7 +1135,6 @@ void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)  		{  			folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);  		} -		folder->getRoot()->scrollToShowSelection();  		mItemSelected = TRUE;  	}  } | 
