[Bf-blender-cvs] [622ca567eb9] ui-asset-view-template: Support passing ID type filter to the template

Julian Eisel noreply at git.blender.org
Tue Mar 9 19:03:29 CET 2021


Commit: 622ca567eb9891671a0e2c6513c62f5dcfaa86eb
Author: Julian Eisel
Date:   Tue Mar 9 18:57:16 2021 +0100
Branches: ui-asset-view-template
https://developer.blender.org/rB622ca567eb9891671a0e2c6513c62f5dcfaa86eb

Support passing ID type filter to the template

The ID type filter can be set as follows:
```
template_asset_view(..., filter_id_types={'filter_material', 'filter_object'})
```

I would have prefered if you could just create a
`bpy.types.AssetFilterSettings` object, fill that and pass it to the
template. But that doesn't seem possible right now without more complex
BPY additions.
Also, newer ID types (hair, point cloud, volume and simulation IDs) do
not support filtering, because their filtering flags exceed 32, meaning
we have to store them in 64 bit integers which RNA doesn't support for
enum properties...

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

M	source/blender/editors/asset/asset_list.cc
M	source/blender/editors/include/ED_asset.h
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_template_asset_view.cc
M	source/blender/makesdna/DNA_asset_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/RNA_enum_types.h
M	source/blender/makesrna/intern/rna_ID.c
M	source/blender/makesrna/intern/rna_asset.c
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/makesrna/intern/rna_ui_api.c

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

