[Bf-blender-cvs] [aa33680] asset-experiments: Merge branch 'master' into asset-experiments

Bastien Montagne noreply at git.blender.org
Thu Jan 1 12:05:13 CET 2015


Commit: aa336809fa9b3a786e946122e3133a6ab2414428
Author: Bastien Montagne
Date:   Thu Jan 1 11:08:21 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rBaa336809fa9b3a786e946122e3133a6ab2414428

Merge branch 'master' into asset-experiments

Conflicts:
	source/blender/editors/space_file/filelist.c
	source/blender/editors/space_file/filelist.h
	source/blender/editors/space_file/space_file.c

===================================================================



===================================================================

diff --cc source/blender/editors/space_file/filelist.c
index 0f9b09b,4177901..e765414
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@@ -46,11 -46,8 +46,12 @@@
  
  #include "BLI_blenlib.h"
  #include "BLI_fileops_types.h"
 +#include "BLI_fnmatch.h"
  #include "BLI_linklist.h"
 +#include "BLI_math.h"
 +#include "BLI_threads.h"
  #include "BLI_utildefines.h"
++#include "BLI_fileops_types.h"
  
  #ifdef WIN32
  #  include "BLI_winstuff.h"
@@@ -101,10 -206,9 +215,11 @@@ typedef struct FileImage 
  
  typedef struct FileListFilter {
  	bool hide_dot;
+ 	bool hide_parent;
  	unsigned int filter;
 +	unsigned int filter_id;
  	char filter_glob[64];
 +	char filter_search[66];  /* + 2 for heading/trailing implicit '*' wildcards. */
  } FileListFilter;
  
  typedef struct FileList {
@@@ -116,27 -218,23 +229,31 @@@
  	short prv_w;
  	short prv_h;
  
 -	bool changed;
 +	bool force_reset;
 +	bool force_refresh;
 +	bool filelist_ready;
 +	bool filelist_pending;
- 	bool need_sorting;
  
  	short sort;
+ 	bool need_sorting;
+ 
  	FileListFilter filter_data;
+ 	int *fidx;  /* Also used to detect when we need to filter! */
+ 	int numfiltered;
+ 
+ 	bool need_thumbnails;
+ 
++	bool use_recursion;
++	short recursion_level;
 +
  	struct BlendHandle *libfiledata;
- 	bool hide_parent;
  
 -	void (*readf)(struct FileList *);
 +	void (*read_jobf)(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
  	bool (*filterf)(struct direntry *, const char *, FileListFilter *);
- 
- 	bool use_recursion;
- 	short recursion_level;
  } FileList;
  
 +#define FILELIST_MAX_RECURSION 3
 +
  #define FILENAME_IS_BREADCRUMBS(_n) \
  	(((_n)[0] == '.' && (_n)[1] == '\0') || ((_n)[0] == '.' && (_n)[1] == '.' && (_n)[2] == '\0'))
  
@@@ -166,7 -259,16 +278,17 @@@
  static ImBuf *gSpecialFileImages[SPECIAL_IMG_MAX];
  
  
- /* ******************* SORT ******************* */
 -static void filelist_from_main(struct FileList *filelist);
 -static void filelist_from_library(struct FileList *filelist);
++static void filelist_readjob_main(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
++static void filelist_readjob_lib(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
++static void filelist_readjob_dir(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
+ 
 -static void filelist_read_main(struct FileList *filelist);
 -static void filelist_read_library(struct FileList *filelist);
 -static void filelist_read_dir(struct FileList *filelist);
++/* helper, could probably go in BKE actually? */
++static int groupname_to_code(const char *group);
++static unsigned int groupname_to_filter_id(const char *group);
+ 
+ static void filelist_filter_clear(FileList *filelist);
+ 
+ /* ********** Sort helpers ********** */
  
  static bool compare_is_directory(const struct direntry *entry)
  {
@@@ -325,160 -410,59 +447,87 @@@ static int compare_extension(const voi
  	if (strcmp(entry2->relname, ".") == 0) return (1);
  	if (strcmp(entry1->relname, "..") == 0) return (-1);
  	if (strcmp(entry2->relname, "..") == 0) return (1);
 -	
 -	return (BLI_strcasecmp(sufix1, sufix2));
 +
 +	if ((entry1->flags & BLENDERLIB) && !(entry2->flags & BLENDERLIB)) return -1;
 +	if (!(entry1->flags & BLENDERLIB) && (entry2->flags & BLENDERLIB)) return 1;
 +	if ((entry1->flags & BLENDERLIB) && (entry2->flags & BLENDERLIB)) {
 +		char lib1[FILE_MAX_LIBEXTRA], lib2[FILE_MAX_LIBEXTRA];
 +		char *group1, *group2, *name1, *name2;
 +		int grp_comp;
 +
 +		BLO_library_path_explode(entry1->path, lib1, &group1, &name1);
 +		BLO_library_path_explode(entry2->path, lib2, &group2, &name2);
 +
 +		BLI_assert(group1);
 +		BLI_assert(group2);
 +
 +		grp_comp = strcmp(group1, group2);
 +		if (grp_comp != 0 || (!name1 && !name2)) {
 +			return grp_comp;
 +		}
 +
 +		if (!name1) {
 +			return -1;
 +		}
 +		if (!name2) {
 +			return 1;
 +		}
 +		return BLI_strcasecmp(name1, name2);
 +	}
 +
 +	return BLI_strcasecmp(sufix1, sufix2);
  }
  
- 
- /* -----------------FOLDERLIST (previous/next) -------------- */
- 
- ListBase *folderlist_new(void)
- {
- 	ListBase *p = MEM_callocN(sizeof(ListBase), "folderlist");
- 	return p;
- }
- 
- void folderlist_popdir(struct ListBase *folderlist, char *dir)
+ bool filelist_need_sorting(struct FileList *filelist)
  {
- 	const char *prev_dir;
- 	struct FolderList *folder;
- 	folder = folderlist->last;
- 
- 	if (folder) {
- 		/* remove the current directory */
- 		MEM_freeN(folder->foldername);
- 		BLI_freelinkN(folderlist, folder);
- 
- 		folder = folderlist->last;
- 		if (folder) {
- 			prev_dir = folder->foldername;
- 			BLI_strncpy(dir, prev_dir, FILE_MAXDIR);
- 		}
- 	}
- 	/* delete the folder next or use setdir directly before PREVIOUS OP */
+ 	return filelist->need_sorting && (filelist->sort != FILE_SORT_NONE);
  }
  
- void folderlist_pushdir(ListBase *folderlist, const char *dir)
+ void filelist_sort(struct FileList *filelist)
  {
- 	struct FolderList *folder, *previous_folder;
- 	previous_folder = folderlist->last;
+ 	if (filelist_need_sorting(filelist)) {
+ 		filelist->need_sorting = false;
  
- 	/* check if already exists */
- 	if (previous_folder && previous_folder->foldername) {
- 		if (BLI_path_cmp(previous_folder->foldername, dir) == 0) {
- 			return;
+ 		switch (filelist->sort) {
+ 			case FILE_SORT_ALPHA:
+ 				qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_name);
+ 				break;
+ 			case FILE_SORT_TIME:
+ 				qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_date);
+ 				break;
+ 			case FILE_SORT_SIZE:
+ 				qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_size);
+ 				break;
+ 			case FILE_SORT_EXTENSION:
+ 				qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_extension);
+ 				break;
+ 			case FILE_SORT_NONE:  /* Should never reach this point! */
+ 			default:
+ 				BLI_assert(0);
+ 				return;
  		}
- 	}
- 
- 	/* create next folder element */
- 	folder = (FolderList *)MEM_mallocN(sizeof(FolderList), "FolderList");
- 	folder->foldername = BLI_strdup(dir);
- 
- 	/* add it to the end of the list */
- 	BLI_addtail(folderlist, folder);
- }
- 
- const char *folderlist_peeklastdir(ListBase *folderlist)
- {
- 	struct FolderList *folder;
- 
- 	if (!folderlist->last)
- 		return NULL;
- 
- 	folder = folderlist->last;
- 	return folder->foldername;
- }
  
- int folderlist_clear_next(struct SpaceFile *sfile)
- {
- 	struct FolderList *folder;
- 
- 	/* if there is no folder_next there is nothing we can clear */
- 	if (!sfile->folders_next)
- 		return 0;
- 
- 	/* if previous_folder, next_folder or refresh_folder operators are executed it doesn't clear folder_next */
- 	folder = sfile->folders_prev->last;
- 	if ((!folder) || (BLI_path_cmp(folder->foldername, sfile->params->dir) == 0))
- 		return 0;
- 
- 	/* eventually clear flist->folders_next */
- 	return 1;
- }
- 
- /* not listbase itself */
- void folderlist_free(ListBase *folderlist)
- {
- 	if (folderlist) {
- 		FolderList *folder;
- 		for (folder = folderlist->first; folder; folder = folder->next)
- 			MEM_freeN(folder->foldername);
- 		BLI_freelistN(folderlist);
+ 		filelist_filter_clear(filelist);
  	}
  }
  
- ListBase *folderlist_duplicate(ListBase *folderlist)
+ void filelist_setsorting(struct FileList *filelist, const short sort)
  {
- 	
- 	if (folderlist) {
- 		ListBase *folderlistn = MEM_callocN(sizeof(ListBase), "copy folderlist");
- 		FolderList *folder;
- 		
- 		BLI_duplicatelist(folderlistn, folderlist);
- 		
- 		for (folder = folderlistn->first; folder; folder = folder->next) {
- 			folder->foldername = MEM_dupallocN(folder->foldername);
- 		}
- 		return folderlistn;
+ 	if (filelist->sort != sort) {
+ 		filelist->sort = sort;
+ 		filelist->need_sorting = true;
  	}
- 	return NULL;
  }
  
+ /* ********** Filter helpers ********** */
  
- /* ------------------FILELIST------------------------ */
- 
- static void filelist_readjob_main(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
- static void filelist_readjob_lib(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
- static void filelist_readjob_dir(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
- 
- /* helper, could probably go in BKE actually? */
- static int groupname_to_code(const char *group);
- static unsigned int groupname_to_filter_id(const char *group);
- 
- static bool is_hidden_file(const char *filename, const bool hide_dot)
+ static bool is_hidden_file(const char *filename, FileListFilter *filter)
  {
 +	char *sep = (char *)BLI_last_slash(filename);
  	bool is_hidden = false;
  
- 	if (hide_dot) {
- 		if (filename[0] == '.' && filename[1] != '.' && filename[1] != 0) {
+ 	if (filter->hide_dot) {
+ 		if (filename[0] == '.' && filename[1] != '.' && filename[1] != '\0') {
  			is_hidden = true; /* ignore .file */
  		}
  		else {
@@@ -488,25 -472,14 +537,30 @@@
  			}
  		}
  	}
- 	if (!is_hidden && ((filename[0] == '.') && (filename[1] == 0))) {
+ 	if (!is_hidden && filter->hide_parent) {
+ 		if (filename[0] == '.' && filename[1] == '.' && filename[2] == '\0') {
+ 			is_hidden = true; /* ignore .. */
+ 		}
+ 	}
+ 	if (!is_hidden && ((filename[0] == '.') && (filename[1] == '\0'))) {
  		is_hidden = true; /* ignore . */
  	}
 +	/* filename might actually be a piece of path, in which case we have to check all its parts. */
 +	if (!is_hidden && sep) {
 +		char tmp_filename[FILE_MAX_LIBEXTRA];
 +
 +		BLI_strncpy(tmp_filename, filename, sizeof(tmp_filename));
 +		sep = tmp_filename + (sep - filename);
 +		while (sep) {
 +			BLI_assert(sep[1] != '\0');
- 			if (is_hidden_file(sep + 1, hide_dot)) {
++			if (is_hidden_file(sep + 1, filter)) {
 +				is_hidden = true;
 +				break;
 +			}
 +			*sep = '\0';
 +			sep = (char *)BLI_last_slash(tmp_filename);
 +		}
 +	}
  	return is_hidden;
  }
  
@@@ -533,29 -501,11 +587,29 @@@ static bool is_filtered_file(struct dir
  
  static bool is_filtered_lib(struct direntry *file, const char *root, FileListFilter *filter)
  {
 -	bool is_filtered = !is_hidden_file(file->relname, filter);
 -	char dir[FILE_MAXDIR], group[BLO_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list