[Bf-blender-cvs] [56582fbf820] asset-shelf: Get filtering by asset catalog to work

Julian Eisel noreply at git.blender.org
Wed Feb 1 16:26:52 CET 2023


Commit: 56582fbf820a6eccba3b0ba1c641640540a9e7ef
Author: Julian Eisel
Date:   Wed Feb 1 16:26:30 2023 +0100
Branches: asset-shelf
https://developer.blender.org/rB56582fbf820a6eccba3b0ba1c641640540a9e7ef

Get filtering by asset catalog to work

===================================================================

M	source/blender/editors/asset/intern/asset_shelf.cc
M	source/blender/editors/interface/interface_template_asset_shelf.cc
M	source/blender/editors/space_view3d/space_view3d.cc

===================================================================

diff --git a/source/blender/editors/asset/intern/asset_shelf.cc b/source/blender/editors/asset/intern/asset_shelf.cc
index dedbc58f036..8e9f65c4270 100644
--- a/source/blender/editors/asset/intern/asset_shelf.cc
+++ b/source/blender/editors/asset/intern/asset_shelf.cc
@@ -34,18 +34,16 @@
 
 using namespace blender;
 
+static void asset_shelf_send_redraw_notifier(bContext &C)
+{
+  WM_event_add_notifier(&C, NC_SPACE | ND_SPACE_ASSET_SHELF, nullptr);
+}
+
 /* -------------------------------------------------------------------- */
 /** \name Asset Shelf Regions
  * \{ */
 
-void ED_asset_shelf_region_listen(const wmRegionListenerParams *params)
-{
-  if (ED_assetlist_listen(params->notifier)) {
-    ED_region_tag_redraw_no_rebuild(params->region);
-  }
-}
-
-void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
+static void asset_shelf_region_listen(const wmRegionListenerParams *params)
 {
   ARegion *region = params->region;
   const wmNotifier *wmn = params->notifier;
@@ -59,6 +57,22 @@ void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
   }
 }
 
+void ED_asset_shelf_region_listen(const wmRegionListenerParams *params)
+{
+  if (ED_assetlist_listen(params->notifier)) {
+    ED_region_tag_redraw_no_rebuild(params->region);
+  }
+  /* If the asset list didn't catch the notifier, let the region itself listen. */
+  else {
+    asset_shelf_region_listen(params);
+  }
+}
+
+void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
+{
+  asset_shelf_region_listen(params);
+}
+
 void ED_asset_shelf_footer_region_init(wmWindowManager * /*wm*/, ARegion *region)
 {
   ED_region_header_init(region);
@@ -265,7 +279,7 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
     return view_item;
   }
 
-  void update_shelf_settings_from_enabled_catalogs(const bContext *C);
+  void update_shelf_settings_from_enabled_catalogs();
 
   class Item : public ui::BasicTreeViewItem {
     asset_system::AssetCatalogTreeItem catalog_item_;
@@ -294,6 +308,7 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
 
     void build_row(uiLayout &row) override
     {
+      AssetCatalogSelectorTree &tree = dynamic_cast<AssetCatalogSelectorTree &>(get_tree_view());
       uiBlock *block = uiLayoutGetBlock(&row);
 
       uiLayoutSetEmboss(&row, UI_EMBOSS);
@@ -316,29 +331,23 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
                              0,
                              0,
                              TIP_("Toggle catalog visibility in the asset shelf"));
-      UI_but_func_set(
-          but,
-          [](bContext *C, void *selector_tree_ptr, void *) {
-            AssetCatalogSelectorTree &selector_tree = *static_cast<AssetCatalogSelectorTree *>(
-                selector_tree_ptr);
-            selector_tree.update_shelf_settings_from_enabled_catalogs(C);
-          },
-          &dynamic_cast<AssetCatalogSelectorTree &>(get_tree_view()),
-          nullptr);
+      UI_but_func_set(but, [&tree](bContext &C) {
+        tree.update_shelf_settings_from_enabled_catalogs();
+        asset_shelf_send_redraw_notifier(C);
+      });
       UI_but_flag_disable(but, UI_BUT_UNDO);
     }
   };
 };
 
