diff options
| author | Maxim Nikolenko <maximnproductengine@lindenlab.com> | 2024-12-19 17:06:34 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-19 17:06:34 +0200 | 
| commit | c88a7d1d274b090f5ca7484a8b1f3ccc36aa1980 (patch) | |
| tree | a689388abef228fcd57d3ebd3af8b7fe92cc5b1b /indra/newview | |
| parent | 8ed31a73d3e92517ffec04ca61c12ec6a2e81742 (diff) | |
#3302 fix crash on changing filter string when content is loading or there is no object selected
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llpanelcontents.cpp | 55 | ||||
| -rw-r--r-- | indra/newview/llpanelcontents.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpanelobjectinventory.h | 2 | 
3 files changed, 39 insertions, 20 deletions
| diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index dbf56c2b6d..2624ef1207 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -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);  } diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index bb6308e8b8..6e02b17bab 100644 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -70,6 +70,8 @@ protected:      void getState(LLViewerObject *object);      void onFilterEdit(); +    bool mDirtyFilter { false }; +  public:      class LLFilterEditor* mFilterEditor;      LLSaveFolderState mSavedFolderState; diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index abb48dbeed..154639e4bb 100644 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -85,6 +85,8 @@ public:      static void idle(void* user_data); +    bool hasInventory(){ return mHaveInventory; }; +  protected:      void reset();      /*virtual*/ void inventoryChanged(LLViewerObject* object, | 
