SL-19521 Inventory filters floater should affect Inventory Gallery

meow-7.2.2
Maxim Nikolenko 2023-04-03 21:34:37 +03:00
parent 6306b1fa6e
commit bc285ed41e
4 changed files with 203 additions and 60 deletions

View File

@ -84,12 +84,14 @@ LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p)
mRowPanWidthFactor(p.row_panel_width_factor),
mGalleryWidthFactor(p.gallery_width_factor),
mIsInitialized(false),
mSearchType(LLInventoryFilter::SEARCHTYPE_NAME),
mSearchLinks(true)
mSearchType(LLInventoryFilter::SEARCHTYPE_NAME)
{
updateGalleryWidth();
mFilter = new LLInventoryFilter();
mCategoriesObserver = new LLInventoryCategoriesObserver();
mUsername = gAgentUsername;
LLStringUtil::toUpper(mUsername);
}
LLInventoryGallery::Params::Params()
@ -124,6 +126,7 @@ BOOL LLInventoryGallery::postBuild()
LLInventoryGallery::~LLInventoryGallery()
{
delete mInventoryGalleryMenu;
delete mFilter;
while (!mUnusedRowPanels.empty())
{
@ -254,20 +257,26 @@ void LLInventoryGallery::draw()
LLPanel::draw();
if (mGalleryCreated)
{
updateRowsIfNeeded();
if(!updateRowsIfNeeded() && mFilter->isModified())
{
reArrangeRows();
}
}
}
void LLInventoryGallery::updateRowsIfNeeded()
bool LLInventoryGallery::updateRowsIfNeeded()
{
if(((getRect().getWidth() - mRowPanelWidth) > mItemWidth) && mRowCount > 1)
{
reArrangeRows(1);
return true;
}
else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN)
{
reArrangeRows(-1);
return true;
}
return false;
}
bool compareGalleryItem(LLInventoryGalleryItem* item1, LLInventoryGalleryItem* item2)
@ -312,6 +321,7 @@ void LLInventoryGallery::reArrangeRows(S32 row_diff)
applyFilter(*it, mFilterSubString);
addToGallery(*it);
}
mFilter->clearModified();
updateMessageVisibility();
}
@ -558,20 +568,50 @@ void LLInventoryGallery::moveRowPanel(LLPanel* stack, int left, int bottom)
void LLInventoryGallery::setFilterSubString(const std::string& string)
{
mFilterSubString = string;
reArrangeRows();
mFilter->setFilterSubString(string);
//reArrangeRows();
}
void LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring)
{
if (!item) return;
std::string desc;
if(!mSearchLinks && item->isLink())
if (item->isFolder() && (mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS))
{
item->setHidden(false);
return;
}
if(item->isLink() && ((mFilter->getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) == 0) && !filter_substring.empty())
{
item->setHidden(true);
return;
}
bool hidden = false;
if(mFilter->getFilterCreatorType() == LLInventoryFilter::FILTERCREATOR_SELF)
{
hidden = (item->getCreatorName() == mUsername) || item->isFolder();
}
else if(mFilter->getFilterCreatorType() == LLInventoryFilter::FILTERCREATOR_OTHERS)
{
hidden = (item->getCreatorName() != mUsername) || item->isFolder();
}
if(hidden)
{
item->setHidden(true);
return;
}
if(!checkAgainstFilterType(item->getUUID()))
{
item->setHidden(true);
return;
}
std::string desc;
switch(mSearchType)
{
case LLInventoryFilter::SEARCHTYPE_CREATOR:
@ -594,7 +634,7 @@ void LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::st
std::string cur_filter = filter_substring;
LLStringUtil::toUpper(cur_filter);
bool hidden = (std::string::npos == desc.find(cur_filter));
hidden = (std::string::npos == desc.find(cur_filter));
item->setHidden(hidden);
}
@ -610,15 +650,6 @@ void LLInventoryGallery::setSearchType(LLInventoryFilter::ESearchType type)
}
}
void LLInventoryGallery::toggleSearchLinks()
{
mSearchLinks = !mSearchLinks;
if(!mFilterSubString.empty())
{
reArrangeRows();
}
}
void LLInventoryGallery::getCurrentCategories(uuid_vec_t& vcur)
{
for (gallery_item_map_t::const_iterator iter = mItemMap.begin();
@ -777,7 +808,13 @@ void LLInventoryGallery::onChangeItemSelection(const LLUUID& category_id)
void LLInventoryGallery::updateMessageVisibility()
{
mMessageTextBox->setVisible(mItems.empty());
if(mItems.empty())
{
mMessageTextBox->setText(hasDescendents(mFolderID) ? LLTrans::getString("InventorySingleFolderEmpty") : LLTrans::getString("InventorySingleFolderNoMatches"));
}
mScrollPanel->setVisible(!mItems.empty());
}
@ -1001,6 +1038,87 @@ BOOL LLInventoryGallery::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return handled;
}
bool LLInventoryGallery::hasDescendents(const LLUUID& cat_id)
{
LLInventoryModel::cat_array_t* cats;
LLInventoryModel::item_array_t* items;
gInventory.getDirectDescendentsOf(cat_id, cats, items);
return (cats->empty() && items->empty());
}
bool LLInventoryGallery::checkAgainstFilterType(const LLUUID& object_id)
{
const LLInventoryObject *object = gInventory.getObject(object_id);
if(!object) return false;
LLInventoryType::EType object_type = LLInventoryType::IT_CATEGORY;
LLInventoryItem* inv_item = gInventory.getItem(object_id);
if (inv_item)
{
object_type = inv_item->getInventoryType();
}
const U32 filterTypes = mFilter->getFilterTypes();
if ((filterTypes & LLInventoryFilter::FILTERTYPE_OBJECT) && inv_item)
{
switch (object_type)
{
case LLInventoryType::IT_NONE:
// If it has no type, pass it, unless it's a link.
if (object && object->getIsLinkType())
{
return false;
}
break;
case LLInventoryType::IT_UNKNOWN:
{
// Unknows are only shown when we show every type.
// Unknows are 255 and won't fit in 64 bits.
if (mFilter->getFilterObjectTypes() != 0xffffffffffffffffULL)
{
return false;
}
break;
}
default:
if ((1LL << object_type & mFilter->getFilterObjectTypes()) == U64(0))
{
return false;
}
break;
}
}
if (filterTypes & LLInventoryFilter::FILTERTYPE_DATE)
{
const U16 HOURS_TO_SECONDS = 3600;
time_t earliest = time_corrected() - mFilter->getHoursAgo() * HOURS_TO_SECONDS;
if (mFilter->getMinDate() > time_min() && mFilter->getMinDate() < earliest)
{
earliest = mFilter->getMinDate();
}
else if (!mFilter->getHoursAgo())
{
earliest = 0;
}
if (LLInventoryFilter::FILTERDATEDIRECTION_NEWER == mFilter->getDateSearchDirection() || mFilter->isSinceLogoff())
{
if (object->getCreationDate() < earliest ||
object->getCreationDate() > mFilter->getMaxDate())
return false;
}
else
{
if (object->getCreationDate() > earliest ||
object->getCreationDate() > mFilter->getMaxDate())
return false;
}
}
return true;
}
//-----------------------------
// LLInventoryGalleryItem
//-----------------------------

View File

@ -75,6 +75,8 @@ public:
void setFilterSubString(const std::string& string);
std::string getFilterSubString() { return mFilterSubString; }
LLInventoryFilter& getFilter() const { return *mFilter; }
bool checkAgainstFilterType(const LLUUID& object_id);
void getCurrentCategories(uuid_vec_t& vcur);
void updateAddedItem(LLUUID item_id);
@ -114,8 +116,8 @@ public:
void setSearchType(LLInventoryFilter::ESearchType type);
LLInventoryFilter::ESearchType getSearchType() { return mSearchType; }
void toggleSearchLinks();
bool getSearchLinks(){ return mSearchLinks; }
bool hasDescendents(const LLUUID& cat_id);
protected:
@ -146,7 +148,7 @@ private:
LLPanel* addToRow(LLPanel* row_stack, LLInventoryGalleryItem* item, int pos, int hgap);
void removeFromLastRow(LLInventoryGalleryItem* item);
void reArrangeRows(S32 row_diff = 0);
void updateRowsIfNeeded();
bool updateRowsIfNeeded();
void updateGalleryWidth();
LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, bool is_link, bool is_worn);
@ -186,6 +188,7 @@ private:
LLInventoryGalleryContextMenu* mInventoryGalleryMenu;
std::string mFilterSubString;
LLInventoryFilter* mFilter;
typedef std::map<LLUUID, LLInventoryGalleryItem*> gallery_item_map_t;
gallery_item_map_t mItemMap;
@ -193,7 +196,7 @@ private:
std::map<LLInventoryGalleryItem*, S32> mItemIndexMap;
LLInventoryFilter::ESearchType mSearchType;
bool mSearchLinks;
std::string mUsername;
};
class LLInventoryGalleryItem : public LLPanel

