From 27842d0c5f34b03f6ce16ebbff0e7cb39d3a4fd8 Mon Sep 17 00:00:00 2001
From: Cosmic Linden <cosmic@lindenlab.com>
Date: Mon, 31 Jul 2023 16:30:50 -0700
Subject: [PATCH] SL-20024: Fix material edit/save buttons on build floater
 sometimes not re-enabling after object inventory load

---
 indra/newview/llpanelface.cpp | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 90271b75b22..790c693a3d9 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1841,6 +1841,7 @@ class PBRPickerItemListener : public LLVOInventoryListener
 {
 protected:
     LLViewerObject* mObjectp;
+    bool mChangePending = true;
 public:
 
     PBRPickerItemListener(LLViewerObject* object)
@@ -1849,7 +1850,10 @@ class PBRPickerItemListener : public LLVOInventoryListener
         registerVOInventoryListener(mObjectp, nullptr);
     }
 
-    const LLViewerObject* const getObject() { return mObjectp; }
+    const bool isListeningFor(const LLViewerObject* objectp) const
+    {
+        return mChangePending && (objectp == mObjectp);
+    }
 
     void inventoryChanged(LLViewerObject* object,
         LLInventoryObject::object_list_t* inventory,
@@ -1861,11 +1865,13 @@ class PBRPickerItemListener : public LLVOInventoryListener
             gFloaterTools->dirty();
         }
         removeVOInventoryListener();
+        mChangePending = false;
     }
 
     ~PBRPickerItemListener()
     {
         removeVOInventoryListener();
+        mChangePending = false;
     }
 };
 
@@ -1893,12 +1899,16 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
 
     const bool inventory_pending = objectp->isInventoryPending();
     getChildView("pbr_from_inventory")->setEnabled(settable);
+    // TODO: Put message on these two buttons when material permissions are still loading
     getChildView("edit_selected_pbr")->setEnabled(editable && !inventory_pending && !has_faces_without_pbr);
     getChildView("save_selected_pbr")->setEnabled(saveable && !inventory_pending && identical_pbr);
-    // TODO: Vet inventory updates and memory management
-    if (inventory_pending && (!mInventoryListener || mInventoryListener->getObject() != objectp))
+    if (inventory_pending)
     {
-        mInventoryListener = std::make_unique<PBRPickerItemListener>(objectp);
+        // Reuse the same listener when possible
+        if (!mInventoryListener || !mInventoryListener->isListeningFor(objectp))
+        {
+            mInventoryListener = std::make_unique<PBRPickerItemListener>(objectp);
+        }
     }
     else
     {
-- 
GitLab