From 339e1d200f7fd5f8be715722369295220da2079b Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@lindenlab.com>
Date: Wed, 17 Aug 2022 13:49:10 -0700
Subject: SL-17699 Add upport for materials to texture picker: restore the
 asset filtered inventory panel and pull in @Caladbolg's fix to make it work
 with more than 1 asset type from here
 https://bitbucket.org/lindenlab/viewer/commits/0ab6dfa12eb04238d82c7a4aea7390cbd28beacd

---
 indra/newview/llinventorypanel.cpp                 | 62 +++++++++++++++++++---
 indra/newview/llinventorypanel.h                   |  7 +--
 indra/newview/llplacesinventorypanel.h             |  2 +-
 .../default/xui/en/floater_my_environments.xml     |  2 +-
 .../default/xui/en/floater_settings_picker.xml     |  2 +-
 .../skins/default/xui/en/floater_texture_ctrl.xml  |  6 +--
 6 files changed, 64 insertions(+), 17 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 6b102c7500..cd24b3ea43 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -2010,7 +2010,43 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
 
 void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
 {
-    mAssetType = LLAssetType::lookup(p.filter_asset_type.getValue());
+    // Init asset types
+    std::string types = p.filter_asset_types.getValue();
+
+    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+    boost::char_separator<char> sep("|");
+    tokenizer tokens(types, sep);
+    tokenizer::iterator token_iter = tokens.begin();
+
+    memset(mAssetTypes, 0, LLAssetType::AT_COUNT * sizeof(bool));
+    while (token_iter != tokens.end())
+    {
+        const std::string& token_str = *token_iter;
+        LLAssetType::EType asset_type = LLAssetType::lookup(token_str);
+        if (asset_type > LLAssetType::AT_NONE && asset_type < LLAssetType::AT_COUNT)
+        {
+            mAssetTypes[asset_type] = true;
+        }
+        ++token_iter;
+    }
+
+    // Init drag types
+    memset(mDragTypes, 0, EDragAndDropType::DAD_COUNT * sizeof(bool));
+    for (S32 i = 0; i < LLAssetType::AT_COUNT; i++)
+    {
+        if (mAssetTypes[i])
+        {
+            EDragAndDropType drag_type = LLViewerAssetType::lookupDragAndDropType((LLAssetType::EType)i);
+            if (drag_type != DAD_NONE)
+            {
+                mDragTypes[drag_type] = true;
+            }
+        }
+    }
+    // Always show AT_CATEGORY, but it shouldn't get into mDragTypes
+    mAssetTypes[LLAssetType::AT_CATEGORY] = true;
+
+    // Init the panel
     LLInventoryPanel::initFromParams(p);
     U64 filter_cats = getFilter().getFilterCategoryTypes();
     filter_cats &= ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS);
@@ -2028,10 +2064,9 @@ BOOL LLAssetFilteredInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, B
 
     if (mAcceptsDragAndDrop)
     {
-        EDragAndDropType allow_type = LLViewerAssetType::lookupDragAndDropType(mAssetType);
         // Don't allow DAD_CATEGORY here since it can contain other items besides required assets
         // We should see everything we drop!
-        if (allow_type == cargo_type)
+        if (mDragTypes[cargo_type])
         {
             result = LLInventoryPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
         }
@@ -2047,8 +2082,14 @@ bool LLAssetFilteredInventoryPanel::typedViewsFilter(const LLUUID& id, LLInvento
     {
         return false;
     }
+    LLAssetType::EType asset_type = objectp->getType();
 
-    if (objectp->getType() != mAssetType && objectp->getType() != LLAssetType::AT_CATEGORY)
+    if (asset_type < 0 || asset_type >= LLAssetType::AT_COUNT)
+    {
+        return false;
+    }
+
+    if (!mAssetTypes[asset_type])
     {
         return false;
     }
@@ -2064,11 +2105,16 @@ void LLAssetFilteredInventoryPanel::itemChanged(const LLUUID& id, U32 mask, cons
         return;
     }
 
-    if (model_item
-        && model_item->getType() != mAssetType
-        && model_item->getType() != LLAssetType::AT_CATEGORY)
+    if (model_item)
     {
-        return;
+        LLAssetType::EType asset_type = model_item->getType();
+
+        if (asset_type < 0
+            || asset_type >= LLAssetType::AT_COUNT
+            || !mAssetTypes[asset_type])
+        {
+            return;
+        }
     }
 
     LLInventoryPanel::itemChanged(id, mask, model_item);
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 552c61b915..d5219a22e7 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -393,9 +393,9 @@ public:
     struct Params
         : public LLInitParam::Block<Params, LLInventoryPanel::Params>
     {
-        Mandatory<std::string>	filter_asset_type;
+        Mandatory<std::string>	filter_asset_types;
 
-        Params() : filter_asset_type("filter_asset_type") {}
+        Params() : filter_asset_types("filter_asset_types") {}
     };
 
     void initFromParams(const Params& p);
@@ -416,7 +416,8 @@ protected:
     /*virtual*/ void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
 
 private:
-    LLAssetType::EType mAssetType;
+    bool mAssetTypes[LLAssetType::AT_COUNT];
+    bool mDragTypes[EDragAndDropType::DAD_COUNT];
 };
 
 #endif // LL_LLINVENTORYPANEL_H
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 5629438415..3c27964ec5 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -40,7 +40,7 @@ public:
 	{
 		Params()
 		{
-           filter_asset_type = "landmark";
+           filter_asset_types = "landmark";
        }
 	};
 
diff --git a/indra/newview/skins/default/xui/en/floater_my_environments.xml b/indra/newview/skins/default/xui/en/floater_my_environments.xml
index 6aff387dcb..db81c8bba2 100644
--- a/indra/newview/skins/default/xui/en/floater_my_environments.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_environments.xml
@@ -119,7 +119,7 @@
                        follows="all"
                        layout="topleft"
                        name="pnl_settings"
-                       filter_asset_type="settings"/>
+                       filter_asset_types="settings"/>
             </panel>
         </layout_panel>
         <layout_panel
diff --git a/indra/newview/skins/default/xui/en/floater_settings_picker.xml b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
index 3a26c3b547..8931269fe7 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
@@ -89,7 +89,7 @@
                     top="1"
                     right="-4"
                     bottom="-1"
-                    filter_asset_type="settings" />
+                    filter_asset_types="settings" />
             </panel>
         </layout_panel>
         <layout_panel name="pnl_combo"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 7d23034a09..5ab31b404e 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -169,8 +169,8 @@
      name="inventory search editor"
      top="48"
      width="231" />
-    <inventory_panel
-     allow_multi_select="false"
+  <asset_filtered_inv_panel
+   allow_multi_select="false"
      bg_visible="true"
      bg_alpha_color="DkGray2"
      border="false"
@@ -181,7 +181,7 @@
      name="inventory panel"
      top_pad="4"
      width="231"
-     filter_asset_type="texture"/>
+     filter_asset_types="texture|material"/>
      <check_box
      height="14"
      initial_value="false"
-- 
cgit v1.2.3