From 13ab6a408b1f42de278edf8a2517b9ed3dc6c66d Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Mon, 16 Oct 2023 22:32:22 +0300
Subject: SL-20232 Fix gallery not checking descendants

---
 indra/newview/llinventorygallerymenu.cpp | 44 +++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp
index d4cf9c2f9f..49969e1a52 100644
--- a/indra/newview/llinventorygallerymenu.cpp
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -388,6 +388,44 @@ bool is_inbox_folder(LLUUID item_id)
     return gInventory.isObjectDescendentOf(item_id, inbox_id);
 }
 
+bool is_category_removable(const LLUUID &folder_id, bool check_worn)
+{
+    if (!get_is_category_removable(&gInventory, folder_id))
+    {
+        return false;
+    }
+
+    // check children
+    LLInventoryModel::cat_array_t* cat_array;
+    LLInventoryModel::item_array_t* item_array;
+    gInventory.getDirectDescendentsOf(folder_id, cat_array, item_array);
+
+    for (LLInventoryModel::item_array_t::value_type& item : *item_array)
+    {
+        if (!get_is_item_removable(&gInventory, item->getUUID(), check_worn))
+        {
+            return false;
+        }
+    }
+
+    for (LLInventoryModel::cat_array_t::value_type& cat : *cat_array)
+    {
+        if (!is_category_removable(cat->getUUID(), check_worn))
+        {
+            return false;
+        }
+    }
+
+    const LLUUID mp_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+    if (mp_id.notNull() && gInventory.isObjectDescendentOf(folder_id, mp_id))
+    {
+        return false;
+    }
+
+    return true;
+}
+
+
 void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* menu)
 {
     LLUUID selected_id = mUUIDs.front();
@@ -495,7 +533,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
             }
         }
         items.push_back(std::string("Purge Item"));
-        if (is_folder && !get_is_category_removable(&gInventory, selected_id))
+        if (is_folder && !is_category_removable(selected_id, true))
         {
             disabled_items.push_back(std::string("Purge Item"));
         }
@@ -542,8 +580,8 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
                 }
                 items.push_back(std::string("Cut"));
                 items.push_back(std::string("Delete"));
-                // TODO: check descendants!!!
-                if(!get_is_category_removable(&gInventory, selected_id))
+
+                if(!is_category_removable(selected_id, true))
                 {
                     disabled_items.push_back(std::string("Delete"));
                     disabled_items.push_back(std::string("Cut"));
-- 
cgit v1.2.3