[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