void LLInventoryFilter::setModified(EFilterBehavior behavior) { mModified = TRUE; mNeedTextRebuild = TRUE; mFilterGeneration = mNextFilterGeneration++; if (mFilterBehavior == FILTER_NONE) { mFilterBehavior = behavior; } else if (mFilterBehavior != behavior) { // trying to do both less restrictive and more restrictive filter // basically means restart from scratch mFilterBehavior = FILTER_RESTART; } if (isNotDefault()) { // if not keeping current filter results, update last valid as well switch(mFilterBehavior) { case FILTER_RESTART: mMustPassGeneration = mFilterGeneration; mMinRequiredGeneration = mFilterGeneration; break; case FILTER_LESS_RESTRICTIVE: mMustPassGeneration = mFilterGeneration; break; case FILTER_MORE_RESTRICTIVE: mMinRequiredGeneration = mFilterGeneration; // must have passed either current filter generation (meaningless, as it hasn't been run yet) // or some older generation, so keep the value mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration); break; default: llerrs << "Bad filter behavior specified" << llendl; } } else { // shortcut disabled filters to show everything immediately mMinRequiredGeneration = 0; mMustPassGeneration = S32_MAX; } }
BOOL LLInventoryFilter::isDefault() const { return !isNotDefault(); }
bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const { // Always check against the clipboard // <FS:Ansariel> FIRE-6714: Don't move objects to trash during cut&paste // Don't hide cut items in inventory //const BOOL passed_clipboard = checkAgainstClipboard(folder_id); const BOOL passed_clipboard = TRUE; // </FS:Ansariel> FIRE-6714: Don't move objects to trash during cut&paste // we're showing all folders, overriding filter if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS) { return passed_clipboard; } // when applying a filter, matching folders get their contents downloaded first if (isNotDefault() && !gInventory.isCategoryComplete(folder_id)) { LLInventoryModelBackgroundFetch::instance().start(folder_id); } // Marketplace folder filtering const U32 filterTypes = mFilterOps.mFilterTypes; const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE | FILTERTYPE_MARKETPLACE_UNASSOCIATED | FILTERTYPE_MARKETPLACE_LISTING_FOLDER | FILTERTYPE_NO_MARKETPLACE_ITEMS; if (filterTypes & marketplace_filter) { S32 depth = depth_nesting_in_marketplace(folder_id); if (filterTypes & FILTERTYPE_NO_MARKETPLACE_ITEMS) { if (depth >= 0) { return false; } } if (filterTypes & FILTERTYPE_MARKETPLACE_LISTING_FOLDER) { if (depth > 1) { return false; } } if (depth > 0) { LLUUID listing_uuid = nested_parent_id(folder_id, depth); if (filterTypes & FILTERTYPE_MARKETPLACE_ACTIVE) { if (!LLMarketplaceData::instance().getActivationState(listing_uuid)) { return false; } } else if (filterTypes & FILTERTYPE_MARKETPLACE_INACTIVE) { if (!LLMarketplaceData::instance().isListed(listing_uuid) || LLMarketplaceData::instance().getActivationState(listing_uuid)) { return false; } } else if (filterTypes & FILTERTYPE_MARKETPLACE_UNASSOCIATED) { if (LLMarketplaceData::instance().isListed(listing_uuid)) { return false; } } } } // show folder links LLViewerInventoryItem* item = gInventory.getItem(folder_id); if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER) { return passed_clipboard; } if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY) { // Can only filter categories for items in your inventory // (e.g. versus in-world object contents). const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id); if (!cat) return folder_id.isNull(); LLFolderType::EType cat_type = cat->getPreferredType(); if (cat_type != LLFolderType::FT_NONE && (1LL << cat_type & mFilterOps.mFilterCategoryTypes) == U64(0)) return false; } return passed_clipboard; }