[Bf-blender-cvs] [d9b4186] asset-experiments: Refactor filtering code, should be easier to add new filter options now.

Bastien Montagne noreply at git.blender.org
Thu Dec 4 18:49:48 CET 2014


Commit: d9b4186e6e5edf67bb9aee4fd35645f79f63e87a
Author: Bastien Montagne
Date:   Thu Dec 4 17:30:51 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rBd9b4186e6e5edf67bb9aee4fd35645f79f63e87a

Refactor filtering code, should be easier to add new filter options now.

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

M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/makesdna/DNA_space_types.h

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

diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 9729ef3..989c261 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -99,6 +99,13 @@ typedef struct ThumbnailJob {
 	ReportList reports;
 } ThumbnailJob;
 
+typedef struct FileListFilter {
+	bool hide_dot;
+	unsigned int filter;
+	char filter_glob[64];
+	char filter_search[64];
+} FileListFilter;
+
 typedef struct FileList {
 	struct direntry *filelist;
 	int *fidx;
@@ -107,16 +114,15 @@ typedef struct FileList {
 	char dir[FILE_MAX];
 	short prv_w;
 	short prv_h;
-	short hide_dot;
-	unsigned int filter;
-	char filter_glob[64];
 	short changed;
 
+	FileListFilter filter_data;
+
 	struct BlendHandle *libfiledata;
 	short hide_parent;
 
 	void (*readf)(struct FileList *);
-	bool (*filterf)(struct direntry *file, const char *dir, unsigned int filter, short hide_dot);
+	bool (*filterf)(struct direntry *file, const char *dir, FileListFilter *filter);
 
 } FileList;
 
@@ -410,7 +416,7 @@ static void filelist_from_library(struct FileList *filelist, const bool add_pare
 /* helper, could probably go in BKE actually? */
 static int groupname_to_code(const char *group);
 
-static bool is_hidden_file(const char *filename, short hide_dot)
+static bool is_hidden_file(const char *filename, const bool hide_dot)
 {
 	bool is_hidden = false;
 
@@ -436,15 +442,15 @@ static bool is_hidden_file(const char *filename, short hide_dot)
 	return is_hidden;
 }
 
-static bool is_filtered_file(struct direntry *file, const char *UNUSED(dir), unsigned int filter, short hide_dot)
+static bool is_filtered_file(struct direntry *file, const char *UNUSED(dir), FileListFilter *filter)
 {
 	bool is_filtered = false;
-	if (filter) {
-		if (file->flags & filter) {
+	if (filter->filter) {
+		if (file->flags & filter->filter) {
 			is_filtered = true;
 		}
 		else if (file->type & S_IFDIR) {
-			if (filter & FOLDERFILE) {
+			if (filter->filter & FOLDERFILE) {
 				is_filtered = true;
 			}
 		}
@@ -452,41 +458,41 @@ static bool is_filtered_file(struct direntry *file, const char *UNUSED(dir), uns
 	else {
 		is_filtered = true;
 	}
-	return is_filtered && !is_hidden_file(file->relname, hide_dot);
+	return is_filtered && !is_hidden_file(file->relname, filter->hide_dot);
 }
 
-static bool is_filtered_lib(struct direntry *file, const char *dir, unsigned int filter, short hide_dot)
+static bool is_filtered_lib(struct direntry *file, const char *dir, FileListFilter *filter)
 {
 	bool is_filtered = false;
 	char tdir[FILE_MAX], tgroup[BLO_GROUP_MAX];
 	if (BLO_is_a_library(dir, tdir, tgroup)) {
-		is_filtered = !is_hidden_file(file->relname, hide_dot);
+		is_filtered = !is_hidden_file(file->relname, filter->hide_dot);
 	}
 	else {
-		is_filtered = is_filtered_file(file, dir, filter, hide_dot);
+		is_filtered = is_filtered_file(file, dir, filter);
 	}
 	return is_filtered;
 }
 
-static bool is_filtered_lib_flat(struct direntry *file, const char *dir, unsigned int filter, short hide_dot)
+static bool is_filtered_lib_flat(struct direntry *file, const char *dir, FileListFilter *filter)
 {
 	bool is_filtered = false;
 	char tdir[FILE_MAX], tgroup[BLO_GROUP_MAX];
 	if (BLO_is_a_library(dir, tdir, tgroup)) {
-		is_filtered = !is_hidden_file(file->relname, hide_dot);
-		if (filter && !(filter & FOLDERFILE) && (file->type & S_IFDIR) && !STREQ(file->relname, "..")) {
+		is_filtered = !is_hidden_file(file->relname, filter->hide_dot);
+		if (filter && !(filter->filter & FOLDERFILE) && (file->type & S_IFDIR) && !STREQ(file->relname, "..")) {
 			is_filtered = false;
 		}
 	}
 	else {
-		is_filtered = is_filtered_file(file, dir, filter, hide_dot);
+		is_filtered = is_filtered_file(file, dir, filter);
 	}
 	return is_filtered;
 }
 
-static bool is_filtered_main(struct direntry *file, const char *UNUSED(dir), unsigned int UNUSED(filter), short hide_dot)
+static bool is_filtered_main(struct direntry *file, const char *UNUSED(dir), FileListFilter *filter)
 {
-	return !is_hidden_file(file->relname, hide_dot);
+	return !is_hidden_file(file->relname, filter->hide_dot);
 }
 
 void filelist_filter(FileList *filelist)
@@ -500,7 +506,7 @@ void filelist_filter(FileList *filelist)
 	/* How many files are left after filter ? */
 	for (i = 0; i < filelist->numfiles; ++i) {
 		struct direntry *file = &filelist->filelist[i];
-		if (filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot)) {
+		if (filelist->filterf(file, filelist->dir, &filelist->filter_data)) {
 			num_filtered++;
 		}
 	}
@@ -514,7 +520,7 @@ void filelist_filter(FileList *filelist)
 
 	for (i = 0, j = 0; i < filelist->numfiles; ++i) {
 		struct direntry *file = &filelist->filelist[i];
-		if (filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot)) {
+		if (filelist->filterf(file, filelist->dir, &filelist->filter_data)) {
 			filelist->fidx[j++] = i;
 		}
 	}
@@ -603,10 +609,8 @@ void filelist_free(struct FileList *filelist)
 	BLI_free_filelist(filelist->filelist, filelist->numfiles);
 	filelist->numfiles = 0;
 	filelist->filelist = NULL;
-	filelist->filter = 0;
-	filelist->filter_glob[0] = '\0';
 	filelist->numfiltered = 0;
-	filelist->hide_dot = 0;
+	memset(&filelist->filter_data, 0, sizeof(filelist->filter_data));
 }
 
 void filelist_freelib(struct FileList *filelist)
@@ -853,19 +857,19 @@ int filelist_find(struct FileList *filelist, const char *filename)
 	return fidx;
 }
 
-void filelist_hidedot(struct FileList *filelist, short hide)
+void filelist_hidedot(struct FileList *filelist, const bool hide)
 {
-	filelist->hide_dot = hide;
+	filelist->filter_data.hide_dot = hide;
 }
 
-void filelist_setfilter(struct FileList *filelist, unsigned int filter)
+void filelist_setfilter(struct FileList *filelist, const unsigned int filter)
 {
-	filelist->filter = filter;
+	filelist->filter_data.filter = filter;
 }
 
 void filelist_setfilter_types(struct FileList *filelist, const char *filter_glob)
 {
-	BLI_strncpy(filelist->filter_glob, filter_glob, sizeof(filelist->filter_glob));
+	BLI_strncpy(filelist->filter_data.filter_glob, filter_glob, sizeof(filelist->filter_data.filter_glob));
 }
 
 /* would recognize .blend as well */
@@ -994,8 +998,8 @@ static void filelist_setfiletypes(struct FileList *filelist)
 #endif
 		file->flags = file_extension_type(filelist->dir, file->relname);
 		
-		if (filelist->filter_glob[0] &&
-		    BLI_testextensie_glob(file->relname, filelist->filter_glob))
+		if (filelist->filter_data.filter_glob[0] &&
+		    BLI_testextensie_glob(file->relname, filelist->filter_data.filter_glob))
 		{
 			file->flags = OPERATORFILE;
 		}
@@ -1362,7 +1366,7 @@ static void filelist_from_library(struct FileList *filelist, const bool add_pare
 	BLI_strncpy(G.main->name, filename, sizeof(filename));  /* prevent G.main->name to change */
 
 	if (use_filter) {
-		filelist->filter = 0;
+		filelist->filter_data.filter = 0;
 		filelist_filter(filelist);
 	}
 }
@@ -1442,7 +1446,7 @@ void filelist_from_main(struct FileList *filelist)
 		id = lb->first;
 		filelist->numfiles = 0;
 		while (id) {
-			if (!filelist->hide_dot || id->name[2] != '.') {
+			if (!filelist->filter_data.hide_dot || id->name[2] != '.') {
 				filelist->numfiles++;
 			}
 			
@@ -1469,7 +1473,7 @@ void filelist_from_main(struct FileList *filelist)
 		while (id) {
 			ok = 1;
 			if (ok) {
-				if (!filelist->hide_dot || id->name[2] != '.') {
+				if (!filelist->filter_data.hide_dot || id->name[2] != '.') {
 					memset(files, 0, sizeof(struct direntry));
 					if (id->lib == NULL) {
 						files->relname = BLI_strdup(id->name + 2);
@@ -1518,7 +1522,7 @@ void filelist_from_main(struct FileList *filelist)
 			qsort(firstlib, totlib, sizeof(struct direntry), compare_name);
 		}
 	}
-	filelist->filter = 0;
+	filelist->filter_data.filter = 0;
 	filelist_filter(filelist);
 }
 
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index fcfbc10..5d839b4 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -73,8 +73,8 @@ struct direntry *   filelist_file(struct FileList *filelist, int index);
 void                filelist_select(struct FileList *filelist, FileSelection *sel, FileSelType select, unsigned int flag, FileCheckType check);
 void                filelist_select_file(struct FileList *filelist, int index, FileSelType select, unsigned int flag, FileCheckType check);
 bool                filelist_is_selected(struct FileList *filelist, int index, FileCheckType check);
-void                filelist_hidedot(struct FileList *filelist, short hide);
-void                filelist_setfilter(struct FileList *filelist, unsigned int filter);
+void                filelist_hidedot(struct FileList *filelist, const bool hide);
+void                filelist_setfilter(struct FileList *filelist, const unsigned int filter);
 void                filelist_setfilter_types(struct FileList *filelist, const char *filter_glob);
 void                filelist_filter(struct FileList *filelist);
 void                filelist_imgsize(struct FileList *filelist, short w, short h);
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 07ee542..9ae4c6e 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -584,6 +584,8 @@ typedef struct FileSelectParams {
 
 	char filter_glob[64]; /* list of filetypes to filter */
 
+	char filter_search[64];  /* text items' name must match to be shown. */
+
 	int active_file;
 	int sel_first;
 	int sel_last;




More information about the Bf-blender-cvs mailing list