[Bf-blender-cvs] [b65d8de] asset-experiments: Add icons to datatypes (IDs) in browser, when appending/linking.
Bastien Montagne
noreply at git.blender.org
Thu Dec 4 18:49:42 CET 2014
Commit: b65d8de56aad6263dddb6db32ac7fb55be137d1e
Author: Bastien Montagne
Date: Thu Dec 4 14:48:56 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rBb65d8de56aad6263dddb6db32ac7fb55be137d1e
Add icons to datatypes (IDs) in browser, when appending/linking.
Not yet previews, but still better than anonymous icon!
===================================================================
M source/blender/editors/space_file/file_draw.c
M source/blender/editors/space_file/filelist.c
M source/blender/editors/space_file/filelist.h
===================================================================
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index b626972..c99d73e 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -227,44 +227,6 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh
}
-static int get_file_icon(struct direntry *file)
-{
- if (file->type & S_IFDIR) {
- if (strcmp(file->relname, "..") == 0) {
- return ICON_FILE_PARENT;
- }
- if (file->flags & APPLICATIONBUNDLE) {
- return ICON_UGLYPACKAGE;
- }
- if (file->flags & BLENDERFILE) {
- return ICON_FILE_BLEND;
- }
- return ICON_FILE_FOLDER;
- }
- else if (file->flags & BLENDERFILE)
- return ICON_FILE_BLEND;
- else if (file->flags & BLENDERFILE_BACKUP)
- return ICON_FILE_BACKUP;
- else if (file->flags & IMAGEFILE)
- return ICON_FILE_IMAGE;
- else if (file->flags & MOVIEFILE)
- return ICON_FILE_MOVIE;
- else if (file->flags & PYSCRIPTFILE)
- return ICON_FILE_SCRIPT;
- else if (file->flags & SOUNDFILE)
- return ICON_FILE_SOUND;
- else if (file->flags & FTFONTFILE)
- return ICON_FILE_FONT;
- else if (file->flags & BTXFILE)
- return ICON_FILE_BLANK;
- else if (file->flags & COLLADAFILE)
- return ICON_FILE_BLANK;
- else if (file->flags & TEXTFILE)
- return ICON_FILE_TEXT;
- else
- return ICON_FILE_BLANK;
-}
-
static void file_draw_icon(uiBlock *block, char *path, int sx, int sy, int icon, int width, int height, bool drag)
{
uiBut *but;
@@ -292,7 +254,7 @@ static void file_draw_string(int sx, int sy, const char *string, float width, in
fs.align = align;
- BLI_strncpy(fname, string /*BLI_path_basename(string)*/, FILE_MAXFILE);
+ BLI_strncpy(fname, BLI_path_basename(string), FILE_MAXFILE);
file_shorten_string(fname, width + 1.0f, 0);
/* no text clipping needed, UI_fontstyle_draw does it but is a bit too strict (for buttons it works) */
@@ -313,7 +275,8 @@ void file_calc_previews(const bContext *C, ARegion *ar)
UI_view2d_totRect_set(v2d, sfile->layout->width, sfile->layout->height);
}
-static void file_draw_preview(uiBlock *block, struct direntry *file, int sx, int sy, ImBuf *imb, FileLayout *layout, bool dropshadow, bool drag)
+static void file_draw_preview(uiBlock *block, struct FileList *files, const int index,
+ int sx, int sy, ImBuf *imb, FileLayout *layout, bool dropshadow, bool drag)
{
if (imb) {
uiBut *but;
@@ -373,8 +336,9 @@ static void file_draw_preview(uiBlock *block, struct direntry *file, int sx, int
/* dragregion */
if (drag) {
+ struct direntry *file = filelist_file(files, index);
but = uiDefBut(block, UI_BTYPE_LABEL, 0, "", xco, yco, ex, ey, NULL, 0.0, 0.0, 0, 0, "");
- UI_but_drag_set_image(but, file->path, get_file_icon(file), imb, scale);
+ UI_but_drag_set_image(but, file->path, filelist_geticon(files, index), imb, scale);
}
glDisable(GL_BLEND);
@@ -530,14 +494,15 @@ void file_draw_list(const bContext *C, ARegion *ar)
is_icon = 0;
imb = filelist_getimage(files, i);
if (!imb) {
- imb = filelist_geticon(files, i);
+ imb = filelist_geticon_image(files, i);
is_icon = 1;
}
- file_draw_preview(block, file, sx, sy, imb, layout, !is_icon && (file->flags & IMAGEFILE), do_drag);
+ file_draw_preview(block, files, i, sx, sy, imb, layout, !is_icon && (file->flags & IMAGEFILE), do_drag);
}
else {
- file_draw_icon(block, file->path, sx, sy - (UI_UNIT_Y / 6), get_file_icon(file), ICON_DEFAULT_WIDTH_SCALE, ICON_DEFAULT_HEIGHT_SCALE, do_drag);
+ file_draw_icon(block, file->path, sx, sy - (UI_UNIT_Y / 6), filelist_geticon(files, i),
+ ICON_DEFAULT_WIDTH_SCALE, ICON_DEFAULT_HEIGHT_SCALE, do_drag);
sx += ICON_DEFAULT_WIDTH_SCALE + 0.2f * UI_UNIT_X;
}
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index d15cc88..e7de709 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -350,6 +350,22 @@ static bool is_filtered_lib(struct direntry *file, const char *dir, unsigned int
return is_filtered;
}
+static bool is_filtered_lib_flat(struct direntry *file, const char *dir, unsigned int filter, short hide_dot)
+{
+ 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 = false;
+ }
+ }
+ else {
+ is_filtered = is_filtered_file(file, dir, filter, hide_dot);
+ }
+ return is_filtered;
+}
+
static bool is_filtered_main(struct direntry *file, const char *UNUSED(dir), unsigned int UNUSED(filter), short hide_dot)
{
return !is_hidden_file(file->relname, hide_dot);
@@ -539,8 +555,7 @@ static void filelist_read_library(struct FileList *filelist);
static void filelist_read_library_flat(struct FileList *filelist);
static void filelist_read_dir(struct FileList *filelist);
-static int groupname_to_code(const char *group);
-static void filelist_from_library(struct FileList *filelist, const bool add_parent);
+static void filelist_from_library(struct FileList *filelist, const bool add_parent, const bool use_filter);
FileList *filelist_new(short type)
{
@@ -557,7 +572,7 @@ FileList *filelist_new(short type)
break;
case FILE_ASSET:
p->readf = filelist_read_library_flat;
- p->filterf = is_filtered_lib;
+ p->filterf = is_filtered_lib_flat;
break;
default:
p->readf = filelist_read_dir;
@@ -628,40 +643,30 @@ short filelist_changed(struct FileList *filelist)
return filelist->changed;
}
-ImBuf *filelist_getimage(struct FileList *filelist, int index)
+static struct direntry *filelist_geticon_get_file(struct FileList *filelist, const int index)
{
- ImBuf *ibuf = NULL;
- int fidx = 0;
-
BLI_assert(G.background == false);
- if ((index < 0) || (index >= filelist->numfiltered)) {
- return NULL;
- }
- fidx = filelist->fidx[index];
- ibuf = filelist->filelist[fidx].image;
+ return filelist_file(filelist, index);
+}
- return ibuf;
+ImBuf *filelist_getimage(struct FileList *filelist, const int index)
+{
+ struct direntry *file = filelist_geticon_get_file(filelist, index);
+
+ return file->image;
}
-ImBuf *filelist_geticon(struct FileList *filelist, int index)
+ImBuf *filelist_geticon_image(struct FileList *filelist, const int index)
{
ImBuf *ibuf = NULL;
- struct direntry *file = NULL;
- int fidx = 0;
-
- BLI_assert(G.background == false);
+ struct direntry *file = filelist_geticon_get_file(filelist, index);
- if ((index < 0) || (index >= filelist->numfiltered)) {
- return NULL;
- }
- fidx = filelist->fidx[index];
- file = &filelist->filelist[fidx];
if (file->type & S_IFDIR) {
- if (strcmp(filelist->filelist[fidx].relname, "..") == 0) {
+ if (strcmp(file->relname, "..") == 0) {
ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
}
- else if (strcmp(filelist->filelist[fidx].relname, ".") == 0) {
+ else if (strcmp(file->relname, ".") == 0) {
ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
}
else {
@@ -675,7 +680,7 @@ ImBuf *filelist_geticon(struct FileList *filelist, int index)
if (file->flags & BLENDERFILE) {
ibuf = gSpecialFileImages[SPECIAL_IMG_BLENDFILE];
}
- else if ((file->flags & MOVIEFILE) || (file->flags & MOVIEFILE_ICON)) {
+ else if (file->flags & (MOVIEFILE | MOVIEFILE_ICON)) {
ibuf = gSpecialFileImages[SPECIAL_IMG_MOVIEFILE];
}
else if (file->flags & SOUNDFILE) {
@@ -700,10 +705,119 @@ ImBuf *filelist_geticon(struct FileList *filelist, int index)
return ibuf;
}
+int filelist_geticon(struct FileList *filelist, const int index)
+{
+ struct direntry *file = filelist_geticon_get_file(filelist, index);
+
+ if (file->type & S_IFDIR) {
+ if (strcmp(file->relname, "..") == 0) {
+ return ICON_FILE_PARENT;
+ }
+ if (file->flags & APPLICATIONBUNDLE) {
+ return ICON_UGLYPACKAGE;
+ }
+ if (file->flags & BLENDERFILE) {
+ return ICON_FILE_BLEND;
+ }
+ return ICON_FILE_FOLDER;
+ }
+ else if (file->flags & BLENDERFILE)
+ return ICON_FILE_BLEND;
+ else if (file->flags & BLENDERFILE_BACKUP)
+ return ICON_FILE_BACKUP;
+ else if (file->flags & IMAGEFILE)
+ return ICON_FILE_IMAGE;
+ else if (file->flags & MOVIEFILE)
+ return ICON_FILE_MOVIE;
+ else if (file->flags & PYSCRIPTFILE)
+ return ICON_FILE_SCRIPT;
+ else if (file->flags & SOUNDFILE)
+ return ICON_FILE_SOUND;
+ else if (file->flags & FTFONTFILE)
+ return ICON_FILE_FONT;
+ else if (file->flags & BTXFILE)
+ return ICON_FILE_BLANK;
+ else if (file->flags & COLLADAFILE)
+ return ICON_FILE_BLANK;
+ else if (file->flags & TEXTFILE)
+ return ICON_FILE_TEXT;
+ else {
+ char path[FILE_MAX_LIBEXTRA], dir[FILE_MAXDIR], group[BLO_GROUP_MAX];
+ char *slash;
+
+ BLI_join_dirfile(path, sizeof(path), filelist->dir, file->relname);
+ slash = (char *)BLI_last_slash(path);
+ slash[1] = '\0';
+
+ if (BLO_is_a_library(path, dir, group)) {
+ int idcode = groupname_to_code(group);
+
+ /* TODO: this should most likely be completed and moved to UI_interface_icons.h ? unless it already exists somewhere... */
+ switch (idcode) {
+ case ID_AC:
+ return ICON_ANIM_DATA;
+ case ID_AR:
+ return ICON_ARMATURE_DATA;
+ case ID_BR:
+ return ICON_BRUSH_DATA;
+ case ID_CA:
+ return ICON_CAMERA_DATA;
+ case ID_CU:
+ return ICON_CURVE_DATA;
+ case ID_GD:
+ return ICON_GREASEPENCIL;
+ case ID_GR:
+ return ICON_GROUP;
+ case ID_IM:
+ return ICON_IMAGE_DATA;
+ case ID_LA:
+ return ICON_LAMP_DATA;
+ case ID_LS:
+ return ICON_LINE_DATA;
+ case ID_LT:
+ return ICON_LATTICE_DATA;
+ case ID_MA:
+ return ICON_MATERIAL_DATA;
+ case ID_MB:
+ return ICON_META_DATA;
+ case ID_MC:
+ return ICON_CLIP;
+ case ID_ME:
+ return ICON_MESH_DATA;
+ case ID_MSK:
+ return ICON_FILE_BLANK; /* TODO! */
+ case ID_NT:
+ return ICON_NODETREE;
+ case ID_OB:
+ return ICON_OBJECT_DATA;
+ case ID_PAL:
+ return ICON_FILE_BLANK; /* TODO! */
+ case ID_PC:
+ return ICON_FILE_BLANK; /* TODO! */
+ case ID_S
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list