diff options
| -rw-r--r-- | indra/newview/llfolderview.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llfolderview.h | 2 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.cpp | 147 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.h | 21 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.h | 4 | ||||
| -rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 10 | 
7 files changed, 129 insertions, 66 deletions
| diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index ab49739d58..8bea8850b6 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -2217,9 +2217,9 @@ void LLFolderView::setFilterPermMask( PermissionMask filter_perm_mask )  	mFilter->setFilterPermissions(filter_perm_mask);  } -U32 LLFolderView::getFilterTypes() const +U32 LLFolderView::getFilterObjectTypes() const  { -	return mFilter->getFilterTypes(); +	return mFilter->getFilterObjectTypes();  }  PermissionMask LLFolderView::getFilterPermissions() const diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index bbd92b487f..8e9dd923a0 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -116,7 +116,7 @@ public:  	// filter is never null  	LLInventoryFilter* getFilter();  	const std::string getFilterSubString(BOOL trim = FALSE); -	U32 getFilterTypes() const; +	U32 getFilterObjectTypes() const;  	PermissionMask getFilterPermissions() const;  	// JAMESDEBUG use getFilter()->getShowFolderState();  	//LLInventoryFilter::EFolderShow getShowFolderState(); diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index e5851bb624..4c5e4d5607 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -46,12 +46,13 @@  LLInventoryFilter::FilterOps::FilterOps() :  	mFilterObjectTypes(0xffffffffffffffffULL), +	mFilterCategoryTypes(0xffffffffffffffffULL),  	mMinDate(time_min()),  	mMaxDate(time_max()),  	mHoursAgo(0),  	mShowFolderState(SHOW_NON_EMPTY_FOLDERS),  	mPermissions(PERM_NONE), -	mFilterType(FILTERTYPE_ITEM), +	mFilterTypes(FILTERTYPE_OBJECT),  	mFilterUUID(LLUUID::null)  {  } @@ -128,36 +129,45 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)  	if (!object) return FALSE; -	switch (mFilterOps.mFilterType) +	const U32 filterTypes = mFilterOps.mFilterTypes; + +	// Pass if this item's type is of the correct filter type +	if (filterTypes & FILTERTYPE_OBJECT)  	{ -		case FILTERTYPE_ITEM: -		{ -			// If it has no type, pass it, unless it's a link. -			if (object_type == LLInventoryType::IT_NONE) -			{ -				return !object->getIsLinkType(); -			} -			return (1LL << object_type & mFilterOps.mFilterObjectTypes) != U64(0); -		} -		// Pass if this item is a category of the filter type, or -		// if its parent is a category of the filter type. -		case FILTERTYPE_CATEGORY: +		// If it has no type, pass it, unless it's a link. +		if (object_type == LLInventoryType::IT_NONE)  		{ -			LLUUID cat_id = object_id; -			if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY) -			{ -				cat_id = object->getParentUUID(); -			} -			const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); -			if (!cat) return FALSE; -			return (1LL << cat->getPreferredType() & mFilterOps.mFilterObjectTypes) != U64(0); +			if (object->getIsLinkType()) +				return FALSE;  		} -		case FILTERTYPE_UUID: +		if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0)) +			return FALSE; +	} +	 +	// Pass if this item is a category of the filter type, or +	// if its parent is a category of the filter type. +	if (filterTypes & FILTERTYPE_CATEGORY) +	{ +		LLUUID cat_id = object_id; +		if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)  		{ -			return (object->getLinkedUUID() == mFilterOps.mFilterUUID); +			cat_id = object->getParentUUID();  		} +		const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); +		if (!cat)  +			return FALSE; +		if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0)) +			return FALSE;  	} -	return FALSE; + +	// Pass if this item is the target UUID or if it links to the target UUID +	if (filterTypes & FILTERTYPE_UUID) +	{ +		if (object->getLinkedUUID() != mFilterOps.mFilterUUID) +			return FALSE; +	} + +	return TRUE;  } @@ -204,7 +214,7 @@ BOOL LLInventoryFilter::isModifiedAndClear()  	return ret;  } -void LLInventoryFilter::setFilterTypes(U64 types, EFilterType filter_type) +void LLInventoryFilter::setFilterObjectTypes(U64 types)  {  	if (mFilterOps.mFilterObjectTypes != types)  	{ @@ -229,14 +239,49 @@ void LLInventoryFilter::setFilterTypes(U64 types, EFilterType filter_type)  			setModified(FILTER_MORE_RESTRICTIVE);  		}  	} -	mFilterOps.mFilterType = filter_type; +	mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT; +} + +void LLInventoryFilter::setFilterCategoryTypes(U64 types) +{ +	if (mFilterOps.mFilterCategoryTypes != types) +	{ +		// keep current items only if no type bits getting turned off +		BOOL fewer_bits_set = (mFilterOps.mFilterCategoryTypes & ~types); +		BOOL more_bits_set = (~mFilterOps.mFilterCategoryTypes & types); + +		mFilterOps.mFilterCategoryTypes = types; +		if (more_bits_set && fewer_bits_set) +		{ +			// neither less or more restrive, both simultaneously +			// so we need to filter from scratch +			setModified(FILTER_RESTART); +		} +		else if (more_bits_set) +		{ +			// target is only one of all requested types so more type bits == less restrictive +			setModified(FILTER_LESS_RESTRICTIVE); +		} +		else if (fewer_bits_set) +		{ +			setModified(FILTER_MORE_RESTRICTIVE); +		} +	} +	mFilterOps.mFilterTypes |= FILTERTYPE_CATEGORY;  }  void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)  { +	if (mFilterOps.mFilterUUID == LLUUID::null) +	{ +		setModified(FILTER_MORE_RESTRICTIVE); +	} +	else +	{ +		setModified(FILTER_RESTART); +	}  	mFilterOps.mFilterUUID = object_id; -	mFilterOps.mFilterType = FILTERTYPE_UUID; -	setModified(FILTER_RESTART); +	mFilterOps.mFilterTypes = FILTERTYPE_UUID;  }  void LLInventoryFilter::setFilterSubString(const std::string& string) @@ -244,9 +289,11 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)  	if (mFilterSubString != string)  	{  		// hitting BACKSPACE, for example -		BOOL less_restrictive = mFilterSubString.size() >= string.size() && !mFilterSubString.substr(0, string.size()).compare(string); +		const BOOL less_restrictive = mFilterSubString.size() >= string.size() && !mFilterSubString.substr(0, string.size()).compare(string); +  		// appending new characters -		BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString); +		const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString); +  		mFilterSubString = string;  		LLStringUtil::toUpper(mFilterSubString);  		LLStringUtil::trimHead(mFilterSubString); @@ -263,6 +310,14 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)  		{  			setModified(FILTER_RESTART);  		} + +		// Cancel out UUID once the search string is modified +		if (mFilterOps.mFilterTypes == FILTERTYPE_UUID) +		{ +			mFilterOps.mFilterTypes &= ~FILTERTYPE_UUID; +			mFilterOps.mFilterUUID == LLUUID::null; +			setModified(FILTER_RESTART); +		}  	}  } @@ -445,7 +500,7 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior)  	}  } -BOOL LLInventoryFilter::isFilterWith(LLInventoryType::EType t) const +BOOL LLInventoryFilter::isFilterObjectTypesWith(LLInventoryType::EType t) const  {  	return mFilterOps.mFilterObjectTypes & (1LL << t);  } @@ -465,7 +520,7 @@ const std::string& LLInventoryFilter::getFilterText()  	S32 num_filter_types = 0;  	mFilterText.clear(); -	if (isFilterWith(LLInventoryType::IT_ANIMATION)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_ANIMATION))  	{  		//filtered_types += " Animations,";  		filtered_types += LLTrans::getString("Animations"); @@ -480,7 +535,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_CALLINGCARD)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_CALLINGCARD))  	{  		//filtered_types += " Calling Cards,";  		filtered_types += LLTrans::getString("Calling Cards"); @@ -494,7 +549,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_WEARABLE)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_WEARABLE))  	{  		//filtered_types += " Clothing,";  		filtered_types +=  LLTrans::getString("Clothing"); @@ -508,7 +563,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_GESTURE)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_GESTURE))  	{  		//filtered_types += " Gestures,";  		filtered_types +=  LLTrans::getString("Gestures"); @@ -522,7 +577,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_LANDMARK)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_LANDMARK))  	{  		//filtered_types += " Landmarks,";  		filtered_types +=  LLTrans::getString("Landmarks"); @@ -536,7 +591,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_NOTECARD)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_NOTECARD))  	{  		//filtered_types += " Notecards,";  		filtered_types +=  LLTrans::getString("Notecards"); @@ -550,7 +605,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_OBJECT) && isFilterWith(LLInventoryType::IT_ATTACHMENT)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_OBJECT) && isFilterObjectTypesWith(LLInventoryType::IT_ATTACHMENT))  	{  		//filtered_types += " Objects,";  		filtered_types +=  LLTrans::getString("Objects"); @@ -564,7 +619,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_LSL)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_LSL))  	{  		//filtered_types += " Scripts,";  		filtered_types +=  LLTrans::getString("Scripts"); @@ -578,7 +633,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_SOUND)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_SOUND))  	{  		//filtered_types += " Sounds,";  		filtered_types +=  LLTrans::getString("Sounds"); @@ -592,7 +647,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_TEXTURE)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_TEXTURE))  	{  		//filtered_types += " Textures,";  		filtered_types +=  LLTrans::getString("Textures"); @@ -606,7 +661,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (isFilterWith(LLInventoryType::IT_SNAPSHOT)) +	if (isFilterObjectTypesWith(LLInventoryType::IT_SNAPSHOT))  	{  		//filtered_types += " Snapshots,";  		filtered_types +=  LLTrans::getString("Snapshots"); @@ -649,7 +704,7 @@ const std::string& LLInventoryFilter::getFilterText()  void LLInventoryFilter::toLLSD(LLSD& data) const  { -	data["filter_types"] = (LLSD::Integer)getFilterTypes(); +	data["filter_types"] = (LLSD::Integer)getFilterObjectTypes();  	data["min_date"] = (LLSD::Integer)getMinDate();  	data["max_date"] = (LLSD::Integer)getMaxDate();  	data["hours_ago"] = (LLSD::Integer)getHoursAgo(); @@ -664,7 +719,7 @@ void LLInventoryFilter::fromLLSD(LLSD& data)  {  	if(data.has("filter_types"))  	{ -		setFilterTypes((U32)data["filter_types"].asInteger()); +		setFilterObjectTypes((U32)data["filter_types"].asInteger());  	}  	if(data.has("min_date") && data.has("max_date")) @@ -703,7 +758,7 @@ void LLInventoryFilter::fromLLSD(LLSD& data)  	}  } -U32 LLInventoryFilter::getFilterTypes() const +U32 LLInventoryFilter::getFilterObjectTypes() const  {  	return mFilterOps.mFilterObjectTypes;  } diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 47407eb86c..d65fb8f27c 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -58,10 +58,10 @@ public:  	enum EFilterType  	{ -		FILTERTYPE_NONE, -		FILTERTYPE_ITEM,		// normal default search-by-item-type -		FILTERTYPE_CATEGORY,	// search by folder type -		FILTERTYPE_UUID			// find the object with UUID and any links to it +		FILTERTYPE_NONE = 0, +		FILTERTYPE_OBJECT = 1,		// normal default search-by-object-type +		FILTERTYPE_CATEGORY = 2,	// search by folder type +		FILTERTYPE_UUID	= 4			// find the object with UUID and any links to it  	};  	// REFACTOR: Change this to an enum. @@ -82,10 +82,10 @@ public:  	// +-------------------------------------------------------------------+  	// + Parameters  	// +-------------------------------------------------------------------+ -	void 				setFilterTypes(U64 types, EFilterType filter_type = FILTERTYPE_ITEM); -	U32 				getFilterTypes() const; -	BOOL 				isFilterWith(LLInventoryType::EType t) const; - +	void 				setFilterObjectTypes(U64 types); +	U32 				getFilterObjectTypes() const; +	BOOL 				isFilterObjectTypesWith(LLInventoryType::EType t) const; +	void 				setFilterCategoryTypes(U64 types);  	void 				setFilterUUID(const LLUUID &object_id);  	void 				setFilterSubString(const std::string& string); @@ -153,9 +153,10 @@ private:  	struct FilterOps  	{  		FilterOps(); -		EFilterType 	mFilterType; +		U32 			mFilterTypes; -		U64				mFilterObjectTypes; // For _ITEM or _CATEGORY +		U64				mFilterObjectTypes; // For _ITEM +		U64				mFilterCategoryTypes; // For _ITEM  		LLUUID      	mFilterUUID; // for UUID  		time_t			mMinDate; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 932c72f4cb..54f528de8d 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -209,8 +209,11 @@ LLInventoryFilter* LLInventoryPanel::getFilter()  void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)  { -	getFilter()->setFilterTypes(types, filter_type); -}	 +	if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT) +		getFilter()->setFilterObjectTypes(types); +	if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY) +		getFilter()->setFilterCategoryTypes(types); +}  void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)  { diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 56f7b39480..cbbd433c1d 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -126,8 +126,8 @@ public:  	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); }  	void clearSelection();  	LLInventoryFilter* getFilter(); -	void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_ITEM); -	U32 getFilterTypes() const { return mFolders->getFilterTypes(); } +	void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT); +	U32 getFilterObjectTypes() const { return mFolders->getFilterObjectTypes(); }  	void setFilterPermMask(PermissionMask filter_perm_mask);  	U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); }  	void setFilterSubString(const std::string& string); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 3fd83bd784..1f7e0c3a95 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -653,7 +653,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()  		return;  	// Get data needed for filter display -	U32 filter_types = mFilter->getFilterTypes(); +	U32 filter_types = mFilter->getFilterObjectTypes();  	std::string filter_string = mFilter->getFilterSubString();  	LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();  	U32 hours = mFilter->getHoursAgo(); @@ -973,9 +973,13 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		{  			return;  		} -  		const LLUUID& item_id = current_item->getListener()->getUUID(); -		mActivePanel->getFilter()->setFilterUUID(item_id); +		const std::string &item_name = current_item->getListener()->getName(); +		LLInventoryFilter *filter = mActivePanel->getFilter(); +		filter->setFilterSubString(item_name); +		mFilterEditor->setText(item_name); +		filter->setFilterUUID(item_id); +		filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);  	}  } | 
