[Bf-blender-cvs] [8f4d6f6] asset-experiments: Merge branch 'master' into asset-experiments
Bastien Montagne
noreply at git.blender.org
Sat Jan 3 17:08:10 CET 2015
Commit: 8f4d6f62ea02de2c5589087c2bd9928874844fcf
Author: Bastien Montagne
Date: Sat Jan 3 17:07:16 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rB8f4d6f62ea02de2c5589087c2bd9928874844fcf
Merge branch 'master' into asset-experiments
Conflicts:
source/blender/blenkernel/BKE_camera.h
source/blender/blenkernel/intern/camera.c
source/blender/blenlib/BLI_fileops.h
source/blender/blenlib/intern/storage.c
source/blender/editors/space_file/filelist.c
source/blender/makesrna/intern/rna_object_api.c
tests/gtests/blenlib/BLI_path_util_test.cc
===================================================================
===================================================================
diff --cc source/blender/editors/space_file/filelist.c
index 65f8a69,abfa1ed..828d85b
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@@ -675,20 -565,14 +675,20 @@@ void filelist_setfilter_options(FileLis
if ((filelist->filter_data.hide_dot != hide_dot) ||
(filelist->filter_data.hide_parent != hide_parent) ||
(filelist->filter_data.filter != filter) ||
- (!STREQ(filelist->filter_data.filter_glob, filter_glob)))
+ (filelist->filter_data.filter_id != filter_id) ||
+ !STREQ(filelist->filter_data.filter_glob, filter_glob) ||
- (BLI_fnmatch_strcmp_ignore_endswildcards(filelist->filter_data.filter_search, filter_search) != 0))
++ (BLI_strcmp_ignore_pad(filelist->filter_data.filter_search, filter_search, '*') != 0))
{
filelist->filter_data.hide_dot = hide_dot;
filelist->filter_data.hide_parent = hide_parent;
filelist->filter_data.filter = filter;
+ filelist->filter_data.filter_id = filter_id;
BLI_strncpy(filelist->filter_data.filter_glob, filter_glob, sizeof(filelist->filter_data.filter_glob));
- BLI_fnmatch_strncpy_add_endswildcards(filelist->filter_data.filter_search, filter_search,
- sizeof(filelist->filter_data.filter_search));
++ BLI_strncpy_ensure_pad(filelist->filter_data.filter_search, filter_search, '*',
++ sizeof(filelist->filter_data.filter_search));
+ /* And now, free filtered data so that we now we have to filter again. */
filelist_filter_clear(filelist);
}
}
@@@ -968,23 -722,6 +968,23 @@@ FileList *filelist_new(short type
return p;
}
+void filelist_clear(struct FileList *filelist)
+{
+ if (!filelist) {
+ return;
+ }
+
+ if (filelist->fidx) {
+ MEM_freeN(filelist->fidx);
+ filelist->fidx = NULL;
+ }
+
- BLI_free_filelist(filelist->filelist, filelist->numfiles);
++ BLI_filelist_free(filelist->filelist, filelist->numfiles, NULL);
+ filelist->numfiles = 0;
+ filelist->filelist = NULL;
+ filelist->numfiltered = 0;
+}
+
void filelist_free(struct FileList *filelist)
{
if (!filelist) {
@@@ -999,9 -736,7 +999,9 @@@
filelist->need_sorting = false;
filelist->sort = FILE_SORT_NONE;
+ filelist->need_thumbnails = false;
+
- BLI_free_filelist(filelist->filelist, filelist->numfiles);
+ BLI_filelist_free(filelist->filelist, filelist->numfiles, NULL);
filelist->numfiles = 0;
filelist->filelist = NULL;
}
@@@ -1714,291 -1325,6 +1714,291 @@@ static void filelist_readjob_main_rec(s
}
}
}
+#endif
+
+static void filelist_readjob_dir_lib_rec(
+ const bool do_lib, const char *main_name,
+ FileList *filelist, int *filelist_buffsize, const char *dir, const char *filter_glob, const int recursion_level,
+ short *stop, short *do_update, float *progress, int *done_files, ThreadMutex *lock)
+{
+ /* only used if recursing, will contain all non-immediate children then. */
+ struct direntry *file, *files = NULL;
+ bool is_lib = do_lib;
+ int num_files = 0;
+ int i;
+
+ if (!filelist) {
+ return;
+ }
+
+ if (do_lib) {
+ filelist_readjob_list_lib(dir, &files, &num_files);
+
+ if (!files) {
+ is_lib = false;
- num_files = BLI_dir_contents(dir, &files);
++ num_files = BLI_filelist_dir_contents(dir, &files);
+ }
+ }
+ else {
- num_files = BLI_dir_contents(dir, &files);
++ num_files = BLI_filelist_dir_contents(dir, &files);
+ }
+
+ if (!files) {
+ return;
+ }
+
+ /* We only set filtypes for our own level, sub ones will be set by subcalls. */
+ filelist_setfiletypes(dir, files, num_files, filter_glob);
+
+ if (do_lib) {
+ /* Promote blend files from mere file status to prestigious directory one! */
+ for (i = 0, file = files; i < num_files; i++, file++) {
+ if (BLO_has_bfile_extension(file->relname)) {
+ char name[FILE_MAX];
+
+ BLI_join_dirfile(name, sizeof(name), dir, file->relname);
+
+ /* prevent current file being used as acceptable dir */
+ if (BLI_path_cmp(main_name, name) != 0) {
+ file->type &= ~S_IFMT;
+ file->type |= S_IFDIR;
+ }
+ }
+ }
+ }
+
+ BLI_mutex_lock(lock);
+
+ filelist_readjob_merge_sublist(&filelist->filelist, filelist_buffsize, &filelist->numfiles, filelist->dir,
+ dir, files, num_files, recursion_level != 0);
+
+ (*done_files)++;
+ *progress = (float)(*done_files) / filelist->numfiles;
+
+ //~ printf("%f (%d / %d)\n", *progress, *done_files, filelist->numfiles);
+
+ BLI_mutex_unlock(lock);
+
+ *do_update = true;
+
+ /* in case it's a lib we don't care anymore about max recursion level... */
+ if (!*stop && filelist->use_recursion && ((do_lib && is_lib) || (recursion_level < FILELIST_MAX_RECURSION))) {
+ for (i = 0, file = files; i < num_files && !*stop; i++, file++) {
+ char subdir[FILE_MAX];
+
+ if (FILENAME_IS_BREADCRUMBS(file->relname)) {
+ /* do not increase done_files here, we completly ignore those. */
+ continue;
+ }
+ else if ((file->type & S_IFDIR) == 0) {
+ (*done_files)++;
+ continue;
+ }
+
+ BLI_join_dirfile(subdir, sizeof(subdir), dir, file->relname);
+ BLI_cleanup_dir(main_name, subdir);
+ filelist_readjob_dir_lib_rec(do_lib, main_name,
+ filelist, filelist_buffsize, subdir, filter_glob, recursion_level + 1,
+ stop, do_update, progress, done_files, lock);
+ }
+ }
- BLI_free_filelist(files, num_files);
++ BLI_filelist_free(files, num_files, NULL);
+}
+
+static void filelist_readjob_dir(
+ FileList *filelist, const char *main_name, short *stop, short *do_update, float *progress, ThreadMutex *lock)
+{
+ char dir[FILE_MAX];
+ char filter_glob[64]; /* TODO should be define! */
+ int filelist_buffsize = 0;
+ int done_files = 0;
+
+ BLI_assert(filelist->fidx == NULL);
+ BLI_assert(filelist->filelist == NULL);
+
+ BLI_mutex_lock(lock);
+
+ BLI_strncpy(dir, filelist->dir, sizeof(dir));
+ BLI_strncpy(filter_glob, filelist->filter_data.filter_glob, sizeof(filter_glob));
+
+ BLI_mutex_unlock(lock);
+
+ filelist_readjob_dir_lib_rec(false, main_name, filelist, &filelist_buffsize, dir, filter_glob, 0,
+ stop, do_update, progress, &done_files, lock);
+}
+
+static void filelist_readjob_lib(
+ FileList *filelist, const char *main_name, short *stop, short *do_update, float *progress, ThreadMutex *lock)
+{
+ char dir[FILE_MAX];
+ char filter_glob[64]; /* TODO should be define! */
+ int filelist_buffsize = 0;
+ int done_files = 0;
+
+ BLI_assert(filelist->fidx == NULL);
+ BLI_assert(filelist->filelist == NULL);
+
+ BLI_mutex_lock(lock);
+
+ BLI_strncpy(dir, filelist->dir, sizeof(dir));
+ BLI_strncpy(filter_glob, filelist->filter_data.filter_glob, sizeof(filter_glob));
+
+ BLI_mutex_unlock(lock);
+
+ BLI_cleanup_dir(main_name, dir);
+
+ filelist_readjob_dir_lib_rec(true, main_name, filelist, &filelist_buffsize, dir, filter_glob, 0,
+ stop, do_update, progress, &done_files, lock);
+}
+
+static void filelist_readjob_main(
+ FileList *filelist, const char *main_name, short *stop, short *do_update, float *progress, ThreadMutex *lock)
+{
+ BLI_mutex_lock(lock);
+
+ /* TODO! */
+ filelist_readjob_dir(filelist, main_name, stop, do_update, progress, lock);
+
+ BLI_mutex_unlock(lock);
+}
+
+
+typedef struct FileListReadJob {
+ ThreadMutex lock;
+ char main_name[FILE_MAX];
+ struct FileList *filelist;
+ struct FileList *tmp_filelist;
+ //~ ReportList reports;
+} FileListReadJob;
+
+static void filelist_readjob_startjob(void *flrjv, short *stop, short *do_update, float *progress)
+{
+ FileListReadJob *flrj = flrjv;
+
+ printf("START filelist reading (%d files, main thread: %d)\n", flrj->filelist->numfiles, BLI_thread_is_main());
+
+ BLI_mutex_lock(&flrj->lock);
+
+ BLI_assert((flrj->tmp_filelist == NULL) && flrj->filelist);
+
+ flrj->tmp_filelist = MEM_dupallocN(flrj->filelist);
+
+ BLI_mutex_unlock(&flrj->lock);
+
+ flrj->tmp_filelist->filelist = NULL;
+ flrj->tmp_filelist->fidx = NULL;
+ flrj->tmp_filelist->numfiles = 0;
+ flrj->tmp_filelist->fidx = 0;
+ flrj->tmp_filelist->libfiledata = NULL;
+
+ flrj->tmp_filelist->read_jobf(flrj->tmp_filelist, flrj->main_name, stop, do_update, progress, &flrj->lock);
+
+ printf("END filelist reading (%d files, STOPPED: %d, DO_UPDATE: %d)\n", flrj->filelist->numfiles, *stop, *do_update);
+}
+
+static void filelist_readjob_update(void *flrjv)
+{
+ FileListReadJob *flrj = flrjv;
+ struct direntry *new_entries = NULL;
+ int num_new_entries = 0;
+
+ BLI_mutex_lock(&flrj->lock);
+
+ if (flrj->tmp_filelist->numfiles != flrj->filelist->numfiles) {
+ num_new_entries = flrj->tmp_filelist->numfiles;
+ /* This way we are sure we won't share any mem with background job! */
+ /* Note direntry->poin is not handled here, should not matter though currently. */
- BLI_duplicate_filelist(&new_entries, flrj->tmp_filelist->filelist, num_new_entries, NULL);
++ BLI_filelist_duplicate(&new_entries, flrj->tmp_filelist->filelist, num_new_entries, NULL);
+ }
+
+ BLI_mutex_unlock(&flrj->lock);
+
+ if (new_entries) {
+ if (flrj->filelist->filelist) {
- BLI_free_filelist(flrj->filelist->filelist, flrj->filelist->numfiles);
++ BLI_filelist_free(flrj->filelist->filelist, flrj->filelist->numfiles, NULL);
+ }
+ flrj->filelist->filelist = new_entries;
+ flrj->filelist->numfiles = num_new_entries;
+ if (flrj->filelist->fidx) {
+ MEM_freeN(flrj->filelist->fidx);
+ flrj->filelist->fidx = NULL;
+ flrj->filelist->numfiltered = 0;
+ }
+
+ flrj->filelist->need_sorting = true;
+ flrj->filelist->force_refresh = true;
+ /* Better be explicit here, since we overwrite filelist->filelist on each run of this update func,
+ * it would be stupid to start thumbnail job! */
+ flrj->filelist->need_thumbnails = false;
+ }
+}
+
+static void filelist_readjob_endjob(void *flrjv)
+{
+ FileListReadJob *flrj = flrjv;
+
+ flrj->filelist->filelist_pending = false;
+ flrj->filelist->filelist_ready = true;
+ /* Now we can update
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list