Asset Browser: Filter options for specific ID types

Adds a filter popup to the header that allows specifiying which data-block
types to show. The menu automatically reflects all supported ID types, so it
shows a checkbox for materials, worlds and actions currently by default, and
all ID types with the "Extended Asset Browser" experimental feature enabled.
This commit is contained in:
Julian Eisel 2021-10-22 23:56:05 +02:00
parent c51eac24fe
commit cfc64261c1
6 changed files with 105 additions and 8 deletions

View File

@ -54,6 +54,12 @@ class FILEBROWSER_HT_header(Header):
layout.prop(params, "filter_search", text="", icon='VIEWZOOM')
layout.popover(
panel="ASSETBROWSER_PT_filter",
text="",
icon='FILTER'
)
layout.operator(
"screen.region_toggle",
text="",
@ -592,6 +598,28 @@ class ASSETBROWSER_PT_display(asset_utils.AssetBrowserPanel, Panel):
col.prop(params, "show_details_datetime", text="Date")
class ASSETBROWSER_PT_filter(asset_utils.AssetBrowserPanel, Panel):
bl_region_type = 'HEADER'
bl_category = "Filter"
bl_label = "Filter"
def draw(self, context):
layout = self.layout
space = context.space_data
params = space.params
use_extended_browser = context.preferences.experimental.use_extended_asset_browser
if params.use_filter_blendid:
col = layout.column(align=True)
filter_id = params.filter_asset_id
for identifier in dir(filter_id):
if identifier.startswith("filter_") or (identifier.startswith("experimental_filter_") and use_extended_browser):
row = col.row()
row.label(icon=filter_id.bl_rna.properties[identifier].icon)
row.prop(filter_id, identifier, toggle=False)
class AssetBrowserMenu:
@classmethod
def poll(cls, context):
@ -794,6 +822,7 @@ classes = (
FILEBROWSER_MT_select,
FILEBROWSER_MT_context_menu,
ASSETBROWSER_PT_display,
ASSETBROWSER_PT_filter,
ASSETBROWSER_MT_editor_menus,
ASSETBROWSER_MT_view,
ASSETBROWSER_MT_select,

View File

@ -2005,6 +2005,22 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 300, 38)) {
LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) {
if (space->spacetype == SPACE_FILE) {
SpaceFile *sfile = (SpaceFile *)space;
FileAssetSelectParams *asset_params = sfile->asset_params;
if (asset_params) {
asset_params->base_params.filter_id = FILTER_ID_ALL;
}
}
}
}
}
}
/**
* Versioning code until next subversion bump goes here.
*

View File

@ -20,6 +20,8 @@
#pragma once
#include "DNA_ID.h"
#ifdef __cplusplus
extern "C" {
#endif
@ -27,6 +29,7 @@ extern "C" {
struct ID;
bool ED_asset_type_id_is_non_experimental(const struct ID *id);
#define ED_ASSET_TYPE_IDS_NON_EXPERIMENTAL_FLAGS (FILTER_ID_MA | FILTER_ID_AC | FILTER_ID_WO)
/**
* Check if the asset type for \a id (which doesn't need to be an asset right now) can be an asset,

View File

@ -29,13 +29,9 @@
bool ED_asset_type_id_is_non_experimental(const ID *id)
{
/* Remember to update #ED_ASSET_TYPE_IDS_NON_EXPERIMENTAL_UI_STRING and
* #asset_type_ids_non_experimental_as_filter_flags() with this! */
* #ED_ASSET_TYPE_IDS_NON_EXPERIMENTAL_FLAGS() with this! */
return ELEM(GS(id->name), ID_MA, ID_AC, ID_WO);
}
static int64_t asset_type_ids_non_experimental_as_filter_flags()
{
return FILTER_ID_MA | FILTER_ID_AC | FILTER_ID_WO;
}
bool ED_asset_type_is_supported(const ID *id)
{
@ -58,5 +54,5 @@ int64_t ED_asset_types_supported_as_filter_flags()
return FILTER_ID_ALL;
}
return asset_type_ids_non_experimental_as_filter_flags();
return ED_ASSET_TYPE_IDS_NON_EXPERIMENTAL_FLAGS;
}

