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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs