[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