Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#3302 fix crash on changing filter string when content is loading or there is no object selected #3310

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions indra/llui/llfolderview.h
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,7 @@ class LLSaveFolderState : public LLFolderViewFunctor
virtual void doItem(LLFolderViewItem* item) {}
void setApply(bool apply);
void clearOpenFolders() { mOpenFolders.clear(); }
bool hasOpenFolders() { return !mOpenFolders.empty(); }
protected:
std::set<LLUUID> mOpenFolders;
bool mApply;
Expand Down
55 changes: 35 additions & 20 deletions indra/newview/llpanelcontents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,32 +139,47 @@ void LLPanelContents::getState(LLViewerObject *objectp )
void LLPanelContents::onFilterEdit()
{
const std::string& filter_substring = mFilterEditor->getText();
if (filter_substring.empty())
if (!mPanelInventoryObject->hasInventory())
{
if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
{
// The current filter and the new filter are empty, nothing to do
return;
}

mSavedFolderState.setApply(true);
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);

// Add a folder with the current item to the list of previously opened folders
LLOpenFoldersWithSelection opener;
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(opener);
mPanelInventoryObject->getRootFolder()->scrollToShowSelection();
mDirtyFilter = true;
}
else if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
else
{
// The first letter in search term, save existing folder open state
if (!mPanelInventoryObject->getFilter().isNotDefault())
if (filter_substring.empty())
{
mSavedFolderState.setApply(false);
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
{
// The current filter and the new filter are empty, nothing to do
return;
}

if (mDirtyFilter && !mSavedFolderState.hasOpenFolders())
{
mPanelInventoryObject->getRootFolder()->setOpenArrangeRecursively(true, LLFolderViewFolder::ERecurseType::RECURSE_DOWN);
}
else
{
mSavedFolderState.setApply(true);
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
}
mDirtyFilter = false;

// Add a folder with the current item to the list of previously opened folders
LLOpenFoldersWithSelection opener;
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(opener);
mPanelInventoryObject->getRootFolder()->scrollToShowSelection();
}
else if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
{
// The first letter in search term, save existing folder open state
if (!mPanelInventoryObject->getFilter().isNotDefault())
{
mSavedFolderState.setApply(false);
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
mDirtyFilter = false;
}
}
}

mPanelInventoryObject->getFilter().setFilterSubString(filter_substring);
}

Expand Down
2 changes: 2 additions & 0 deletions indra/newview/llpanelcontents.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ class LLPanelContents : public LLPanel
void getState(LLViewerObject *object);
void onFilterEdit();

bool mDirtyFilter { false };

public:
class LLFilterEditor* mFilterEditor;
LLSaveFolderState mSavedFolderState;
Expand Down
2 changes: 2 additions & 0 deletions indra/newview/llpanelobjectinventory.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener

static void idle(void* user_data);

bool hasInventory(){ return mHaveInventory; };

protected:
void reset();
/*virtual*/ void inventoryChanged(LLViewerObject* object,
Expand Down
Loading