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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to