[Bf-blender-cvs] [4e96fe7] asset-experiments: Add ID-types filtering.

Bastien Montagne noreply at git.blender.org
Mon Dec 8 12:46:45 CET 2014


Commit: 4e96fe77b1d98e6ca4533d10639ce1eddda819ab
Author: Bastien Montagne
Date:   Mon Dec 8 12:45:54 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rB4e96fe77b1d98e6ca4533d10639ce1eddda819ab

Add ID-types filtering.

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

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/makesdna/DNA_space_types.h
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 cd4f237..5df0993 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -29,6 +29,8 @@ class FILEBROWSER_HT_header(Header):
 
         st = context.space_data
 
+        is_lib_browser = True  # TODO: Add a solid way to know whether we are browsing libs or not!!!
+
         layout.template_header()
 
         row = layout.row()
@@ -78,6 +80,10 @@ class FILEBROWSER_HT_header(Header):
                 row.prop(params, "use_filter_sound", text="")
                 row.prop(params, "use_filter_text", text="")
 
+            if is_lib_browser:
+                row.separator()
+                row.prop(params, "filter_id", text="")
+
             row.separator()
             row.prop(params, "filter_search", text="")
 
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 89a81d1..e736dd6 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -104,6 +104,7 @@ typedef struct ThumbnailJob {
 typedef struct FileListFilter {
 	bool hide_dot;
 	unsigned int filter;
+	unsigned int filter_id;
 	char filter_glob[64];
 	char filter_search[66];  /* + 2 for heading/trailing implicit '*' wildcards. */
 } FileListFilter;
@@ -423,6 +424,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 unsigned int groupname_to_filter_id(const char *group);
 
 static bool is_hidden_file(const char *filename, const bool hide_dot)
 {
@@ -474,11 +476,11 @@ static bool is_filtered_file(struct direntry *file, const char *UNUSED(root), Fi
 static bool is_filtered_lib(struct direntry *file, const char *root, FileListFilter *filter)
 {
 	bool is_filtered = false;
-	char path[FILE_MAX_LIBEXTRA], dir[FILE_MAXDIR];
+	char path[FILE_MAX_LIBEXTRA], dir[FILE_MAXDIR], group[BLO_GROUP_MAX];
 
 	BLI_join_dirfile(path, sizeof(path), root, file->relname);
 
-	if (BLO_library_path_explode(path, dir, NULL, NULL)) {
+	if (BLO_library_path_explode(path, dir, group, NULL)) {
 		is_filtered = !is_hidden_file(file->relname, filter->hide_dot);
 		if (filter->filter) {
 			if (is_filtered && (file->type & S_IFDIR) && !(filter->filter & FOLDERFILE) &&
@@ -491,6 +493,12 @@ static bool is_filtered_lib(struct direntry *file, const char *root, FileListFil
 					is_filtered = false;
 				}
 			}
+			if (is_filtered && group[0] != '\0') {
+				unsigned int filter_id = groupname_to_filter_id(group);
+				if (!(filter_id & filter->filter_id)) {
+					is_filtered = false;
+				}
+			}
 		}
 	}
 	else {
@@ -876,42 +884,36 @@ int filelist_find(struct FileList *filelist, const char *filename)
 	return fidx;
 }
 
-void filelist_hidedot(FileList *filelist, const bool hide)
+void filelist_setfilter_options(FileList *filelist, const bool hide_dot, const unsigned int filter,
+                                const unsigned int filter_id, const char *filter_glob, const char *filter_search)
 {
-	filelist->filter_data.hide_dot = hide;
-}
+	filelist->filter_data.hide_dot = hide_dot;
 
-void filelist_setfilter(FileList *filelist, const unsigned int filter)
-{
 	filelist->filter_data.filter = filter;
-}
-
-void filelist_setfilter_types(FileList *filelist, const char *filter_glob)
-{
+	filelist->filter_data.filter_id = filter_id;
 	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;
-	}
+	{
+		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);
 
-	/* 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++] = '*';
+		if (slen == 0) {
+			filelist->filter_data.filter_search[0] = '\0';
+		}
+		else {
+			/* 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';
+		}
 	}
-	filelist->filter_data.filter_search[idx] = '\0';
 }
 
 /* would recognize .blend as well */
@@ -1388,6 +1390,70 @@ static int groupname_to_code(const char *group)
 
 	return buf[0] ? BKE_idcode_from_name(buf) : 0;
 }
+
+static unsigned int groupname_to_filter_id(const char *group)
+{
+	int id_code = groupname_to_code(group);
+
+	switch (id_code) {
+		case ID_AC:
+			return FILTER_ID_AC;
+		case ID_AR:
+			return FILTER_ID_AR;
+		case ID_BR:
+			return FILTER_ID_BR;
+		case ID_CA:
+			return FILTER_ID_CA;
+		case ID_CU:
+			return FILTER_ID_CU;
+		case ID_GD:
+			return FILTER_ID_GD;
+		case ID_GR:
+			return FILTER_ID_GR;
+		case ID_IM:
+			return FILTER_ID_IM;
+		case ID_LA:
+			return FILTER_ID_LA;
+		case ID_LS:
+			return FILTER_ID_LS;
+		case ID_LT:
+			return FILTER_ID_LT;
+		case ID_MA:
+			return FILTER_ID_MA;
+		case ID_MB:
+			return FILTER_ID_MB;
+		case ID_MC:
+			return FILTER_ID_MC;
+		case ID_ME:
+			return FILTER_ID_ME;
+		case ID_MSK:
+			return FILTER_ID_MSK;
+		case ID_NT:
+			return FILTER_ID_NT;
+		case ID_OB:
+			return FILTER_ID_OB;
+		case ID_PAL:
+			return FILTER_ID_PAL;
+		case ID_PC:
+			return FILTER_ID_PC;
+		case ID_SCE:
+			return FILTER_ID_SCE;
+		case ID_SPK:
+			return FILTER_ID_SPK;
+		case ID_SO:
+			return FILTER_ID_SO;
+		case ID_TE:
+			return FILTER_ID_TE;
+		case ID_TXT:
+			return FILTER_ID_TXT;
+		case ID_VF:
+			return FILTER_ID_VF;
+		case ID_WO:
+			return FILTER_ID_WO;
+		default:
+			return 0;
+	}
+}
  
 static void filelist_from_library(struct FileList *filelist, const bool add_parent, const bool use_filter)
 {
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index bef447b..6d86bd5 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -73,11 +73,9 @@ 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, const bool hide);
 void                filelist_setrecursive(struct FileList *filelist, const bool use_recursion);
-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_setfilter_options(struct FileList *filelist, const bool hide_dot, const unsigned int filter,
+                                               const unsigned int filter_id, const char *filter_glob, 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 e10afd6..d315b95 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -200,10 +200,11 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
 		filelist_setdir(sfile->files, params->dir);
 		params->active_file = -1; // added this so it opens nicer (ton)
 	}
-	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);
+	filelist_setfilter_options(sfile->files, params->flag & FILE_HIDE_DOT,
+	                                         params->flag & FILE_FILTER ? params->filter : 0,
+	                                         params->filter_id,
+	                                         params->filter_glob,
+	                                         params->filter_search);
 	filelist_setrecursive(sfile->files, (params->flag & FILE_SHOWFLAT) != 0);
 
 	if (filelist_empty(sfile->files)) {
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 565f67d..62be83e 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -585,6 +585,7 @@ 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 filter_id;  /* same as filter, but for ID types (aka library groups). */
 
 	int active_file;
 	int sel_first;
@@ -712,6 +713,37 @@ typedef enum eFileSel_File_Types {
 	BLENDERLIB          = (1 << 31),
 } eFileSel_File_Types;
 
+/* To filter ID types (filter

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list