[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