[Bf-blender-cvs] [9ea42ae] asset-experiments: Add basic 'glob' filter by name feature.

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


Commit: 9ea42ae3ba35960e765b0507d0f229217e5f28b1
Author: Bastien Montagne
Date:   Thu Dec 4 18:43:17 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rB9ea42ae3ba35960e765b0507d0f229217e5f28b1

Add basic 'glob' filter by name feature.

Not much to add, we'll likely add more filtering options (tags, categories...) later,
maybe for now we just need an 'exclude' option for name filter...

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

M	release/scripts/startup/bl_ui/space_filebrowser.py
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/space_file.c
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index b90eb7a..794c8ba 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -77,5 +77,9 @@ class FILEBROWSER_HT_header(Header):
                 row.prop(params, "use_filter_sound", text="")
                 row.prop(params, "use_filter_text", text="")
 
+            row.separator()
+            row.prop(params, "filter_search", text="")
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index f9dcbe0..3339b39 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -45,9 +45,11 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_fileops_types.h"
+#include "BLI_fnmatch.h"
 #include "BLI_linklist.h"
+#include "BLI_math.h"
 #include "BLI_utildefines.h"
-#include "BLI_fileops_types.h"
 
 #ifdef WIN32
 #  include "BLI_winstuff.h"
@@ -103,7 +105,7 @@ typedef struct FileListFilter {
 	bool hide_dot;
 	unsigned int filter;
 	char filter_glob[64];
-	char filter_search[64];
+	char filter_search[66];  /* + 2 for heading/trailing implicit '*' wildcards. */
 } FileListFilter;
 
 typedef struct FileList {
@@ -458,7 +460,13 @@ static bool is_filtered_file(struct direntry *file, const char *UNUSED(dir), Fil
 	else {
 		is_filtered = true;
 	}
-	return is_filtered && !is_hidden_file(file->relname, filter->hide_dot);
+	is_filtered = is_filtered && !is_hidden_file(file->relname, filter->hide_dot);
+	if (is_filtered && (filter->filter_search[0] != '\0')) {
+		if (fnmatch(filter->filter_search, file->relname, FNM_CASEFOLD) != 0) {
+			is_filtered = false;
+		}
+	}
+	return is_filtered;
 }
 
 static bool is_filtered_lib(struct direntry *file, const char *dir, FileListFilter *filter)
@@ -467,6 +475,11 @@ static bool is_filtered_lib(struct direntry *file, const char *dir, FileListFilt
 	char tdir[FILE_MAX], tgroup[BLO_GROUP_MAX];
 	if (BLO_is_a_library(dir, tdir, tgroup)) {
 		is_filtered = !is_hidden_file(file->relname, filter->hide_dot);
+		if (is_filtered && (filter->filter_search[0] != '\0')) {
+			if (fnmatch(filter->filter_search, file->relname, FNM_CASEFOLD) != 0) {
+				is_filtered = false;
+			}
+		}
 	}
 	else {
 		is_filtered = is_filtered_file(file, dir, filter);
@@ -483,6 +496,11 @@ static bool is_filtered_lib_flat(struct direntry *file, const char *dir, FileLis
 		if (filter && !(filter->filter & FOLDERFILE) && (file->type & S_IFDIR) && !STREQ(file->relname, "..")) {
 			is_filtered = false;
 		}
+		if (is_filtered && (filter->filter_search[0] != '\0')) {
+			if (fnmatch(filter->filter_search, file->relname, FNM_CASEFOLD) != 0) {
+				is_filtered = false;
+			}
+		}
 	}
 	else {
 		is_filtered = is_filtered_file(file, dir, filter);
@@ -858,21 +876,44 @@ int filelist_find(struct FileList *filelist, const char *filename)
 	return fidx;
 }
 
-void filelist_hidedot(struct FileList *filelist, const bool hide)
+void filelist_hidedot(FileList *filelist, const bool hide)
 {
 	filelist->filter_data.hide_dot = hide;
 }
 
-void filelist_setfilter(struct FileList *filelist, const unsigned int filter)
+void filelist_setfilter(FileList *filelist, const unsigned int filter)
 {
 	filelist->filter_data.filter = filter;
 }
 
-void filelist_setfilter_types(struct FileList *filelist, const char *filter_glob)
+void filelist_setfilter_types(FileList *filelist, const char *filter_glob)
 {
 	BLI_strncpy(filelist->filter_data.filter_glob, filter_glob, sizeof(filelist->filter_data.filter_glob));
 }
 
+void filelist_setfilter_search(struct FileList *filelist, const char *filter_search)
+{
+	int idx = 0;
+	const size_t max_search_len = sizeof(filelist->filter_data.filter_search) - 2;
+	const size_t slen = (size_t)min_ii((int)strlen(filter_search), (int)max_search_len);
+
+	if (slen == 0) {
+		filelist->filter_data.filter_search[0] = '\0';
+		return;
+	}
+
+	/* Implicitly add heading/trailing wildcards if needed. */
+	if (filter_search[idx] != '*') {
+		filelist->filter_data.filter_search[idx++] = '*';
+	}
+	memcpy(&filelist->filter_data.filter_search[idx], filter_search, slen);
+	idx += slen;
+	if (filelist->filter_data.filter_search[idx - 1] != '*') {
+		filelist->filter_data.filter_search[idx++] = '*';
+	}
+	filelist->filter_data.filter_search[idx] = '\0';
+}
+
 /* would recognize .blend as well */
 static bool file_is_blend_backup(const char *str)
 {
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 5d839b4..dc17221 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -76,6 +76,7 @@ bool                filelist_is_selected(struct FileList *filelist, int index, F
 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_setfilter_search(struct FileList *filelist, const char *filter_search);
 void                filelist_filter(struct FileList *filelist);
 void                filelist_imgsize(struct FileList *filelist, short w, short h);
 struct ImBuf *      filelist_getimage(struct FileList *filelist, const int index);
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index fa65053c..a496034 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -203,6 +203,7 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
 	filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT);
 	filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0);
 	filelist_setfilter_types(sfile->files, params->filter_glob);
+	filelist_setfilter_search(sfile->files, params->filter_search);
 
 	if (filelist_empty(sfile->files)) {
 		thumbnails_stop(wm, sfile->files);
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 017e60c..69c3a68 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -3285,8 +3285,14 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
 	prop = RNA_def_property(srna, "filter_glob", PROP_STRING, PROP_NONE);
 	RNA_def_property_string_sdna(prop, NULL, "filter_glob");
 	RNA_def_property_ui_text(prop, "Extension Filter", "");
+	RNA_def_property_string_maxlength(prop, 63);
 	RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
 
+	prop = RNA_def_property(srna, "filter_search", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "filter_search");
+	RNA_def_property_ui_text(prop, "Name Filter", "");
+	RNA_def_property_string_maxlength(prop, 63);
+	RNA_def_property_update(prop, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
 }
 
 static void rna_def_space_filebrowser(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list