[Bf-blender-cvs] [67040e0] asset-experiments: Fix issues when giving a non-existent dir to filebrowser.
Bastien Montagne
noreply at git.blender.org
Thu Jan 1 16:58:51 CET 2015
Commit: 67040e08d3ebbdb8421cc800d3b551cc86eaec86
Author: Bastien Montagne
Date: Thu Jan 1 16:04:23 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rB67040e08d3ebbdb8421cc800d3b551cc86eaec86
Fix issues when giving a non-existent dir to filebrowser.
Note: unlike in current master, path is checked immediately when setting it
into filelist (simpler now that filelist building itself is threaded).
`filelist_setdir()` modifies in place given path if this one is not valid.
===================================================================
M source/blender/blenkernel/BKE_icons.h
M source/blender/editors/space_file/filelist.c
M source/blender/editors/space_file/filelist.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index 84cd5dc..5c4ab3c 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -48,6 +48,8 @@ typedef struct Icon Icon;
struct PreviewImage;
struct ID;
+enum eIconSizes;
+
void BKE_icons_init(int first_dyn_id);
/* return icon id for library object or create new icon if not found */
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 61af5e4..636f84e 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -248,7 +248,13 @@ typedef struct FileList {
struct BlendHandle *libfiledata;
+ /* Set given path as root directory, may change given string in place to a valid value. */
+ void (*checkdirf)(struct FileList *, char *);
+
+ /* Fill filelist (to be called by read job). */
void (*read_jobf)(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
+
+ /* Filter current filelist. */
bool (*filterf)(struct direntry *, const char *, FileListFilter *);
} FileList;
@@ -918,20 +924,43 @@ int filelist_geticon(struct FileList *filelist, const int index)
/* ********** Main ********** */
+static void filelist_checkdir_dir(struct FileList *UNUSED(filelist), char *r_dir)
+{
+ BLI_make_exist(r_dir);
+}
+
+static void filelist_checkdir_lib(struct FileList *UNUSED(filelist), char *r_dir)
+{
+ char dir[FILE_MAXDIR];
+ if (!BLO_library_path_explode(r_dir, dir, NULL, NULL)) {
+ /* if not a valid library, we need it to be a valid directory! */
+ BLI_make_exist(r_dir);
+ }
+}
+
+static void filelist_checkdir_main(struct FileList *filelist, char *r_dir)
+{
+ /* TODO */
+ filelist_checkdir_lib(filelist, r_dir);
+}
+
FileList *filelist_new(short type)
{
FileList *p = MEM_callocN(sizeof(FileList), "filelist");
switch (type) {
case FILE_MAIN:
+ p->checkdirf = filelist_checkdir_main;
p->read_jobf = filelist_readjob_main;
p->filterf = is_filtered_main;
break;
case FILE_LOADLIB:
+ p->checkdirf = filelist_checkdir_lib;
p->read_jobf = filelist_readjob_lib;
p->filterf = is_filtered_lib;
break;
default:
+ p->checkdirf = filelist_checkdir_dir;
p->read_jobf = filelist_readjob_dir;
p->filterf = is_filtered_file;
break;
@@ -1021,10 +1050,22 @@ const char *filelist_dir(struct FileList *filelist)
return filelist->dir;
}
-void filelist_setdir(struct FileList *filelist, const char *dir)
+/**
+ * May modifies in place given r_dir, which is expected to be FILE_MAX_LIBEXTRA length.
+ */
+void filelist_setdir(struct FileList *filelist, char *r_dir)
{
- if (!STREQ(filelist->dir, dir)) {
- BLI_strncpy(filelist->dir, dir, sizeof(filelist->dir));
+#ifndef NDEBUG
+ size_t len = strlen(r_dir);
+ BLI_assert((len < FILE_MAX_LIBEXTRA - 1) || r_dir[len - 1] == '/');
+#endif
+
+ BLI_cleanup_dir(G.main->name, r_dir);
+ BLI_add_slash(r_dir);
+ filelist->checkdirf(filelist, r_dir);
+
+ if (!STREQ(filelist->dir, r_dir)) {
+ BLI_strncpy(filelist->dir, r_dir, sizeof(filelist->dir));
filelist->force_reset = true;
}
}
@@ -1777,15 +1818,11 @@ static void filelist_readjob_dir(
BLI_mutex_lock(lock);
- BLI_add_slash(filelist->dir);
-
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(false, main_name, filelist, &filelist_buffsize, dir, filter_glob, 0,
stop, do_update, progress, &done_files, lock);
}
@@ -1803,8 +1840,6 @@ static void filelist_readjob_lib(
BLI_mutex_lock(lock);
- BLI_add_slash(filelist->dir);
-
BLI_strncpy(dir, filelist->dir, sizeof(dir));
BLI_strncpy(filter_glob, filelist->filter_data.filter_glob, sizeof(filter_glob));
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index fd4f0fa..04af8b5 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -90,7 +90,7 @@ void filelist_clear(struct FileList *filelist);
void filelist_free(struct FileList *filelist);
const char * filelist_dir(struct FileList *filelist);
-void filelist_setdir(struct FileList *filelist, const char *dir);
+void filelist_setdir(struct FileList *filelist, char *r_dir);
int filelist_empty(struct FileList *filelist);
int filelist_numfiles(struct FileList *filelist);
More information about the Bf-blender-cvs
mailing list