85#define FILEDIR_NBR_ENTRIES_UNSET -1
102 const char *name =
nullptr;
126 std::weak_ptr<asset_system::AssetRepresentation>
asset;
141 if (std::shared_ptr<asset_system::AssetRepresentation> asset_ptr =
asset.lock()) {
147 return asset_ptr.get();
161#define FILELIST_ENTRYCACHESIZE_DEFAULT 1024
281 const bool do_change);
373 return sort_data->
inverted ? -val : val;
478static int compare_name(
void *user_data,
const void *a1,
const void *a2)
492static int compare_date(
void *user_data,
const void *a1,
const void *a2)
516static int compare_size(
void *user_data,
const void *a1,
const void *a2)
528 size1 = entry1->
st.st_size;
529 size2 = entry2->
st.st_size;
572 const char *sufix1, *sufix2;
574 if (!(sufix1 = strstr(entry1->
relpath,
".blend.gz"))) {
575 sufix1 = strrchr(entry1->
relpath,
'.');
577 if (!(sufix2 = strstr(entry2->
relpath,
".blend.gz"))) {
578 sufix2 = strrchr(entry2->
relpath,
'.');
604 if (asset1 && !asset2) {
607 else if (!asset1 && asset2) {
610 else if (!asset1 && !asset2) {
629 if (catalog1 && !catalog2) {
632 else if (!catalog1 && catalog2) {
635 else if (catalog1 && catalog2) {
654 int (*sort_cb)(
void *,
const void *,
const void *) =
nullptr;
656 switch (filelist->
sort) {
683 filelist->
flags &= ~FL_NEED_SORTING;
691 if ((filelist->
sort != sort) || (was_invert_sort != invert_sort)) {
695 (filelist->
flags & ~FL_SORT_INVERT);
706 if ((filename[0] ==
'.') && (filename[1] ==
'\0')) {
711 if (filename[0] ==
'.' && filename[1] ==
'.' && filename[2] ==
'\0') {
739 if (filter->filter_search[0] ==
'\0') {
744 return fnmatch(filter->filter_search, file->relpath, FNM_CASEFOLD) == 0;
753 if (filter->filter_search[0] ==
'\0') {
758 return fnmatch(filter->filter_search, file->name, FNM_CASEFOLD) == 0;
787 if (!(file->typeflag & filter->filter)) {
814 if ((filter->filter || filter->filter_id) && (filter->flags &
FLF_DO_FILTER)) {
821 if (!(filter_id & filter->filter_id)) {
837 return &asset->get_metadata();
845 if (!filter->asset_catalog_filter) {
849 "prepare_filter_asset_library() should only be called when the file browser is "
850 "in asset browser mode");
852 file_ensure_updated_catalog_filter_data(filter->asset_catalog_filter, filelist->
asset_library);
882 if (filter->asset_catalog_filter &&
883 !file_is_asset_visible_in_catalog_filter_settings(filter->asset_catalog_filter, asset_data))
888 if (filter->filter_search[0] ==
'\0') {
894 char filter_search[66];
895 const size_t string_length =
STRNCPY_RLEN(filter_search, filter->filter_search);
898 filter_search[string_length - 1] =
'\0';
954 int num_filtered = 0;
982 MEM_mallocN(
sizeof(*filtered_tmp) *
size_t(num_files), __func__));
987 filtered_tmp[num_filtered++] =
file;
1003 filelist->
flags &= ~FL_NEED_FILTERING;
1009 const bool do_filter,
1010 const bool hide_dot,
1011 const bool hide_parent,
1014 const bool filter_assets_only,
1015 const char *filter_glob,
1016 const char *filter_search)
1074 const ::bUUID *catalog_id)
1082 const bool needs_update = file_set_asset_catalog_filter_settings(
1097 if (library_a->
type != library_b->
type) {
1104 return (library_ptr_a !=
nullptr) &&
1114 if (!asset_library_ref) {
1123 filelist->
asset_library_ref = MEM_cnew<AssetLibraryReference>(
"filelist asset library");
1151 const std::string asset_path = file->asset->full_path();
1170 if (file->preview_icon_id) {
1185 for (
int i = 0; i < numfiles; i++) {
1227 ImBuf *ibuf =
nullptr;
1253 const bool ignore_libdir)
1261 return is_main ? ICON_FILE_PARENT : ICON_NONE;
1264 return ICON_UGLYPACKAGE;
1267 return ICON_FILE_BLEND;
1272 return (file->attributes &
FILE_ATTR_ANY_LINK) ? ICON_FOLDER_REDIRECT : ICON_FILE_FOLDER;
1283 for (
int i = 0; i <
ARRAY_SIZE(categories); i++) {
1286 char *target = fullpath;
1287 if (file->redirection_path) {
1288 target = file->redirection_path;
1290 else if (filelist) {
1294 for (; tfsm; tfsm = tfsm->
next) {
1297 return (tfsm->
icon == ICON_FILE_FOLDER) ? ICON_NONE : tfsm->
icon;
1306 return ICON_FILE_CACHE;
1314 return (is_main || file->preview_icon_id) ? ICON_FILE_BLEND : ICON_BLENDER;
1317 return ICON_FILE_BACKUP;
1320 return ICON_FILE_IMAGE;
1323 return ICON_FILE_MOVIE;
1326 return ICON_FILE_SCRIPT;
1329 return ICON_FILE_SOUND;
1332 return ICON_FILE_FONT;
1335 return ICON_FILE_BLANK;
1338 return ICON_FILE_3D;
1341 return ICON_FILE_3D;
1344 return ICON_FILE_3D;
1347 return ICON_FILE_VOLUME;
1350 return ICON_FILE_3D;
1353 return ICON_FILE_TEXT;
1356 return ICON_FILE_ARCHIVE;
1360 if (
ret != ICON_NONE) {
1364 return is_main ? ICON_FILE_BLANK : ICON_NONE;
1376 return file->preview_icon_id ? file->preview_icon_id :
1400 const bool do_change)
1411 const bool do_change)
1430 const bool do_change)
1471 for (entry =
array->entries.first; entry; entry = entry_next) {
1472 entry_next = entry->
next;
1485 if (
auto asset_ptr = entry->
asset.lock()) {
1519 int removed_counter = 0;
1531 return removed_counter;
1579 preview_taskdata->
preview =
nullptr;
1592 if (preview_taskdata->
preview) {
1616 entry->flags &= ~FILE_ENTRY_PREVIEW_LOADING;
1650 cache->
flags &= ~FLC_PREVIEWS_ACTIVE;
1719 preview->
index = index;
1723 if (preview_in_memory) {
1744 preview_taskdata->
preview = preview;
1774 cache->
size = cache_size;
1811 if (new_size != cache->
size) {
1817 if (new_size != cache->
size) {
1825 cache->
size = new_size;
1835 FileList *p = MEM_cnew<FileList>(__func__);
1848 if (filelist->
type == type) {
1855 switch (filelist->
type) {
1908 const bool do_asset_library,
1909 const bool do_cache,
1910 const bool do_selection)
1930 if (do_asset_library) {
1936 const bool do_asset_library,
1937 const bool do_cache,
1938 const bool do_selection)
1960 if (do_asset_library) {
1987 printf(
"Attempting to delete empty filelist.\n");
2037 const char *relpath = entry->
relpath;
2039 char *name =
nullptr;
2064 name = (
char *)relpath;
2082 return filelist->
check_dir_fn(filelist, (
char *)path,
false);
2092 const bool is_valid_path = filelist->
check_dir_fn(filelist, dirpath, !allow_invalid);
2164 ret = MEM_cnew<FileDirEntry>(__func__);
2308 BLI_assert(index >= 0 && index < filelist->filelist.entries_filtered_num);
2319 const FileList *filelist,
const int index)
2336#define FILE_UID_UNSET 0
2350 return unset_uid != uid;
2365 while (size < window_size && size < 8192) {
2376 const int start_index,
2384 for (i = 0, idx = start_index; i <
size; i++, idx++, cursor++) {
2405 for (i = 0; i <
size; i++, cursor++) {
2408 printf(
"%s: release cacheidx %d (%%p %%s)\n",
2423 const size_t cache_size = cache->
size;
2426 int start_index =
max_ii(0, index - (cache_size / 2));
2427 int end_index =
min_ii(entries_num, index + (cache_size / 2));
2431 if ((index < 0) || (index >= entries_num)) {
2437 if ((end_index - start_index) < cache_size) {
2438 if (start_index == 0) {
2439 end_index =
min_ii(entries_num, start_index + cache_size);
2441 else if (end_index == entries_num) {
2442 start_index =
max_ii(0, end_index - cache_size);
2446 BLI_assert((end_index - start_index) <= cache_size);
2456 (end_index <= cache->block_start_index))
2468 if (idx1 + size1 > cache_size) {
2469 size2 = idx1 + size1 - cache_size;
2507 if (idx1 + size1 > cache_size) {
2508 size2 = idx1 + size1 - cache_size;
2514 cache->
block_cursor = (idx1 + size1 + size2) % cache_size;
2517 if (end_index < cache->block_end_index) {
2523 printf(
"\tcache releasing: [%d:%d] (%d)\n",
2530 if (idx1 + size1 > cache_size) {
2531 size2 = idx1 + size1 - cache_size;
2542 if (start_index < cache->block_start_index) {
2555 idx1 = cache_size - size1;
2583 if ((idx1 + size1) > cache_size) {
2585 size1 = cache_size - idx1;
2615 int block_index = cache->
block_cursor + (index - start_index);
2616 int offs_max =
max_ii(end_index - index, index - start_index);
2617 for (i = 0; i <= offs_max; i++) {
2620 int offs_idx = index + offs;
2621 if (start_index <= offs_idx && offs_idx < end_index) {
2622 int offs_block_idx = (block_index + offs) %
int(cache_size);
2625 }
while ((offs = -offs) < 0);
2675 bool changed =
false;
2715 entry->
flags &= ~FILE_ENTRY_PREVIEW_LOADING;
2751 const size_t a = strlen(
str);
2753 bool retval =
false;
2755 if (a == 0 ||
b >= a) {
2840 path,
".obj",
".mtl",
".3ds",
".fbx",
".glb",
".gltf",
".svg",
".ply",
".stl",
nullptr))
2868 return ICON_FILE_BLEND;
2870 return ICON_FILE_BACKUP;
2872 return ICON_FILE_IMAGE;
2874 return ICON_FILE_MOVIE;
2876 return ICON_FILE_SCRIPT;
2878 return ICON_FILE_SOUND;
2880 return ICON_FILE_FONT;
2882 return ICON_FILE_BLANK;
2886 return ICON_FILE_3D;
2888 return ICON_FILE_TEXT;
2890 return ICON_FILE_ARCHIVE;
2892 return ICON_FILE_VOLUME;
2894 return ICON_FILE_BLANK;
2923 entry_flag &= ~flag;
2934 if (entry_flag != org_entry_flag) {
2944 else if (entry_flag) {
2977 for (current_file = sel->
first; current_file <= sel->
last; current_file++) {
3016 BLI_assert(index >= 0 && index < filelist->filelist.entries_filtered_num);
3024 return selection_state != 0;
3136 const char *filter_glob,
3138 const char *main_filepath,
3139 const bool skip_currpar)
3142 int entries_num = 0;
3156 entry = MEM_new<FileListInternEntry>(__func__);
3158 entry->
st = files[i].
s;
3161 char *target = full_path;
3165 if (
S_ISDIR(files[i].s.st_mode)
3246 const FileListReadJob *job_params,
const int idcode,
const char *group_name)
3262 const bool prefix_relpath_with_group_name,
3264 const char *group_name)
3267 if (prefix_relpath_with_group_name) {
3275 if (datablock_info) {
3284 std::unique_ptr metadata = std::make_unique<AssetMetaData>(
3293 entry->
relpath, datablock_info->
name, idcode, std::move(metadata));
3304 const bool prefix_relpath_with_group_name,
3306 const char *group_name)
3308 for (
LinkNode *ln = datablock_infos; ln; ln = ln->
next) {
3311 job_params, entries, datablock_info, prefix_relpath_with_group_name, idcode, group_name);
3319 const bool prefix_relpath_with_group_name)
3321 for (
const LinkNode *ln = indexer_entries->
entries; ln; ln = ln->next) {
3327 prefix_relpath_with_group_name,
3357 const int read_from_index,
3360 int navigate_to_parent_len = 0;
3365 navigate_to_parent_len = 1;
3369 return read_from_index + navigate_to_parent_len;
3386 BlendHandle *libfiledata =
nullptr;
3395 return std::nullopt;
3399 const bool has_group = group !=
nullptr;
3409 const bool use_indexer = !has_group;
3412 int read_from_index = 0;
3414 dir, &indexer_entries, &read_from_index, indexer_runtime->
user_data);
3417 job_params, entries,
options, read_from_index, &indexer_entries);
3419 return entries_read;
3426 if (libfiledata ==
nullptr) {
3427 return std::nullopt;
3434 int navigate_to_parent_len = 0;
3439 navigate_to_parent_len = 1;
3443 int datablock_len = 0;
3450 job_params, entries, datablock_infos,
false, idcode, group);
3459 const char *group_name =
static_cast<char *
>(ln->link);
3462 job_params, idcode, group_name);
3466 int group_datablock_len;
3470 job_params, entries, group_datablock_infos,
true, idcode, group_name);
3473 &indexer_entries, group_datablock_infos, idcode);
3476 datablock_len += group_datablock_len;
3492 int added_entries_len = group_len + datablock_len + navigate_to_parent_len;
3493 return added_entries_len;
3500static void filelist_readjob_main_recursive(
Main *bmain,
FileList *filelist)
3505 int a, fake, idcode, ok, totlib, totbl;
3522 if (filelist->dir[0] == 0) {
3524# ifdef WITH_FREESTYLE
3561# ifdef WITH_FREESTYLE
3570 if (lb ==
nullptr) {
3575 for (
id = lb->
first; id;
id =
id->next) {
3600 for (
id = lb->
first; id;
id =
id->next) {
3609 SNPRINTF(relname,
"%s | %s", id->lib->filepath, id->name + 2);
3614 if (!filelist->has_func) {
3615 if (idcode ==
ID_OB) {
3620 else if (idcode ==
ID_SCE) {
3628 files->entry->poin = id;
3634 if (id->lib && fake) {
3635 SNPRINTF(files->extra,
"LF %d", id->us);
3638 SNPRINTF(files->extra,
"L %d", id->us);
3641 SNPRINTF(files->extra,
"F %d", id->us);
3644 SNPRINTF(files->extra,
" %d", id->us);
3674 int from_entries_num)
3677 if (from_entries_num <= 0) {
3692 const int current_recursion_level,
3695 if (max_recursion == 0) {
3699 if (!is_lib && current_recursion_level > max_recursion) {
3705 if (!is_lib && (current_recursion_level >= max_recursion) &&
3741 int dirs_done_count = 0, dirs_todo_count = 1;
3757 if (indexer_runtime.callbacks->init_user_data) {
3758 indexer_runtime.user_data = indexer_runtime.callbacks->
init_user_data(dir,
sizeof(dir));
3762 int entries_num = 0;
3766 int recursion_level;
3770 subdir = td_dir->
dir;
3771 recursion_level = td_dir->
level;
3772 skip_currpar = (recursion_level > 1);
3789 bool is_lib =
false;
3792 if (!skip_currpar) {
3798 if (max_recursion > 0) {
3807 job_params, subdir, &entries, list_lib_options, &indexer_runtime);
3808 if (lib_entries_num) {
3810 entries_num += *lib_entries_num;
3827 entry->free_name =
true;
3830 max_recursion, is_lib, recursion_level, entry))
3838 td_dir->
level = recursion_level + 1;
3849 *progress =
float(dirs_done_count) /
float(dirs_todo_count);
3855 indexer_runtime.callbacks->filelist_finished(indexer_runtime.user_data);
3857 if (indexer_runtime.callbacks->free_user_data && indexer_runtime.user_data) {
3858 indexer_runtime.callbacks->free_user_data(indexer_runtime.user_data);
3859 indexer_runtime.user_data =
nullptr;
3943 int entries_num = 0;
3956 entry = MEM_new<FileListInternEntry>(__func__);
4087 int library_count = 0;
4092 int libraries_done_count = 0;
4101 if (&nested_library == current_file_library) {
4110 float progress_this = 0.0f;
4112 true, job_params, stop, do_update, &progress_this);
4114 libraries_done_count++;
4115 *progress =
float(libraries_done_count) / library_count;
4180 int entries_num, new_entries_num = 0;
4205 if (new_entries_num) {
4276 flrj = MEM_cnew<FileListReadJob>(__func__);
blender::asset_system::AssetLibrary * AS_asset_library_load(const Main *bmain, const AssetLibraryReference &library_reference)
Main runtime representation of an asset.
PreviewImage * BKE_asset_metadata_preview_get_from_id(const AssetMetaData *asset_data, const ID *owner_id)
bool BKE_blendfile_library_path_explode(const char *path, char *r_dir, char **r_group, char **r_name)
bool BKE_blendfile_extension_check(const char *str)
wmWindow * CTX_wm_window(const bContext *C)
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
int BKE_icon_imbuf_create(struct ImBuf *ibuf) ATTR_WARN_UNUSED_RESULT
struct ImBuf * BKE_icon_imbuf_get_buffer(int icon_id) ATTR_WARN_UNUSED_RESULT
bool BKE_icon_delete(int icon_id)
uint64_t BKE_idtype_idcode_to_idfilter(short idcode)
const char * BKE_idtype_idcode_to_name(short idcode)
short BKE_idtype_idcode_from_name(const char *idtype_name)
#define FOREACH_MAIN_ID_END
ListBase * which_libbase(Main *bmain, short type)
void BKE_main_lock(Main *bmain)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
void BKE_main_unlock(Main *bmain)
const char * BKE_main_blendfile_path_from_global()
struct bUserAssetLibrary * BKE_preferences_asset_library_find_index(const struct UserDef *userdef, int index) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
bool BKE_previewimg_is_finished(const PreviewImage *prv, int size)
ImBuf * BKE_previewimg_to_imbuf(PreviewImage *prv, int size)
char * BLF_display_name_from_file(const char *filepath) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define BLI_assert_msg(a, msg)
File and directory operations.
eFileAttributes BLI_file_attributes(const char *path)
#define FILE_ATTR_ANY_LINK
unsigned int BLI_filelist_dir_contents(const char *dirname, struct direntry **r_filelist)
bool BLI_is_file(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_is_dir(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_filelist_free(struct direntry *filelist, unsigned int nrentries)
bool BLI_file_alias_target(const char *filepath, char *r_targetpath) ATTR_WARN_UNUSED_RESULT
Some types for dealing with directories.
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_popkey(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_ptr_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghashutil_intcmp(const void *a, const void *b)
GHash * BLI_ghash_new_ex(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
unsigned int BLI_ghashutil_inthash_p(const void *ptr)
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_ghash_clear_ex(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp, unsigned int nentries_reserve)
int BLI_linklist_count(const LinkNode *list) ATTR_WARN_UNUSED_RESULT
void BLI_linklist_freeN(LinkNode *list)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
void copy_vn_i(int *array_tar, int size, int val)
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
bool BLI_path_parent_dir_until_exists(char *path) ATTR_NONNULL(1)
bool bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1)
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
int BLI_path_normalize_dir(char *dir, size_t dir_maxncpy) ATTR_NONNULL(1)
bool BLI_path_has_hidden_component(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check_array(const char *path, const char **ext_array) ATTR_NONNULL(1
bool BLI_path_contains(const char *container_path, const char *containee_path) ATTR_NONNULL(1
#define BLI_path_join(...)
#define FILENAME_IS_CURRENT(_n)
#define FILENAME_IS_CURRPAR(_n)
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check(const char *path, const char *ext) ATTR_NONNULL(1
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
bool BLI_path_extension_check_n(const char *path,...) ATTR_NONNULL(1) ATTR_SENTINEL(0)
int BLI_path_slash_ensure(char *path, size_t path_maxncpy) ATTR_NONNULL(1)
const char * BLI_path_slash_rfind(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check_glob(const char *path, const char *ext_fnmatch) ATTR_NONNULL(1
#define FILENAME_IS_PARENT(_n)
bool BLI_stack_is_empty(const BLI_Stack *stack) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_stack_free(BLI_Stack *stack) ATTR_NONNULL()
void * BLI_stack_peek(BLI_Stack *stack) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * BLI_stack_push_r(BLI_Stack *stack) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_stack_discard(BLI_Stack *stack) ATTR_NONNULL()
#define BLI_stack_new(esize, descr)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY(dst, src)
#define STRNCPY_RLEN(dst, src)
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define SNPRINTF(dst, format,...)
int char char int BLI_strcasecmp(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int char char int int int int BLI_strcmp_ignore_pad(const char *str1, const char *str2, char pad) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int char char int int int BLI_strcasecmp_natural(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char char * BLI_strncpy_ensure_pad(char *__restrict dst, const char *__restrict src, char pad, size_t dst_maxncpy) ATTR_NONNULL(1
int char * BLI_strcasestr(const char *s, const char *find) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define BLI_string_join(...)
void * BLI_task_pool_user_data(TaskPool *pool)
void BLI_task_pool_cancel(TaskPool *pool)
TaskPool * BLI_task_pool_create_background(void *userdata, eTaskPriority priority)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
void BLI_thread_queue_push(ThreadQueue *queue, void *work)
void * BLI_thread_queue_pop(ThreadQueue *queue)
void BLI_mutex_end(ThreadMutex *mutex)
ThreadQueue * BLI_thread_queue_init(void)
void BLI_mutex_init(ThreadMutex *mutex)
void BLI_thread_queue_free(ThreadQueue *queue)
bool BLI_thread_queue_is_empty(ThreadQueue *queue)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_thread_queue_nowait(ThreadQueue *queue)
void BLI_mutex_unlock(ThreadMutex *mutex)
pthread_mutex_t ThreadMutex
void * BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms)
#define ARRAY_SET_ITEMS(...)
#define ENUM_OPERATORS(_type, _max)
#define POINTER_FROM_INT(i)
#define POINTER_AS_UINT(i)
#define UNUSED_VARS_NDEBUG(...)
#define POINTER_FROM_UINT(i)
Compatibility-like things for windows.
void BLI_windows_get_default_root_dir(char root_dir[4])
void BLO_datablock_info_linklist_free(LinkNode *datablock_infos)
LinkNode * BLO_blendhandle_get_datablock_info(BlendHandle *bh, int ofblocktype, bool use_assets_only, int *r_tot_info_items)
BlendHandle * BLO_blendhandle_from_file(const char *filepath, BlendFileReadReport *reports)
void BLO_blendhandle_close(BlendHandle *bh) ATTR_NONNULL(1)
LinkNode * BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
#define ID_IS_LINKED(_id)
@ FILE_SORT_ASSET_CATALOG
@ FILE_TYPE_BLENDER_BACKUP
@ FILE_ENTRY_BLENDERLIB_NO_PREVIEW
@ FILE_ENTRY_PREVIEW_LOADING
@ FILE_ENTRY_INVALID_PREVIEW
eFileSel_Params_AssetCatalogVisibility
#define FILE_MAX_LIBEXTRA
@ FILE_INDEXER_ENTRIES_LOADED
void ED_file_indexer_entries_clear(FileIndexerEntries *indexer_entries)
void ED_file_indexer_entries_extend_from_datablock_infos(FileIndexerEntries *indexer_entries, LinkNode *datablock_infos, int idcode)
@ FS_CATEGORY_SYSTEM_BOOKMARKS
FSMenuEntry * ED_fsmenu_get_category(FSMenu *fsmenu, FSMenuCategory category)
bool IMB_isanim(const char *filepath)
Contains defines and structs used throughout the imbuf module.
const char * imb_ext_movie[]
const char * imb_ext_audio[]
const char * imb_ext_image[]
void IMB_thumb_path_unlock(const char *path)
void IMB_thumb_locks_acquire()
ImBuf * IMB_thumb_manage(const char *file_or_lib_path, ThumbSize size, ThumbSource source)
void IMB_thumb_path_lock(const char *path)
void IMB_thumb_locks_release()
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
int UI_icon_from_idcode(int idcode)
ImBuf * UI_svg_icon_bitmap(uint icon_id, float size, bool multicolor=false)
@ WM_JOB_TYPE_ASSET_LIBRARY_LOAD
@ WM_JOB_TYPE_FILESEL_READDIR
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static DBVT_INLINE btDbvtNode * sort(btDbvtNode *n, btDbvtNode *&r)
constexpr bool is_empty() const
constexpr int64_t size() const
constexpr const char * c_str() const
const char * c_str() const
AssetCatalog * find_catalog(CatalogID catalog_id) const
std::weak_ptr< AssetRepresentation > add_local_id_asset(StringRef relative_asset_path, ID &id)
AssetCatalogService & catalog_service() const
static void foreach_loaded(FunctionRef< void(AssetLibrary &)> fn, bool include_all_library)
bool remove_asset(AssetRepresentation &asset)
StringRefNull name() const
StringRefNull root_path() const
std::weak_ptr< AssetRepresentation > add_external_asset(StringRef relative_asset_path, StringRef name, int id_type, std::unique_ptr< AssetMetaData > metadata)
AssetMetaData & get_metadata() const
const AssetLibrary & owner_asset_library() const
local_group_size(16, 16) .push_constant(Type b
CCL_NAMESPACE_BEGIN struct Options options
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
const FileIndexerType file_indexer_noop
eDirEntry_SelectFlag filelist_entry_select_index_get(FileList *filelist, const int index, FileCheckType check)
int ED_file_icon(const FileDirEntry *file)
#define FILELIST_ENTRYCACHESIZE_DEFAULT
static int compare_apply_inverted(int val, const FileSortData *sort_data)
static char * current_relpath_append(const FileListReadJob *job_params, const char *filename)
static bool is_filtered_main_assets(FileListInternEntry *file, const char *, FileListFilter *filter)
static bool filelist_readjob_should_recurse_into_entry(const int max_recursion, const bool is_lib, const int current_recursion_level, FileListInternEntry *entry)
void filelist_freelib(FileList *filelist)
void filelist_entry_parent_select_set(FileList *filelist, FileSelType select, const eDirEntry_SelectFlag flag, FileCheckType check)
void filelist_tag_force_reset(FileList *filelist)
int filelist_files_num_entries(FileList *filelist)
static eWM_JobType filelist_jobtype_get(const FileList *filelist)
static std::optional< int > filelist_readjob_list_lib(FileListReadJob *job_params, const char *root, ListBase *entries, const ListLibOptions options, FileIndexer *indexer_runtime)
static int compare_tiebreaker(const FileListInternEntry *entry1, const FileListInternEntry *entry2)
ImBuf * filelist_getimage(FileList *filelist, const int index)
bool filelist_islibrary(FileList *filelist, char *dir, char **r_group)
void filelist_entries_select_index_range_set(FileList *filelist, FileSelection *sel, FileSelType select, const eDirEntry_SelectFlag flag, FileCheckType check)
static bool is_filtered_file_relpath(const FileListInternEntry *file, const FileListFilter *filter)
static void filelist_readjob_list_lib_add_datablocks(FileListReadJob *job_params, ListBase *entries, LinkNode *datablock_infos, const bool prefix_relpath_with_group_name, const int idcode, const char *group_name)
const char * filelist_dir(const FileList *filelist)
BlendHandle * filelist_lib(FileList *filelist)
static void filelist_cache_previews_clear(FileListEntryCache *cache)
void filelist_tag_needs_filtering(FileList *filelist)
static int filelist_geticon_ex(const FileList *filelist, const FileDirEntry *file, const bool is_main, const bool ignore_libdir)
void filelist_cache_previews_set(FileList *filelist, const bool use_previews)
static void prepare_filter_asset_library(const FileList *filelist, FileListFilter *filter)
static bool filelist_readjob_append_entries(FileListReadJob *job_params, ListBase *from_entries, int from_entries_num)
static void assetlibrary_readjob_startjob(void *flrjv, wmJobWorkerStatus *worker_status)
static void filelist_cache_init(FileListEntryCache *cache, size_t cache_size)
static void filelist_cache_preview_runf(TaskPool *__restrict pool, void *taskdata)
#define FILEDIR_NBR_ENTRIES_UNSET
static bool filelist_checkdir_main(const FileList *filelist, char dirpath[FILE_MAX_LIBEXTRA], const bool do_change)
static FileListInternEntry * filelist_entry_intern_get(const FileList *filelist, const int index)
static void filelist_file_cache_block_release(FileList *filelist, const int size, int cursor)
static void filelist_intern_free(FileList *filelist)
static void filelist_cache_preview_freef(TaskPool *__restrict, void *taskdata)
static void filelist_clear_main_files(FileList *filelist, const bool do_asset_library, const bool do_cache, const bool do_selection)
blender::asset_system::AssetLibrary * filelist_asset_library(FileList *filelist)
bool filelist_needs_force_reset(const FileList *filelist)
static int compare_asset_catalog(void *user_data, const void *a1, const void *a2)
static void filelist_readjob_lib(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
bool filelist_file_is_preview_pending(const FileList *filelist, const FileDirEntry *file)
static int filelist_readjob_list_dir(FileListReadJob *job_params, const char *root, ListBase *entries, const char *filter_glob, const bool do_lib, const char *main_filepath, const bool skip_currpar)
static FileDirEntry * filelist_file_create_entry(FileList *filelist, const int index)
@ FILELIST_TAGS_USES_MAIN_DATA
@ FILELIST_TAGS_NO_THREADS
void filelist_clear_from_reset_tag(FileList *filelist)
void filelist_set_no_preview_auto_cache(FileList *filelist)
static void filelist_readjob_startjob(void *flrjv, wmJobWorkerStatus *worker_status)
bool filelist_pending(const FileList *filelist)
static void filelist_direntryarr_free(FileDirEntryArr *array)
bool filelist_cache_previews_running(FileList *filelist)
static FileDirEntry * filelist_cache_file_lookup(FileListEntryCache *cache, const int index)
static void parent_dir_until_exists_or_default_root(char *dir)
static bool filelist_checkdir_dir(const FileList *, char dirpath[FILE_MAX_LIBEXTRA], const bool do_change)
void filelist_setfilter_options(FileList *filelist, const bool do_filter, const bool hide_dot, const bool hide_parent, const uint64_t filter, const uint64_t filter_id, const bool filter_assets_only, const char *filter_glob, const char *filter_search)
static void filelist_readjob_do(const bool do_lib, FileListReadJob *job_params, const bool *stop, bool *do_update, float *progress)
void filelist_set_asset_catalog_filter_options(FileList *filelist, eFileSel_Params_AssetCatalogVisibility catalog_visibility, const ::bUUID *catalog_id)
void filelist_free(FileList *filelist)
static void filelist_readjob_all_asset_library(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
void filelist_setlibrary(FileList *filelist, const AssetLibraryReference *asset_library_ref)
static AssetMetaData * filelist_file_internal_get_asset_data(const FileListInternEntry *file)
static void filelist_cache_previews_free(FileListEntryCache *cache)
bool filelist_file_cache_block(FileList *filelist, const int index)
static bool is_filtered_main(FileListInternEntry *file, const char *, FileListFilter *filter)
asset_system::AssetRepresentation * filelist_entry_get_asset_representation(const FileList *filelist, const int index)
bool filelist_cache_previews_done(FileList *filelist)
static int groupname_to_code(const char *group)
static void filelist_readjob_dir(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
static bool is_filtered_lib(FileListInternEntry *file, const char *root, FileListFilter *filter)
void filelist_clear(FileList *filelist)
static void filelist_readjob_main_assets(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
static void filelist_readjob_endjob(void *flrjv)
void filelist_clear_ex(FileList *filelist, const bool do_asset_library, const bool do_cache, const bool do_selection)
void filelist_free_icons()
static void filelist_file_release_entry(FileList *filelist, FileDirEntry *entry)
void filelist_file_get_full_path(const FileList *filelist, const FileDirEntry *file, char r_filepath[])
static bool filelist_cache_previews_push(FileList *filelist, FileDirEntry *entry, const int index)
const char * filelist_entry_get_relpath(const FileList *filelist, int index)
void filelist_setdir(FileList *filelist, char dirpath[FILE_MAX_LIBEXTRA])
static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size)
@ FL_PREVIEWS_NO_AUTO_CACHE
@ FL_FORCE_RESET_MAIN_FILES
int ED_file_extension_icon(const char *path)
void filelist_cache_previews_ensure_running(FileList *filelist)
void filelist_setrecursion(FileList *filelist, const int recursion_level)
int filelist_geticon(FileList *filelist, const int index, const bool is_main)
static int compare_extension(void *user_data, const void *a1, const void *a2)
static int compare_size(void *user_data, const void *a1, const void *a2)
void filelist_setsorting(FileList *filelist, const short sort, bool invert_sort)
ID * filelist_file_get_id(const FileDirEntry *file)
bool filelist_file_ensure_preview_requested(FileList *filelist, FileDirEntry *file)
bool filelist_cache_previews_update(FileList *filelist)
static bool is_filtered_asset(FileListInternEntry *file, FileListFilter *filter)
int filelist_file_find_path(FileList *filelist, const char *filename)
static FileListInternEntry * filelist_readjob_list_lib_group_create(const FileListReadJob *job_params, const int idcode, const char *group_name)
static FileDirEntry * filelist_geticon_get_file(FileList *filelist, const int index)
static int compare_name(void *user_data, const void *a1, const void *a2)
static void filelist_entry_free(FileDirEntry *entry)
void filelist_settype(FileList *filelist, short type)
static void filelist_readjob_main_assets_add_items(FileListReadJob *job_params, bool *, bool *do_update, float *)
FileList * filelist_new(short type)
void filelist_entry_select_index_set(FileList *filelist, const int index, FileSelType select, const eDirEntry_SelectFlag flag, FileCheckType check)
int filelist_file_find_id(const FileList *filelist, const ID *id)
static void filelist_cache_free(FileListEntryCache *cache)
static bool filelist_contains_main(const FileList *filelist, const Main *bmain)
static void filelist_clear_asset_library(FileList *filelist)
static FileListInternEntry * filelist_readjob_list_lib_navigate_to_parent_entry_create(const FileListReadJob *job_params)
static int compare_direntry_generic(const FileListInternEntry *entry1, const FileListInternEntry *entry2)
ImBuf * filelist_file_getimage(const FileDirEntry *file)
FileDirEntry * filelist_file_ex(FileList *filelist, const int index, const bool use_request)
bool filelist_uid_is_set(const FileUID uid)
void filelist_readjob_stop(FileList *filelist, wmWindowManager *wm)
bool filelist_cache_previews_enabled(const FileList *filelist)
static int filelist_readjob_list_lib_populate_from_index(FileListReadJob *job_params, ListBase *entries, const ListLibOptions options, const int read_from_index, const FileIndexerEntries *indexer_entries)
static void filelist_readjob_update(void *flrjv)
static void filelist_readjob_list_lib_add_from_indexer_entries(FileListReadJob *job_params, ListBase *entries, const FileIndexerEntries *indexer_entries, const bool prefix_relpath_with_group_name)
static bool filelist_compare_asset_libraries(const AssetLibraryReference *library_a, const AssetLibraryReference *library_b)
static void filelist_cache_preview_ensure_running(FileListEntryCache *cache)
int filelist_needs_reading(const FileList *filelist)
static void filelist_readjob_recursive_dir_add_items(const bool do_lib, FileListReadJob *job_params, const bool *stop, bool *do_update, float *progress)
ID * filelist_entry_get_id(const FileList *filelist, const int index)
static void filelist_readjob_load_asset_library_data(FileListReadJob *job_params, bool *do_update)
void filelist_file_cache_slidingwindow_set(FileList *filelist, size_t window_size)
static bool filelist_file_cache_block_create(FileList *filelist, const int start_index, const int size, int cursor)
static bool is_filtered_file_type(const FileListInternEntry *file, const FileListFilter *filter)
static void filelist_intern_entry_free(FileList *filelist, FileListInternEntry *entry)
static int compare_date(void *user_data, const void *a1, const void *a2)
int ED_path_extension_type(const char *path)
int filelist_readjob_running(FileList *filelist, wmWindowManager *wm)
void filelist_filter(FileList *filelist)
static bool is_filtered_hidden(const char *filename, const FileListFilter *filter, const FileListInternEntry *file)
static bool is_filtered_file(FileListInternEntry *file, const char *, FileListFilter *filter)
void filelist_tag_force_reset_mainfiles(FileList *filelist)
static void filelist_entry_clear(FileDirEntry *entry)
bool filelist_is_dir(const FileList *filelist, const char *path)
static bool is_filtered_file_name(const FileListInternEntry *file, const FileListFilter *filter)
static int filelist_intern_free_main_files(FileList *filelist)
bool filelist_needs_reset_on_main_changes(const FileList *filelist)
int filelist_files_ensure(FileList *filelist)
void filelist_sort(FileList *filelist)
static bool is_filtered_asset_library(FileListInternEntry *file, const char *root, FileListFilter *filter)
static void filelist_readjob_main(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
static const char * fileentry_uiname(const char *root, FileListInternEntry *entry, char *buff)
bool filelist_entry_is_selected(FileList *filelist, const int index)
static bool is_filtered_lib_type(FileListInternEntry *file, const char *, FileListFilter *filter)
void filelist_setindexer(FileList *filelist, const FileIndexerType *indexer)
FileDirEntry * filelist_file(FileList *filelist, int index)
bool filelist_is_ready(const FileList *filelist)
uint filelist_entry_select_set(const FileList *filelist, const FileDirEntry *entry, FileSelType select, const eDirEntry_SelectFlag flag, FileCheckType check)
ImBuf * filelist_geticon_image(FileList *filelist, const int index)
static bool filelist_checkdir_return_always_valid(const FileList *, char[FILE_MAX_LIBEXTRA], const bool)
static bool filelist_readjob_is_partial_read(const FileListReadJob *read_job)
void filelist_readjob_start(FileList *filelist, const int space_notifier, const bContext *C)
static void filelist_readjob_free(void *flrjv)
eDirEntry_SelectFlag filelist_entry_select_get(FileList *filelist, FileDirEntry *entry, FileCheckType check)
static void filelist_readjob_list_lib_add_datablock(FileListReadJob *job_params, ListBase *entries, BLODataBlockInfo *datablock_info, const bool prefix_relpath_with_group_name, const int idcode, const char *group_name)
static bool filelist_intern_entry_is_main_file(const FileListInternEntry *intern_entry)
static bool filelist_checkdir_lib(const FileList *, char dirpath[FILE_MAX_LIBEXTRA], const bool do_change)
static ImBuf * filelist_ensure_special_file_image(SpecialFileImages image, int icon)
static bool asset_tag_matches_filter(const char *filter_search, const AssetMetaData *asset_data)
void filelist_uid_unset(FileUID *r_uid)
static bool file_is_blend_backup(const char *str)
static FileUID filelist_uid_generate(FileList *filelist)
ImBuf * filelist_geticon_image_ex(const FileDirEntry *file)
static bool is_filtered_id_file_type(const FileListInternEntry *file, const short id_code, const char *name, const FileListFilter *filter)
static ImBuf * gSpecialFileImages[int(SpecialFileImages::_Max)]
static void filelist_readjob_asset_library(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
static bool filelist_file_preview_load_poll(const FileDirEntry *entry)
void IMB_freeImBuf(ImBuf *)
DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
AssetCatalogFilterSettings * file_create_asset_catalog_filter_settings()
static void update(bNodeTree *ntree)
unsigned __int64 uint64_t
User defined tag. Currently only used by assets, could be used more often at some point....
AssetMetaData * asset_data
struct FileDirEntry * next
BLODataBlockInfo datablock_info
FileIndexerUpdateIndexFunc update_index
FileIndexerReadIndexFunc read_index
FileIndexerInitUserDataFunc init_user_data
const FileIndexerType * callbacks
ThreadQueue * previews_done
int * misc_entries_indices
FileDirEntry ** block_entries
FileListEntryPreview * preview
char filepath[FILE_MAX_LIBEXTRA]
char filter_glob[FILE_MAXFILE]
blender::ed::asset_browser::AssetCatalogFilterSettings * asset_catalog_filter
PreviewImage * preview_image
eFileAttributes attributes
eFileSel_File_Types typeflag
std::weak_ptr< asset_system::AssetRepresentation > asset
FileListInternEntry * next
struct FileListInternEntry::@494 local_data
FileListInternEntry * prev
bool blenderlib_has_no_preview
asset_system::AssetRepresentation * get_asset() const
FileListInternEntry ** filtered
asset_system::AssetLibrary * load_asset_library
char cur_relbase[FILE_MAX_LIBEXTRA]
char main_filepath[FILE_MAX]
void(* prepare_filter_fn)(const FileList *filelist, FileListFilter *filter)
bool(* filter_fn)(FileListInternEntry *file, const char *root, FileListFilter *filter)
bool(* check_dir_fn)(const FileList *filelist, char dirpath[FILE_MAX_LIBEXTRA], const bool do_change)
AssetLibraryReference * asset_library_ref
void(* read_job_fn)(FileListReadJob *job_params, bool *stop, bool *do_update, float *progress)
FileListEntryCache filelist_cache
FileListIntern filelist_intern
asset_system::AssetLibrary * asset_library
BlendHandle * libfiledata
FileListFilter filter_data
const FileIndexerType * indexer
struct AssetMetaData * asset_data
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_jobs_timer(wmJob *wm_job, double time_step, uint note, uint endnote)
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
void WM_jobs_kill_type(wmWindowManager *wm, const void *owner, int job_type)
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, const eWM_JobFlag flag, const eWM_JobType job_type)
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
bool WM_jobs_test(const wmWindowManager *wm, const void *owner, int job_type)
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))