diff --git a/source/blender/editors/asset/asset_list.cc b/source/blender/editors/asset/asset_list.cc
index 1f60d69e335..821d1577e0c 100644
--- a/source/blender/editors/asset/asset_list.cc
+++ b/source/blender/editors/asset/asset_list.cc
@@ -112,7 +112,7 @@ class AssetList {
   AssetList(const AssetList &) = delete;
   ~AssetList() = default;
 
-  void setup()
+  void setup(const AssetFilterSettings *filter_settings = nullptr)
   {
     FileList *files = filelist_.get();
 
@@ -145,13 +145,17 @@ class AssetList {
     filelist_setrecursion(files, 1);
     filelist_setsorting(files, FILE_SORT_ALPHA, false);
     filelist_setlibrary(files, &file_asset_lib_ref);
+    /* TODO different filtering settings require the list to be reread. That's a no-go for when we
+     * want to allow showing the same asset library with different filter settings (as in,
+     * different ID types). The filelist needs to be made smarter somehow, maybe goes together with
+     * the plan to separate the view (preview caching, filtering, etc. ) from the data. */
     filelist_setfilter_options(
         files,
         true,
         true,
         true, /* Just always hide parent, prefer to not add an extra user option for this. */
         FILE_TYPE_BLENDERLIB,
-        FILTER_ID_ALL,
+        filter_settings ? filter_settings->id_types : FILTER_ID_ALL,
         true,
         "",
         "");
@@ -230,7 +234,9 @@ class AssetListStorage {
   static AssetListMap global_storage_;
 
  public:
-  static void fetch_library(const AssetLibraryReference &library_reference, const bContext &C)
+  static void fetch_library(const AssetLibraryReference &library_reference,
+                            const bContext &C,
+                            const AssetFilterSettings *filter_settings = nullptr)
   {
     std::optional filesel_type = asset_library_reference_to_fileselect_type(library_reference);
     if (!filesel_type) {
@@ -241,7 +247,7 @@ class AssetListStorage {
     AssetList &list = std::get<0>(list_create_info);
     const bool is_new = std::get<1>(list_create_info);
     if (is_new) {
-      list.setup();
+      list.setup(filter_settings);
       list.fetch(C);
     }
   }
@@ -297,9 +303,11 @@ AssetListStorage::AssetListMap AssetListStorage::global_storage_{};
  * Invoke asset list reading, potentially in a parallel job. Won't wait until the job is done,
  * and may return earlier.
  */
-void ED_assetlist_fetch(const AssetLibraryReference *library_reference, const bContext *C)
+void ED_assetlist_fetch(const AssetLibraryReference *library_reference,
+                        const AssetFilterSettings *filter_settings,
+                        const bContext *C)
 {
-  AssetListStorage::fetch_library(*library_reference, *C);
+  AssetListStorage::fetch_library(*library_reference, *C, filter_settings);
 }
 
 void ED_assetlist_ensure_previews_job(const AssetLibraryReference *library_reference, bContext *C)
diff --git a/source/blender/editors/include/ED_asset.h b/source/blender/editors/include/ED_asset.h
index a2b4d829108..29de8fb93e7 100644
--- a/source/blender/editors/include/ED_asset.h
+++ b/source/blender/editors/include/ED_asset.h
@@ -34,7 +34,9 @@ bool ED_asset_can_make_single_from_context(const struct bContext *C);
 int ED_asset_library_reference_to_enum_value(const struct AssetLibraryReference *library);
 AssetLibraryReference ED_asset_library_reference_from_enum_value(int value);
 
-void ED_assetlist_fetch(const struct AssetLibraryReference *library_reference, const bContext *C);
+void ED_assetlist_fetch(const struct AssetLibraryReference *library_reference,
+                        const struct AssetFilterSettings *filter_settings,
+                        const bContext *C);
 void ED_assetlist_ensure_previews_job(const struct AssetLibraryReference *library_reference,
                                       bContext *C);
 void ED_assetlist_storage_exit(void);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index eb924bd5094..c4c4f66d6b2 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -34,6 +34,7 @@ extern "C" {
 /* Struct Declarations */
 
 struct ARegion;
+struct AssetFilterSettings;
 struct AutoComplete;
 struct EnumPropertyItem;
 struct FileSelectParams;
@@ -2232,7 +2233,8 @@ void uiTemplateFileSelectPath(uiLayout *layout,
 void uiTemplateAssetView(struct uiLayout *layout,
                          struct bContext *C,
                          struct PointerRNA *ptr,
-                         const char *asset_library_propname);
+                         const char *asset_library_propname,
+                         const struct AssetFilterSettings *filter_settings);
 
 /* items */
 void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
diff --git a/source/blender/editors/interface/interface_template_asset_view.cc b/source/blender/editors/interface/interface_template_asset_view.cc
index 27b5aeb902e..88c4df94ba7 100644
--- a/source/blender/editors/interface/interface_template_asset_view.cc
+++ b/source/blender/editors/interface/interface_template_asset_view.cc
@@ -149,7 +149,8 @@ static void asset_view_template_list_item_iter_fn(PointerRNA *UNUSED(dataptr),
 void uiTemplateAssetView(uiLayout *layout,
                          bContext *C,
                          PointerRNA *ptr,
-                         const char *asset_library_propname)
+                         const char *asset_library_propname,
+                         const AssetFilterSettings *filter_settings)
 {
   Palette *palette = (Palette *)CTX_data_main(C)->palettes.first;
 
@@ -160,7 +161,7 @@ void uiTemplateAssetView(uiLayout *layout,
 
   AssetLibraryReference asset_library = ED_asset_library_reference_from_enum_value(
       RNA_property_enum_get(ptr, asset_library_prop));
-  ED_assetlist_fetch(&asset_library, C);
+  ED_assetlist_fetch(&asset_library, filter_settings, C);
   ED_assetlist_ensure_previews_job(&asset_library, C);
 
   AssetViewListData iter_data;
diff --git a/source/blender/makesdna/DNA_asset_types.h b/source/blender/makesdna/DNA_asset_types.h
index 5acdc4ee862..e762fa24e0d 100644
--- a/source/blender/makesdna/DNA_asset_types.h
+++ b/source/blender/makesdna/DNA_asset_types.h
@@ -20,6 +20,7 @@
 
 #pragma once
 
+#include "DNA_defs.h"
 #include "DNA_listBase.h"
 
 #ifdef __cplusplus
@@ -36,6 +37,14 @@ typedef struct AssetTag {
   char name[64]; /* MAX_NAME */
 } AssetTag;
 
+typedef struct AssetFilterSettings {
+  /** Tags to match against. These are newly allocated, and compared against the
+   * #AssetMetaData.tags.
+   * TODO not used and doesn't do anything yet. */
+  ListBase tags;     /* AssetTag */
+  uint64_t id_types; /* rna_enum_id_type_filter_items */
+} AssetFilterSettings;
+
 /**
  * \brief The meta-data of an asset.
  * By creating and giving this for a data-block (#ID.asset_data), the data-block becomes an asset.
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 35b49d01a54..0b787ff90d6 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -71,6 +71,7 @@ extern StructRNA RNA_ArrayGpencilModifier;
 extern StructRNA RNA_ArrayModifier;
 extern StructRNA RNA_Attribute;
 extern StructRNA RNA_AttributeGroup;
+extern StructRNA RNA_AssetFilterSettings;
 extern StructRNA RNA_AssetMetaData;
 extern StructRNA RNA_AssetTag;
 extern StructRNA RNA_BackgroundImage;
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 2436b1f50d4..3df12b53876 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -242,6 +242,22 @@ extern const EnumPropertyItem *rna_enum_attribute_domain_itemf(struct ID *id, bo
 
 extern const EnumPropertyItem rna_enum_collection_color_items[];
 
+/**
+ * For ID filters (#FILTER_ID_AC, #FILTER_ID_AR, ...) an int isn't enough. This version allows 64
+ * bit integers. So can't use the regular #EnumPropertyItem. Would be nice if RNA supported this
+ * itself.
+ *
+ * Meant to be used with #RNA_def_property_boolean_sdna() which supports 64 bit flags as well.
+ */
+struct IDFilterEnumPropertyItem {
+  const uint64_t flag;
+  const char *identifier;
+  const int icon;
+  const char *name;
+  const char *description;
+};
+extern const struct IDFilterEnumPropertyItem rna_enum_id_type_filter_items[];
+
 /* API calls */
 int rna_node_tree_type_to_enum(struct bNodeTreeType *typeinfo);
 int rna_node_tree_idname_to_enum(const char *idname);
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 6e2005b7314..d51fcba410a 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -85,6 +85,97 @@ const EnumPropertyItem rna_enum_id_type_items[] = {
     {0, NULL, 0, NULL, NULL},
 };
 
+/**
+ * \note Uses #IDFilterEnumPropertyItem, not EnumPropertyItem to support 64 bit items.
+ */
+const struct IDFilterEnumPropertyItem rna_enum_id_type_filter_items[] = {
+    /* Datablocks */
+    {FILTER_ID_AC, "filter_action", ICON_ANIM_DATA, "Actions", "Show Action data-blocks"},
+    {FILTER_ID_AR,
+     "filter_armature",
+     ICON_ARMATURE_DATA,
+     "Armatures",
+     "Show Armature data-blocks"},
+    {FILTER_ID_BR, "filter_brush", ICON_BRUSH_DATA, "Brushes", "Show Brushes data-blocks"},
+    {FILTER_ID_CA, "filter_camera", ICON_CAMERA_DATA, "Cameras", "Show Camera data-blocks"},
+    {FILTER_ID_CF, "filter_cachefile", ICON_FILE, "Cache Files", "Show Cache File data-blocks"},
+    {FILTER_ID_CU, "filter_curve", ICON_CURVE_DATA, "Curves", "Show Curve data-blocks"},
+    {FILTER_ID_GD,
+     "filter_grease_pencil",
+     ICON_GREASEPENCIL,
+     "Grease Pencil",
+     "Show Grease pencil data-blocks"},
+    {FILTER_ID_GR,
+     "filter_group",
+     ICON_OUTLINER_COLLECTION,
+     "Collections",
+     "Show Collection data-blocks"},
+    {FILTER_ID_HA, "filter_hair", ICON_HAIR_DATA, "Hairs", "Show/hide Hair data-blocks"},
+    {FILTER_ID_IM, "filter_image", ICON_IMAGE_DATA, "Images", "Show Image data-blocks"},
+    {FILTER_ID_LA, "filter_light", ICON_LIGHT_DATA, "Lights", "Show Li

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list