-void AssetCatalogSelectorTree::update_shelf_settings_from_enabled_catalogs(const bContext *C)
+void AssetCatalogSelectorTree::update_shelf_settings_from_enabled_catalogs()
 {
   asset_shelf_settings_clear_enabled_catalogs(shelf_settings_);
-  foreach_item([C, this](ui::AbstractTreeViewItem &view_item) {
+  foreach_item([this](ui::AbstractTreeViewItem &view_item) {
     const auto &selector_tree_item = dynamic_cast<AssetCatalogSelectorTree::Item &>(view_item);
     if (selector_tree_item.is_catalog_path_enabled()) {
       asset_shelf_settings_set_catalog_path_enabled(shelf_settings_,
                                                     selector_tree_item.catalog_path());
-      WM_event_add_notifier(C, NC_SPACE | ND_SPACE_ASSET_SHELF, nullptr);
     }
   });
 }
@@ -420,8 +429,9 @@ static void add_catalog_toggle_buttons(AssetShelfSettings &shelf_settings, uiLay
             "Enable catalog, making contained assets visible in the asset shelf");
 
         UI_but_drawflag_enable(but, UI_BUT_ALIGN_TOP);
-        UI_but_func_set(but, [&shelf_settings, path](bContext &) {
+        UI_but_func_set(but, [&shelf_settings, path](bContext &C) {
           asset_shelf_settings_set_active_catalog(shelf_settings, path);
+          asset_shelf_send_redraw_notifier(C);
         });
         UI_but_func_pushed_state_set(but, [&shelf_settings, path](const uiBut &) -> bool {
           return asset_shelf_settings_is_active_catalog(shelf_settings, path);
diff --git a/source/blender/editors/interface/interface_template_asset_shelf.cc b/source/blender/editors/interface/interface_template_asset_shelf.cc
index 26676a9d8e3..abab93c3612 100644
--- a/source/blender/editors/interface/interface_template_asset_shelf.cc
+++ b/source/blender/editors/interface/interface_template_asset_shelf.cc
@@ -4,8 +4,11 @@
  * \ingroup edinterface
  */
 
+#include "AS_asset_library.hh"
+
 #include "BKE_context.h"
 
+#include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
 #include "ED_asset.h"
@@ -14,6 +17,10 @@
 #include "UI_resources.h"
 #include "interface_intern.hh"
 
+#include "RNA_prototypes.h"
+
+using namespace blender;
+
 /* TODO copy of #asset_view_item_but_drag_set(). */
 static void asset_tile_but_drag_set(uiBut &but, AssetHandle &asset_handle)
 {
@@ -69,14 +76,44 @@ static void asset_tile_draw(uiLayout &layout,
   asset_tile_but_drag_set(*but, asset_handle);
 }
 
+static std::optional<asset_system::AssetCatalogFilter> catalog_filter_from_shelf_settings(
+    const AssetShelfSettings *shelf_settings, const asset_system::AssetLibrary *library)
+{
+  if (!shelf_settings || !shelf_settings->active_catalog_path) {
+    return {};
+  }
+
+  asset_system ::AssetCatalog *active_catalog = library->catalog_service->find_catalog_by_path(
+      shelf_settings->active_catalog_path);
+  if (!active_catalog) {
+    return {};
+  }
+
+  return library->catalog_service->create_catalog_filter(active_catalog->catalog_id);
+}
+
 void uiTemplateAssetShelf(uiLayout *layout,
                           const bContext *C,
                           const AssetFilterSettings *filter_settings)
 {
   const AssetLibraryReference *library_ref = CTX_wm_asset_library_ref(C);
+  const PointerRNA shelf_settings_ptr = CTX_data_pointer_get_type(
+      C, "asset_shelf_settings", &RNA_AssetShelfSettings);
+  const AssetShelfSettings *shelf_settings = static_cast<AssetShelfSettings *>(
+      shelf_settings_ptr.data);
 
   ED_assetlist_storage_fetch(library_ref, C);
   ED_assetlist_ensure_previews_job(library_ref, C);
+
+  const asset_system::AssetLibrary *library = ED_assetlist_library_get_once_available(
+      *library_ref);
+  if (!library) {
+    return;
+  }
+
+  std::optional<asset_system::AssetCatalogFilter> catalog_filter =
+      catalog_filter_from_shelf_settings(shelf_settings, library);
+
   uiLayoutSetScaleX(layout, 1.0f);
   uiLayoutSetScaleY(layout, 1.0f);
 
@@ -94,6 +131,11 @@ void uiTemplateAssetShelf(uiLayout *layout,
       /* Don't do anything else, but return true to continue iterating. */
       return true;
     }
+    /* Filter by active catalog. */
+    const AssetMetaData *asset_data = ED_asset_handle_get_metadata(&asset);
+    if (catalog_filter && !catalog_filter->contains(asset_data->catalog_id)) {
+      return true;
+    }
 
     asset_tile_draw(*row, asset, width, height, show_names);
     return true;
diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc
index 560a83b0d1f..694792b8a04 100644
--- a/source/blender/editors/space_view3d/space_view3d.cc
+++ b/source/blender/editors/space_view3d/space_view3d.cc
@@ -2186,6 +2186,7 @@ void ED_spacetype_view3d()
   art->prefsizey = HEADERY * 3.5f;
   art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_HEADER;
   art->listener = ED_asset_shelf_region_listen;
+  art->context = view3d_asset_shelf_context;
   art->init = view3d_header_region_init;
   art->draw = ED_region_header;
   BLI_addhead(&st->regiontypes, art);



More information about the Bf-blender-cvs mailing list