View File

@ -506,7 +506,7 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)
void LLPanelMainInventory::resetFilters()
{
LLFloaterInventoryFinder *finder = getFinder();
getActivePanel()->getFilter().resetDefault();
getCurrentFilter().resetDefault();
if (finder)
{
finder->updateElementsFromFilter();
@ -802,7 +802,7 @@ void LLPanelMainInventory::onFilterSelected()
}
updateSearchTypeCombo();
setFilterSubString(mFilterSubString);
LLInventoryFilter& filter = mActivePanel->getFilter();
LLInventoryFilter& filter = getCurrentFilter();
LLFloaterInventoryFinder *finder = getFinder();
if (finder)
{
@ -956,7 +956,7 @@ void LLPanelMainInventory::onFocusReceived()
void LLPanelMainInventory::setFilterTextFromFilter()
{
mFilterText = mActivePanel->getFilter().getFilterText();
mFilterText = getCurrentFilter().getFilterText();
}
void LLPanelMainInventory::toggleFindOptions()
@ -1210,10 +1210,21 @@ void LLFloaterInventoryFinder::draw()
filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
}
// update the panel, panel will update the filter
mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
mPanelMainInventory->getPanel()->setFilterTypes(filter);
bool is_gallery = mPanelMainInventory->isSingleFolderMode() && mPanelMainInventory->isGalleryViewMode();
if(is_gallery)
{
mPanelMainInventory->mInventoryGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
mPanelMainInventory->mInventoryGalleryPanel->getFilter().setFilterObjectTypes(filter);
}
else
{
// update the panel, panel will update the filter
mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
mPanelMainInventory->getPanel()->setFilterTypes(filter);
}
if (getCheckSinceLogoff())
{
@ -1235,10 +1246,20 @@ void LLFloaterInventoryFinder::draw()
}
hours += days * 24;
mPanelMainInventory->getPanel()->setHoursAgo(hours);
mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
mPanelMainInventory->setFilterTextFromFilter();
mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
if(is_gallery)
{
mPanelMainInventory->mInventoryGalleryPanel->getFilter().setHoursAgo(hours);
mPanelMainInventory->mInventoryGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
mPanelMainInventory->mInventoryGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
}
else
{
mPanelMainInventory->getPanel()->setHoursAgo(hours);
mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
}
LLPanel::draw();
}
@ -1250,15 +1271,15 @@ void LLFloaterInventoryFinder::onCreatorSelfFilterCommit()
if(show_creator_self && show_creator_other)
{
mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
}
else if(show_creator_self)
{
mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
}
else if(!show_creator_self || !show_creator_other)
{
mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
mCreatorOthers->set(TRUE);
}
}
@ -1270,15 +1291,15 @@ void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
if(show_creator_self && show_creator_other)
{
mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
}
else if(show_creator_other)
{
mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
}
else if(!show_creator_other || !show_creator_self)
{
mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
mCreatorSelf->set(TRUE);
}
}
@ -1763,29 +1784,22 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
if (command_name == "toggle_search_outfits")
{
mActivePanel->getFilter().toggleSearchVisibilityOutfits();
getCurrentFilter().toggleSearchVisibilityOutfits();
}
if (command_name == "toggle_search_trash")
{
mActivePanel->getFilter().toggleSearchVisibilityTrash();
getCurrentFilter().toggleSearchVisibilityTrash();
}
if (command_name == "toggle_search_library")
{
mActivePanel->getFilter().toggleSearchVisibilityLibrary();
getCurrentFilter().toggleSearchVisibilityLibrary();
}
if (command_name == "include_links")
{
if(mSingleFolderMode && isGalleryViewMode())
{
mInventoryGalleryPanel->toggleSearchLinks();
}
else
{
mActivePanel->getFilter().toggleSearchVisibilityLinks();
}
getCurrentFilter().toggleSearchVisibilityLinks();
}
if (command_name == "share")
@ -2000,29 +2014,22 @@ BOOL LLPanelMainInventory::isActionChecked(const LLSD& userdata)
if (command_name == "toggle_search_outfits")
{
return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_OUTFITS) != 0;
return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_OUTFITS) != 0;
}
if (command_name == "toggle_search_trash")
{
return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0;
return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0;
}
if (command_name == "toggle_search_library")
{
return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0;
return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0;
}
if (command_name == "include_links")
{
if(mSingleFolderMode && isGalleryViewMode())
{
return mInventoryGalleryPanel->getSearchLinks();
}
else
{
return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;
}
return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;
}
if (command_name == "list_view")
@ -2135,6 +2142,7 @@ void LLPanelMainInventory::setViewMode(EViewModeType mode)
}
updateNavButtons();
onFilterSelected();
if((isListViewMode() && (mActivePanel->getFilterSubString() != mFilterSubString)) ||
(isGalleryViewMode() && (mInventoryGalleryPanel->getFilterSubString() != mFilterSubString)))
{
@ -2160,5 +2168,17 @@ LLUUID LLPanelMainInventory::getCurrentSFVRoot()
}
return LLUUID::null;
}
LLInventoryFilter& LLPanelMainInventory::getCurrentFilter()
{
if(mSingleFolderMode && isGalleryViewMode())
{
return mInventoryGalleryPanel->getFilter();
}
else
{
return mActivePanel->getFilter();
}
}
// List Commands //
////////////////////////////////////////////////////////////////////////////////

View File

@ -127,6 +127,8 @@ public:
LLUUID getCurrentSFVRoot();
std::string getLocalizedRootName();
LLInventoryFilter& getCurrentFilter();
protected:
//
// Misc functions