Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2021-10-04 20:46:15 +0300
committerJulian Eisel <julian@blender.org>2021-10-04 21:24:25 +0300
commit3391a2ef1d27dcf1ec1851eefc74e77114e6b493 (patch)
treef4816478b6ebde2b8707b53e6b3a76734538d84e /source/blender/editors/space_file/filelist.c
parentffa20de0508591dae31fbb56abd55fd44e6deb4c (diff)
Assets: Show all assets indirectly nested inside the active catalog
The asset catalog design was always that the active catalog would also display all assets of its child catalogs (or grand-childs, etc.). This is one of the main characteristics that differentiates catalogs from usual directories. Sybren prepared this on the asset catalog backend side with 56ce51d1f75a. This integrates it into the Asset Browser backend and the UI.
Diffstat (limited to 'source/blender/editors/space_file/filelist.c')
-rw-r--r--source/blender/editors/space_file/filelist.c64
1 files changed, 34 insertions, 30 deletions
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index a927b62fd6e..773a321da5c 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -89,6 +89,7 @@
#include "atomic_ops.h"
+#include "file_intern.h"
#include "filelist.h"
#define FILEDIR_NBR_ENTRIES_UNSET -1
@@ -371,8 +372,7 @@ typedef struct FileListFilter {
char filter_search[66]; /* + 2 for heading/trailing implicit '*' wildcards. */
short flags;
- eFileSel_Params_AssetCatalogVisibility asset_catalog_visibility;
- bUUID asset_catalog_id;
+ FileAssetCatalogFilterSettingsHandle *asset_catalog_filter;
} FileListFilter;
/* FileListFilter.flags */
@@ -426,6 +426,8 @@ typedef struct FileList {
/* Filter an entry of current filelist. */
bool (*filter_fn)(struct FileListInternEntry *, const char *, FileListFilter *);
+ /* Executed before filtering individual items, to set up additional filter data. */
+ void (*prepare_filter_fn)(const struct FileList *, FileListFilter *);
short tags; /* FileListTags */
} FileList;
@@ -906,27 +908,26 @@ static AssetMetaData *filelist_file_internal_get_asset_data(const FileListIntern
return local_id ? local_id->asset_data : file->imported_asset_data;
}
-static bool is_filtered_asset(FileListInternEntry *file, FileListFilter *filter)
+static void prepare_filter_asset_library(const FileList *filelist, FileListFilter *filter)
{
- const AssetMetaData *asset_data = filelist_file_internal_get_asset_data(file);
- bool is_visible = false;
+ /* Not used yet for the asset view template. */
+ if (!filter->asset_catalog_filter) {
+ return;
+ }
- switch (filter->asset_catalog_visibility) {
- case FILE_SHOW_ASSETS_WITHOUT_CATALOG:
- is_visible = BLI_uuid_is_nil(asset_data->catalog_id);
- break;
- case FILE_SHOW_ASSETS_FROM_CATALOG:
- /* TODO show all assets that are in child catalogs of the selected catalog. */
- is_visible = !BLI_uuid_is_nil(filter->asset_catalog_id) &&
- BLI_uuid_equal(filter->asset_catalog_id, asset_data->catalog_id);
- break;
- case FILE_SHOW_ASSETS_ALL_CATALOGS:
- /* All asset files should be visible. */
- is_visible = true;
- break;
+ file_ensure_updated_catalog_filter_data(filter->asset_catalog_filter, filelist->asset_library);
+}
+
+static bool is_filtered_asset(FileListInternEntry *file, FileListFilter *filter)
+{
+ /* Not used yet for the asset view template. */
+ if (!filter->asset_catalog_filter) {
+ return true;
}
- return is_visible;
+ const AssetMetaData *asset_data = filelist_file_internal_get_asset_data(file);
+ return file_is_asset_visible_in_catalog_filter_settings(filter->asset_catalog_filter,
+ asset_data);
}
static bool is_filtered_lib(FileListInternEntry *file, const char *root, FileListFilter *filter)
@@ -999,6 +1000,10 @@ void filelist_filter(FileList *filelist)
}
}
+ if (filelist->prepare_filter_fn) {
+ filelist->prepare_filter_fn(filelist, &filelist->filter_data);
+ }
+
filtered_tmp = MEM_mallocN(sizeof(*filtered_tmp) * (size_t)num_files, __func__);
/* Filter remap & count how many files are left after filter in a single loop. */
@@ -1090,20 +1095,15 @@ void filelist_set_asset_catalog_filter_options(
eFileSel_Params_AssetCatalogVisibility catalog_visibility,
const bUUID *catalog_id)
{
- bool update = false;
-
- if (filelist->filter_data.asset_catalog_visibility != catalog_visibility) {
- filelist->filter_data.asset_catalog_visibility = catalog_visibility;
- update = true;
+ if (!filelist->filter_data.asset_catalog_filter) {
+ /* There's no filter data yet. */
+ filelist->filter_data.asset_catalog_filter = file_create_asset_catalog_filter_settings();
}
- if (filelist->filter_data.asset_catalog_visibility == FILE_SHOW_ASSETS_FROM_CATALOG &&
- catalog_id && !BLI_uuid_equal(filelist->filter_data.asset_catalog_id, *catalog_id)) {
- filelist->filter_data.asset_catalog_id = *catalog_id;
- update = true;
- }
+ const bool needs_update = file_set_asset_catalog_filter_settings(
+ filelist->filter_data.asset_catalog_filter, catalog_visibility, *catalog_id);
- if (update) {
+ if (needs_update) {
filelist_tag_needs_filtering(filelist);
}
}
@@ -1803,11 +1803,13 @@ void filelist_settype(FileList *filelist, short type)
case FILE_ASSET_LIBRARY:
filelist->check_dir_fn = filelist_checkdir_lib;
filelist->read_job_fn = filelist_readjob_asset_library;
+ filelist->prepare_filter_fn = prepare_filter_asset_library;
filelist->filter_fn = is_filtered_asset_library;
break;
case FILE_MAIN_ASSET:
filelist->check_dir_fn = filelist_checkdir_main_assets;
filelist->read_job_fn = filelist_readjob_main_assets;
+ filelist->prepare_filter_fn = prepare_filter_asset_library;
filelist->filter_fn = is_filtered_main_assets;
filelist->tags |= FILELIST_TAGS_USES_MAIN_DATA | FILELIST_TAGS_NO_THREADS;
break;
@@ -1873,6 +1875,7 @@ void filelist_free(struct FileList *filelist)
filelist->selection_state = NULL;
}
+ file_delete_asset_catalog_filter_settings(&filelist->filter_data.asset_catalog_filter);
MEM_SAFE_FREE(filelist->asset_library_ref);
memset(&filelist->filter_data, 0, sizeof(filelist->filter_data));
@@ -3612,6 +3615,7 @@ static void filelist_readjob_startjob(void *flrjv, short *stop, short *do_update
memset(&flrj->tmp_filelist->filelist_cache, 0, sizeof(flrj->tmp_filelist->filelist_cache));
flrj->tmp_filelist->selection_state = NULL;
flrj->tmp_filelist->asset_library_ref = NULL;
+ flrj->tmp_filelist->filter_data.asset_catalog_filter = NULL;
BLI_mutex_unlock(&flrj->lock);