88#define FILEDIR_NBR_ENTRIES_UNSET -1
129 std::weak_ptr<asset_system::AssetRepresentation>
asset;
144 if (std::shared_ptr<asset_system::AssetRepresentation> asset_ptr =
asset.lock()) {
150 return asset_ptr.get();
164#define FILELIST_ENTRYCACHESIZE_DEFAULT 1024
284 const bool do_change);
371 return sort_data->
inverted ? -val : val;
476static int compare_name(
void *user_data,
const void *a1,
const void *a2)
490static int compare_date(
void *user_data,
const void *a1,
const void *a2)
514static int compare_size(
void *user_data,
const void *a1,
const void *a2)
526 size1 = entry1->
st.st_size;
527 size2 = entry2->
st.st_size;
570 const char *sufix1, *sufix2;
572 if (!(sufix1 = strstr(entry1->
relpath,
".blend.gz"))) {
573 sufix1 = strrchr(entry1->
relpath,
'.');
575 if (!(sufix2 = strstr(entry2->
relpath,
".blend.gz"))) {
576 sufix2 = strrchr(entry2->
relpath,
'.');
602 if (asset1 && !asset2) {
605 if (!asset1 && asset2) {
608 if (!asset1 && !asset2) {
627 if (catalog1 && !catalog2) {
630 else if (!catalog1 && catalog2) {
633 else if (catalog1 && catalog2) {
652 int (*sort_cb)(
void *,
const void *,
const void *) =
nullptr;
654 switch (filelist->
sort) {
689 if ((filelist->
sort !=
sort) || (was_invert_sort != invert_sort)) {
704 if ((filename[0] ==
'.') && (filename[1] ==
'\0')) {
709 if (filename[0] ==
'.' && filename[1] ==
'.' && filename[2] ==
'\0') {
737 if (
filter->filter_search[0] ==
'\0') {
742 return fnmatch(
filter->filter_search, file->
relpath, FNM_CASEFOLD) == 0;
751 if (
filter->filter_search[0] ==
'\0') {
756 return fnmatch(
filter->filter_search, file->
name, FNM_CASEFOLD) == 0;
819 if (!(filter_id &
filter->filter_id)) {
835 return &asset->get_metadata();
843 if (!
filter->asset_catalog_filter) {
847 "prepare_filter_asset_library() should only be called when the file browser is "
848 "in asset browser mode");
850 file_ensure_updated_catalog_filter_data(
filter->asset_catalog_filter, filelist->
asset_library);
880 if (
filter->asset_catalog_filter &&
881 !file_is_asset_visible_in_catalog_filter_settings(
filter->asset_catalog_filter, asset_data))
886 if (
filter->filter_search[0] ==
'\0') {
892 char filter_search[66];
896 filter_search[string_length - 1] =
'\0';
957 int num_filtered = 0;
985 MEM_mallocN(
sizeof(*filtered_tmp) *
size_t(num_files), __func__));
990 filtered_tmp[num_filtered++] = file;
1012 const bool do_filter,
1013 const bool hide_dot,
1014 const bool hide_parent,
1017 const bool filter_assets_only,
1018 const char *filter_glob,
1019 const char *filter_search)
1077 const ::bUUID *catalog_id)
1085 const bool needs_update = file_set_asset_catalog_filter_settings(
1100 if (library_a->
type != library_b->
type) {
1107 return (library_ptr_a !=
nullptr) &&
1117 if (!asset_library_ref) {
1154 const std::string asset_path = file->
asset->full_path();
1201 ImBuf *ibuf =
nullptr;
1227 const bool ignore_libdir)
1235 return is_main ? ICON_FILE_PARENT : ICON_NONE;
1238 return ICON_UGLYPACKAGE;
1241 return ICON_FILE_BLEND;
1260 char *target = fullpath;
1264 else if (filelist) {
1268 for (; tfsm; tfsm = tfsm->
next) {
1271 return (tfsm->
icon == ICON_FILE_FOLDER) ? ICON_NONE : tfsm->
icon;
1280 return ICON_FILE_CACHE;
1288 return (is_main || file->
preview_icon_id) ? ICON_FILE_BLEND : ICON_BLENDER;
1291 return ICON_FILE_BACKUP;
1294 return ICON_FILE_IMAGE;
1297 return ICON_FILE_MOVIE;
1300 return ICON_FILE_SCRIPT;
1303 return ICON_FILE_SOUND;
1306 return ICON_FILE_FONT;
1309 return ICON_FILE_BLANK;
1312 return ICON_FILE_3D;
1315 return ICON_FILE_3D;
1318 return ICON_FILE_3D;
1321 return ICON_FILE_VOLUME;
1324 return ICON_FILE_3D;
1327 return ICON_FILE_TEXT;
1330 return ICON_FILE_ARCHIVE;
1334 if (
ret != ICON_NONE) {
1338 return is_main ? ICON_FILE_BLANK : ICON_NONE;
1377 const bool do_change)
1392 const bool do_change)
1397 const bool is_valid = (
BLI_is_dir(dirpath) ||
1401 if (do_change && !is_valid) {
1411 const bool do_change)
1452 for (entry =
array->entries.first; entry; entry = entry_next) {
1453 entry_next = entry->
next;
1466 if (
auto asset_ptr = entry->
asset.lock()) {
1500 int removed_counter = 0;
1511 if (removed_counter > 0) {
1514 return removed_counter;
1562 preview_taskdata->
preview =
nullptr;
1575 if (preview_taskdata->
preview) {
1702 preview->
index = index;
1706 if (preview_in_memory) {
1727 preview_taskdata->
preview = preview;
1756 cache->
size = cache_size;
1793 if (new_size != cache->
size) {
1799 if (new_size != cache->
size) {
1807 cache->
size = new_size;
1830 if (filelist->
type == type) {
1837 switch (filelist->
type) {
1890 const bool do_asset_library,
1891 const bool do_cache,
1892 const bool do_selection)
1912 if (do_asset_library) {
1918 const bool do_asset_library,
1919 const bool do_cache,
1920 const bool do_selection)
1930 if (removed_files == 0) {
1948 if (do_asset_library) {
1975 printf(
"Attempting to delete empty filelist.\n");
2027 const char *relpath = entry->
relpath;
2029 char *name =
nullptr;
2054 name = (
char *)relpath;
2072 return filelist->
check_dir_fn(filelist, (
char *)path,
false);
2082 const bool is_valid_path = filelist->
check_dir_fn(filelist, dirpath, !allow_invalid);
2298 BLI_assert(index >= 0 && index < filelist->filelist.entries_filtered_num);
2309 const FileList *filelist,
const int index)
2326#define FILE_UID_UNSET 0
2340 return unset_uid != uid;
2355 while (
size < window_size &&
size < 8192) {
2366 const int start_index,
2374 for (
i = 0, idx = start_index;
i <
size;
i++, idx++, cursor++) {
2395 for (
i = 0;
i <
size;
i++, cursor++) {
2398 printf(
"%s: release cacheidx %d (%%p %%s)\n",
2413 const size_t cache_size = cache->
size;
2416 int start_index =
max_ii(0, index - (cache_size / 2));
2417 int end_index =
min_ii(entries_num, index + (cache_size / 2));
2421 if ((index < 0) || (index >= entries_num)) {
2427 if ((end_index - start_index) < cache_size) {
2428 if (start_index == 0) {
2429 end_index =
min_ii(entries_num, start_index + cache_size);
2431 else if (end_index == entries_num) {
2432 start_index =
max_ii(0, end_index - cache_size);
2436 BLI_assert((end_index - start_index) <= cache_size);
2446 (end_index <= cache->block_start_index))
2458 if (idx1 + size1 > cache_size) {
2459 size2 = idx1 + size1 - cache_size;
2497 if (idx1 + size1 > cache_size) {
2498 size2 = idx1 + size1 - cache_size;
2504 cache->
block_cursor = (idx1 + size1 + size2) % cache_size;
2507 if (end_index < cache->block_end_index) {
2513 printf(
"\tcache releasing: [%d:%d] (%d)\n",
2520 if (idx1 + size1 > cache_size) {
2521 size2 = idx1 + size1 - cache_size;
2532 if (start_index < cache->block_start_index) {
2545 idx1 = cache_size - size1;
2573 if ((idx1 + size1) > cache_size) {
2575 size1 = cache_size - idx1;
2605 int block_index = cache->
block_cursor + (index - start_index);
2606 int offs_max =
max_ii(end_index - index, index - start_index);
2607 for (
i = 0;
i <= offs_max;
i++) {
2610 int offs_idx = index + offs;
2611 if (start_index <= offs_idx && offs_idx < end_index) {
2612 int offs_block_idx = (block_index + offs) %
int(cache_size);
2615 }
while ((offs = -offs) < 0);
2655 bool changed =
false;
2731 const size_t a = strlen(
str);
2733 bool retval =
false;
2735 if (a == 0 ||
b >= a) {
2820 path,
".obj",
".mtl",
".3ds",
".fbx",
".glb",
".gltf",
".svg",
".ply",
".stl",
nullptr))
2848 return ICON_FILE_BLEND;
2850 return ICON_FILE_BACKUP;
2852 return ICON_FILE_IMAGE;
2854 return ICON_FILE_MOVIE;
2856 return ICON_FILE_SCRIPT;
2858 return ICON_FILE_SOUND;
2860 return ICON_FILE_FONT;
2862 return ICON_FILE_BLANK;
2866 return ICON_FILE_3D;
2868 return ICON_FILE_TEXT;
2870 return ICON_FILE_ARCHIVE;
2872 return ICON_FILE_VOLUME;
2874 return ICON_FILE_BLANK;
2903 entry_flag &=
~flag;
2914 if (entry_flag != org_entry_flag) {
2924 else if (entry_flag) {
2957 for (current_file = sel->
first; current_file <= sel->last; current_file++) {
2996 BLI_assert(index >= 0 && index < filelist->filelist.entries_filtered_num);
3004 return selection_state != 0;
3095 const char *relbase = job_params->cur_relbase;
3119 const char *filter_glob,
3121 const char *main_filepath,
3122 const bool skip_currpar)
3125 int entries_num = 0;
3139 entry = MEM_new<FileListInternEntry>(__func__);
3141 entry->
st = files[
i].
s;
3144 char *target = full_path;
3229 const FileListReadJob *job_params,
const int idcode,
const char *group_name)
3245 const bool prefix_relpath_with_group_name,
3247 const char *group_name)
3250 if (prefix_relpath_with_group_name) {
3258 if (datablock_info) {
3261 if (datablock_info->
name[0] ==
'.') {
3271 std::unique_ptr metadata = std::make_unique<AssetMetaData>(
3280 entry->
relpath, datablock_info->
name, idcode, std::move(metadata));
3291 const bool prefix_relpath_with_group_name,
3293 const char *group_name)
3295 for (
LinkNode *ln = datablock_infos; ln; ln = ln->
next) {
3298 job_params, entries, datablock_info, prefix_relpath_with_group_name, idcode, group_name);
3306 const bool prefix_relpath_with_group_name)
3314 prefix_relpath_with_group_name,
3344 const int read_from_index,
3347 int navigate_to_parent_len = 0;
3352 navigate_to_parent_len = 1;
3356 return read_from_index + navigate_to_parent_len;
3373 BlendHandle *libfiledata =
nullptr;
3382 return std::nullopt;
3386 const bool has_group = group !=
nullptr;
3396 const bool use_indexer = !has_group;
3399 int read_from_index = 0;
3401 dir, &indexer_entries, &read_from_index, indexer_runtime->
user_data);
3404 job_params, entries,
options, read_from_index, &indexer_entries);
3406 return entries_read;
3413 if (libfiledata ==
nullptr) {
3414 return std::nullopt;
3421 int navigate_to_parent_len = 0;
3426 navigate_to_parent_len = 1;
3430 int datablock_len = 0;
3437 job_params, entries, datablock_infos,
false, idcode, group);
3446 const char *group_name =
static_cast<char *
>(ln->link);
3449 job_params, idcode, group_name);
3453 int group_datablock_len;
3457 job_params, entries, group_datablock_infos,
true, idcode, group_name);
3460 &indexer_entries, group_datablock_infos, idcode);
3463 datablock_len += group_datablock_len;
3479 int added_entries_len = group_len + datablock_len + navigate_to_parent_len;
3480 return added_entries_len;
3487static void filelist_readjob_main_recursive(
Main *bmain,
FileList *filelist)
3492 int a, fake, idcode, ok, totlib, totbl;
3509 if (filelist->dir[0] == 0) {
3511# ifdef WITH_FREESTYLE
3548# ifdef WITH_FREESTYLE
3557 if (lb ==
nullptr) {
3562 for (
id = lb->
first;
id;
id = id->
next) {
3587 for (
id = lb->
first;
id;
id = id->
next) {
3601 if (!filelist->has_func) {
3602 if (idcode ==
ID_OB) {
3607 else if (idcode ==
ID_SCE) {
3615 files->entry->poin = id;
3621 if (id->
lib && fake) {
3661 int from_entries_num)
3664 if (from_entries_num <= 0) {
3669 std::scoped_lock
lock(job_params->
lock);
3678 const int current_recursion_level,
3681 if (max_recursion == 0) {
3685 if (!is_lib && current_recursion_level > max_recursion) {
3691 if (!is_lib && (current_recursion_level >= max_recursion) &&
3727 int dirs_done_count = 0, dirs_todo_count = 1;
3748 int entries_num = 0;
3752 int recursion_level;
3756 subdir = td_dir->
dir;
3757 recursion_level = td_dir->
level;
3758 skip_currpar = (recursion_level > 1);
3773 STRNCPY(job_params->cur_relbase, rel_subdir);
3775 bool is_lib =
false;
3778 if (!skip_currpar) {
3784 if (max_recursion > 0) {
3793 job_params, subdir, &entries, list_lib_options, &indexer_runtime);
3794 if (lib_entries_num) {
3796 entries_num += *lib_entries_num;
3813 entry->free_name =
true;
3816 max_recursion, is_lib, recursion_level, entry))
3824 td_dir->
level = recursion_level + 1;
3835 *
progress = float(dirs_done_count) / float(dirs_todo_count);
3929 int entries_num = 0;
3942 entry = MEM_new<FileListInternEntry>(__func__);
4077 int library_count = 0;
4082 int libraries_done_count = 0;
4091 if (&nested_library == current_file_library) {
4100 float progress_this = 0.0f;
4104 libraries_done_count++;
4105 *
progress = float(libraries_done_count) / library_count;
4156 flrj, &worker_status->stop, &worker_status->do_update, &worker_status->progress);
4169 int entries_num, new_entries_num = 0;
4192 if (new_entries_num) {
4250 const int space_notifier,
4252 const bool force_blocking_read)
4263 flrj = MEM_new<FileListReadJob>(__func__);
4286 if (force_blocking_read || no_threads) {
4288 wmJobWorkerStatus worker_status = {};
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
ImBuf * BKE_previewimg_to_imbuf(const PreviewImage *prv, int size)
bool BKE_previewimg_is_finished(const 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_file_alias_target(const char *filepath, char r_targetpath[768]) ATTR_WARN_UNUSED_RESULT
bool BLI_is_dir(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_filelist_free(struct direntry *filelist, unsigned int nrentries)
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)
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) 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)
bool BLI_path_is_abs_from_cwd(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#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_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
char * STRNCPY(char(&dst)[N], const char *src)
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)
ThreadQueue * BLI_thread_queue_init(void)
void BLI_thread_queue_free(ThreadQueue *queue)
bool BLI_thread_queue_is_empty(ThreadQueue *queue)
void BLI_thread_queue_nowait(ThreadQueue *queue)
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)
@ FILE_SORT_ASSET_CATALOG
@ FILE_ENTRY_BLENDERLIB_NO_PREVIEW
@ FILE_ENTRY_PREVIEW_LOADING
@ FILE_ENTRY_INVALID_PREVIEW
@ FILE_TYPE_BLENDER_BACKUP
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)
int ED_path_extension_type(const char *path)
void IMB_freeImBuf(ImBuf *ibuf)
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.
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)
unsigned long long int uint64_t
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)
AssetLibrary & owner_asset_library() const
AssetMetaData & get_metadata() const
CCL_NAMESPACE_BEGIN struct Options options
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)
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)
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)
void filelist_readjob_blocking_run(FileList *filelist, int space_notifier, const bContext *C)
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 void filelist_readjob_start_ex(FileList *filelist, const int space_notifier, const bContext *C, const bool force_blocking_read)
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)
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)
ImBuf * filelist_get_preview_image(FileList *filelist, const int index)
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)
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])
void filelist_tag_reload_asset_library(FileList *filelist)
static void filelist_cache_clear(FileListEntryCache *cache, size_t new_size)
ImBuf * filelist_geticon_special_file_image_ex(const FileDirEntry *file)
int ED_file_extension_icon(const char *path)
void filelist_setrecursion(FileList *filelist, const int recursion_level)
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_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)
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)
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)
int filelist_geticon_file_type(FileList *filelist, const int index, const bool is_main)
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)
@ FL_FORCE_RESET_MAIN_FILES
@ FL_RELOAD_ASSET_LIBRARY
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)
ImBuf * filelist_file_get_preview_image(const FileDirEntry *file)
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)
static int filelist_geticon_file_type_ex(const FileList *filelist, const FileDirEntry *file, const bool is_main, const bool ignore_libdir)
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)
void filelist_file_get_full_path(const FileList *filelist, const FileDirEntry *file, char r_filepath[FILE_MAX_LIBEXTRA])
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)
bool filelist_needs_filtering(FileList *filelist)
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)
ImBuf * filelist_geticon_special_file_image(FileList *filelist, const int index)
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)
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)
#define ID_IS_LINKED(_id)
#define MEM_reallocN(vmemh, len)
void * MEM_mallocN(size_t len, const char *str)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
bool MOV_is_movie_file(const char *filepath)
AssetLibraryReference current_file_library_reference()
AssetCatalogFilterSettings * file_create_asset_catalog_filter_settings()
static void update(bNodeTree *ntree)
User defined tag. Currently only used by assets, could be used more often at some point....
AssetMetaData * asset_data
struct FileDirEntry * next
AssetRepresentationHandle * asset
BLODataBlockInfo datablock_info
FileIndexerUpdateIndexFunc update_index
FileIndexerFinishedFunc filelist_finished
FileIndexerReadIndexFunc read_index
FileIndexerFreeUserDataFunc free_user_data
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
struct FileListInternEntry::@323235363311344055157072064130162321141235372073 local_data
std::weak_ptr< asset_system::AssetRepresentation > asset
FileListInternEntry * next
FileListInternEntry * prev
bool blenderlib_has_no_preview
asset_system::AssetRepresentation * get_asset() const
FileListInternEntry ** filtered
asset_system::AssetLibrary * load_asset_library
char main_filepath[FILE_MAX]
bool reload_asset_library
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))