Skip to content

Commit c88a7d1

Browse files
#3302 fix crash on changing filter string when content is loading or there is no object selected
1 parent 8ed31a7 commit c88a7d1

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

indra/llui/llfolderview.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ class LLSaveFolderState : public LLFolderViewFunctor
414414
virtual void doItem(LLFolderViewItem* item) {}
415415
void setApply(bool apply);
416416
void clearOpenFolders() { mOpenFolders.clear(); }
417+
bool hasOpenFolders() { return !mOpenFolders.empty(); }
417418
protected:
418419
std::set<LLUUID> mOpenFolders;
419420
bool mApply;

indra/newview/llpanelcontents.cpp

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -139,32 +139,47 @@ void LLPanelContents::getState(LLViewerObject *objectp )
139139
void LLPanelContents::onFilterEdit()
140140
{
141141
const std::string& filter_substring = mFilterEditor->getText();
142-
if (filter_substring.empty())
142+
if (!mPanelInventoryObject->hasInventory())
143143
{
144-
if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
145-
{
146-
// The current filter and the new filter are empty, nothing to do
147-
return;
148-
}
149-
150-
mSavedFolderState.setApply(true);
151-
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
152-
153-
// Add a folder with the current item to the list of previously opened folders
154-
LLOpenFoldersWithSelection opener;
155-
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(opener);
156-
mPanelInventoryObject->getRootFolder()->scrollToShowSelection();
144+
mDirtyFilter = true;
157145
}
158-
else if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
146+
else
159147
{
160-
// The first letter in search term, save existing folder open state
161-
if (!mPanelInventoryObject->getFilter().isNotDefault())
148+
if (filter_substring.empty())
162149
{
163-
mSavedFolderState.setApply(false);
164-
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
150+
if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
151+
{
152+
// The current filter and the new filter are empty, nothing to do
153+
return;
154+
}
155+
156+
if (mDirtyFilter && !mSavedFolderState.hasOpenFolders())
157+
{
158+
mPanelInventoryObject->getRootFolder()->setOpenArrangeRecursively(true, LLFolderViewFolder::ERecurseType::RECURSE_DOWN);
159+
}
160+
else
161+
{
162+
mSavedFolderState.setApply(true);
163+
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
164+
}
165+
mDirtyFilter = false;
166+
167+
// Add a folder with the current item to the list of previously opened folders
168+
LLOpenFoldersWithSelection opener;
169+
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(opener);
170+
mPanelInventoryObject->getRootFolder()->scrollToShowSelection();
171+
}
172+
else if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
173+
{
174+
// The first letter in search term, save existing folder open state
175+
if (!mPanelInventoryObject->getFilter().isNotDefault())
176+
{
177+
mSavedFolderState.setApply(false);
178+
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
179+
mDirtyFilter = false;
180+
}
165181
}
166182
}
167-
168183
mPanelInventoryObject->getFilter().setFilterSubString(filter_substring);
169184
}
170185

indra/newview/llpanelcontents.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class LLPanelContents : public LLPanel
7070
void getState(LLViewerObject *object);
7171
void onFilterEdit();
7272

73+
bool mDirtyFilter { false };
74+
7375
public:
7476
class LLFilterEditor* mFilterEditor;
7577
LLSaveFolderState mSavedFolderState;

indra/newview/llpanelobjectinventory.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
8585

8686
static void idle(void* user_data);
8787

88+
bool hasInventory(){ return mHaveInventory; };
89+
8890
protected:
8991
void reset();
9092
/*virtual*/ void inventoryChanged(LLViewerObject* object,

0 commit comments

Comments
 (0)