diff options
Diffstat (limited to 'indra/newview/llinventoryfilter.cpp')
| -rw-r--r-- | indra/newview/llinventoryfilter.cpp | 52 | 
1 files changed, 45 insertions, 7 deletions
| diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 947f74315c..e859535d18 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -39,8 +39,11 @@  #include "llviewerfoldertype.h"  // linden library includes +#include "llclipboard.h"  #include "lltrans.h" +LLFastTimer::DeclareTimer FT_FILTER_CLIPBOARD("Filter Clipboard"); +  LLInventoryFilter::FilterOps::FilterOps() :  	mFilterObjectTypes(0xffffffffffffffffULL),  	mFilterCategoryTypes(0xffffffffffffffffULL), @@ -88,11 +91,15 @@ LLInventoryFilter::~LLInventoryFilter()  BOOL LLInventoryFilter::check(const LLFolderViewItem* item)   { -	// If it's a folder and we're showing all folders, return TRUE automatically. +	// Clipboard cut items are *always* filtered so we need this value upfront +	const LLFolderViewEventListener* listener = item->getListener(); +	const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE); + +	// If it's a folder and we're showing all folders, return automatically.  	const BOOL is_folder = (dynamic_cast<const LLFolderViewFolder*>(item) != NULL);  	if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))  	{ -		return TRUE; +		return passed_clipboard;  	}  	mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; @@ -103,6 +110,7 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)  	const BOOL passed = (passed_filtertype &&  						 passed_permissions &&  						 passed_filterlink && +						 passed_clipboard &&  						 (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));  	return passed; @@ -114,8 +122,10 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)  	const bool passed_filtertype = checkAgainstFilterType(item);  	const bool passed_permissions = checkAgainstPermissions(item); +	const BOOL passed_clipboard = checkAgainstClipboard(item->getUUID());  	const bool passed = (passed_filtertype &&  						 passed_permissions && +						 passed_clipboard &&  						 (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));  	return passed; @@ -145,10 +155,13 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const  bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  { +	// Always check against the clipboard +	const BOOL passed_clipboard = checkAgainstClipboard(folder_id); +	  	// we're showing all folders, overriding filter  	if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS)  	{ -		return true; +		return passed_clipboard;  	}  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY) @@ -163,7 +176,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  			return false;  	} -	return true; +	return passed_clipboard;  }  BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const @@ -255,7 +268,7 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con  			}  		}  	} -	 +  	return TRUE;  } @@ -309,6 +322,31 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) cons  	return true;  } +// Items and folders that are on the clipboard or, recursively, in a folder which   +// is on the clipboard must be filtered out if the clipboard is in the "cut" mode. +bool LLInventoryFilter::checkAgainstClipboard(const LLUUID& object_id) const +{ +	if (LLClipboard::instance().isCutMode()) +	{ +		LLFastTimer ft(FT_FILTER_CLIPBOARD); +		LLUUID current_id = object_id; +		LLInventoryObject *current_object = gInventory.getObject(object_id); +		while (current_id.notNull() && current_object) +		{ +			if (LLClipboard::instance().isOnClipboard(current_id)) +			{ +				return false; +			} +			current_id = current_object->getParentUUID(); +			if (current_id.notNull()) +			{ +				current_object = gInventory.getObject(current_id); +			} +		} +	} +	return true; +} +  BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const  {  	const LLFolderViewEventListener* listener = item->getListener(); @@ -379,7 +417,7 @@ BOOL LLInventoryFilter::isNotDefault() const  	not_default |= (mFilterOps.mMinDate != mDefaultFilterOps.mMinDate);  	not_default |= (mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate);  	not_default |= (mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo); - +	  	return not_default;  } @@ -965,7 +1003,7 @@ void LLInventoryFilter::fromLLSD(LLSD& data)  {  	if(data.has("filter_types"))  	{ -		setFilterObjectTypes((U32)data["filter_types"].asInteger()); +		setFilterObjectTypes((U64)data["filter_types"].asInteger());  	}  	if(data.has("min_date") && data.has("max_date")) | 