View File

@ -328,8 +328,9 @@ static void file_refresh(const bContext *C, ScrArea *area)
}
if (ED_fileselect_is_asset_browser(sfile)) {
/* Ask the asset code for appropriate ID filter flags for the supported assets. */
params->filter_id = ED_asset_types_supported_as_filter_flags();
/* Ask the asset code for appropriate ID filter flags for the supported assets, and mask others
* out. */
params->filter_id &= ED_asset_types_supported_as_filter_flags();
}
filelist_settype(sfile->files, params->type);

View File

@ -34,11 +34,14 @@
#include "BKE_node.h"
#include "BKE_studiolight.h"
#include "ED_asset.h"
#include "ED_spreadsheet.h"
#include "ED_text.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_sys_types.h"
#include "BLI_uuid.h"
#include "DNA_action_types.h"
@ -2624,6 +2627,11 @@ static void rna_FileAssetSelectParams_asset_library_set(PointerRNA *ptr, int val
params->asset_library_ref = ED_asset_library_reference_from_enum_value(value);
}
static PointerRNA rna_FileAssetSelectParams_filter_id_get(PointerRNA *ptr)
{
return rna_pointer_inherit_refine(ptr, &RNA_FileAssetSelectIDFilter, ptr->data);
}
static PointerRNA rna_FileBrowser_FileSelectEntry_asset_data_get(PointerRNA *ptr)
{
const FileDirEntry *entry = ptr->data;
@ -6351,6 +6359,40 @@ static void rna_def_fileselect_idfilter(BlenderRNA *brna)
}
}
/* Filter for datablock types in the Asset Browser. */
static void rna_def_fileselect_asset_idfilter(BlenderRNA *brna)
{
StructRNA *srna = RNA_def_struct(brna, "FileAssetSelectIDFilter", NULL);
RNA_def_struct_sdna(srna, "FileSelectParams");
RNA_def_struct_nested(brna, srna, "FileSelectParams");
RNA_def_struct_ui_text(srna,
"File Select Asset Filter",
"Which asset types to show/hide, when browsing an asset library");
static char experimental_prop_names[INDEX_ID_MAX][MAX_NAME];
for (uint i = 0; rna_enum_id_type_filter_items[i].identifier; i++) {
const struct IDFilterEnumPropertyItem *item = &rna_enum_id_type_filter_items[i];
const bool is_experimental = (ED_ASSET_TYPE_IDS_NON_EXPERIMENTAL_FLAGS & item->flag) == 0;
const char *identifier = rna_enum_id_type_filter_items[i].identifier;
if (is_experimental) {
/* Create name for experimental property and store in static buffer. */
snprintf(experimental_prop_names[i],
ARRAY_SIZE(experimental_prop_names[i]),
"experimental_%s",
identifier);
identifier = experimental_prop_names[i];
}
PropertyRNA *prop = RNA_def_property(srna, identifier, PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "filter_id", item->flag);
RNA_def_property_ui_text(prop, item->name, item->description);
RNA_def_property_ui_icon(prop, item->icon, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
}
}
static void rna_def_fileselect_entry(BlenderRNA *brna)
{
PropertyRNA *prop;
@ -6673,6 +6715,15 @@ static void rna_def_fileselect_asset_params(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Catalog UUID", "The UUID of the catalog shown in the browser");
prop = RNA_def_property(srna, "filter_asset_id", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "FileAssetSelectIDFilter");
RNA_def_property_pointer_funcs(
prop, "rna_FileAssetSelectParams_filter_id_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop,
"Filter Asset Types",
"Which asset types to show/hide, when browsing an asset library");
prop = RNA_def_property(srna, "import_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, asset_import_type_items);
RNA_def_property_ui_text(prop, "Import Type", "Determine how the asset will be imported");
@ -7880,6 +7931,7 @@ void RNA_def_space(BlenderRNA *brna)
rna_def_fileselect_params(brna);
rna_def_fileselect_asset_params(brna);
rna_def_fileselect_idfilter(brna);
rna_def_fileselect_asset_idfilter(brna);
rna_def_filemenu_entry(brna);
rna_def_space_filebrowser(brna);
rna_def_space_outliner(brna);