[Bf-blender-cvs] [6a7076c9d] asset-experiments: SpaceFile: Filelist: reorder a bit things, also cleanup some unused and pure-private funcs.

Bastien Montagne noreply at git.blender.org
Thu Jan 1 12:05:10 CET 2015


Commit: 6a7076c9d4a5d9b6d01d8994bf2803ea559e4cf1
Author: Bastien Montagne
Date:   Wed Dec 31 19:17:20 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rB6a7076c9d4a5d9b6d01d8994bf2803ea559e4cf1

SpaceFile: Filelist: reorder a bit things, also cleanup some unused and pure-private funcs.

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

M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h

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

diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index ec57d08..deececc 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -45,9 +45,9 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_fileops_types.h"
 #include "BLI_linklist.h"
 #include "BLI_utildefines.h"
-#include "BLI_fileops_types.h"
 
 #ifdef WIN32
 #  include "BLI_winstuff.h"
@@ -64,8 +64,8 @@
 
 #include "DNA_space_types.h"
 
-#include "ED_fileselect.h"
 #include "ED_datafiles.h"
+#include "ED_fileselect.h"
 
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
@@ -80,6 +80,119 @@
 
 #include "filelist.h"
 
+
+/* ----------------- FOLDERLIST (previous/next) -------------- */
+
+typedef struct FolderList {
+	struct FolderList *next, *prev;
+	char *foldername;
+} FolderList;
+
+ListBase *folderlist_new(void)
+{
+	ListBase *p = MEM_callocN(sizeof(ListBase), "folderlist");
+	return p;
+}
+
+void folderlist_popdir(struct ListBase *folderlist, char *dir)
+{
+	const char *prev_dir;
+	struct FolderList *folder;
+	folder = folderlist->last;
+
+	if (folder) {
+		/* remove the current directory */
+		MEM_freeN(folder->foldername);
+		BLI_freelinkN(folderlist, folder);
+
+		folder = folderlist->last;
+		if (folder) {
+			prev_dir = folder->foldername;
+			BLI_strncpy(dir, prev_dir, FILE_MAXDIR);
+		}
+	}
+	/* delete the folder next or use setdir directly before PREVIOUS OP */
+}
+
+void folderlist_pushdir(ListBase *folderlist, const char *dir)
+{
+	struct FolderList *folder, *previous_folder;
+	previous_folder = folderlist->last;
+
+	/* check if already exists */
+	if (previous_folder && previous_folder->foldername) {
+		if (BLI_path_cmp(previous_folder->foldername, dir) == 0) {
+			return;
+		}
+	}
+
+	/* create next folder element */
+	folder = (FolderList *)MEM_mallocN(sizeof(FolderList), "FolderList");
+	folder->foldername = BLI_strdup(dir);
+
+	/* add it to the end of the list */
+	BLI_addtail(folderlist, folder);
+}
+
+const char *folderlist_peeklastdir(ListBase *folderlist)
+{
+	struct FolderList *folder;
+
+	if (!folderlist->last)
+		return NULL;
+
+	folder = folderlist->last;
+	return folder->foldername;
+}
+
+int folderlist_clear_next(struct SpaceFile *sfile)
+{
+	struct FolderList *folder;
+
+	/* if there is no folder_next there is nothing we can clear */
+	if (!sfile->folders_next)
+		return 0;
+
+	/* if previous_folder, next_folder or refresh_folder operators are executed it doesn't clear folder_next */
+	folder = sfile->folders_prev->last;
+	if ((!folder) || (BLI_path_cmp(folder->foldername, sfile->params->dir) == 0))
+		return 0;
+
+	/* eventually clear flist->folders_next */
+	return 1;
+}
+
+/* not listbase itself */
+void folderlist_free(ListBase *folderlist)
+{
+	if (folderlist) {
+		FolderList *folder;
+		for (folder = folderlist->first; folder; folder = folder->next)
+			MEM_freeN(folder->foldername);
+		BLI_freelistN(folderlist);
+	}
+}
+
+ListBase *folderlist_duplicate(ListBase *folderlist)
+{
+	
+	if (folderlist) {
+		ListBase *folderlistn = MEM_callocN(sizeof(ListBase), "copy folderlist");
+		FolderList *folder;
+		
+		BLI_duplicatelist(folderlistn, folderlist);
+		
+		for (folder = folderlistn->first; folder; folder = folder->next) {
+			folder->foldername = MEM_dupallocN(folder->foldername);
+		}
+		return folderlistn;
+	}
+	return NULL;
+}
+
+
+/* ------------------FILELIST------------------------ */
+
 struct FileList;
 
 typedef struct FileImage {
@@ -91,14 +204,6 @@ typedef struct FileImage {
 	ImBuf *img;
 } FileImage;
 
-typedef struct ThumbnailJob {
-	ListBase loadimages;
-	const short *stop;
-	const short *do_update;
-	struct FileList *filelist;
-	ReportList reports;
-} ThumbnailJob;
-
 typedef struct FileList {
 	struct direntry *filelist;
 	int *fidx;
@@ -120,11 +225,6 @@ typedef struct FileList {
 
 } FileList;
 
-typedef struct FolderList {
-	struct FolderList *next, *prev;
-	char *foldername;
-} FolderList;
-
 #define SPECIAL_IMG_SIZE 48
 #define SPECIAL_IMG_ROWS 4
 #define SPECIAL_IMG_COLS 4
@@ -146,7 +246,14 @@ typedef struct FolderList {
 static ImBuf *gSpecialFileImages[SPECIAL_IMG_MAX];
 
 
-/* ******************* SORT ******************* */
+static void filelist_from_main(struct FileList *filelist);
+static void filelist_from_library(struct FileList *filelist);
+
+static void filelist_read_main(struct FileList *filelist);
+static void filelist_read_library(struct FileList *filelist);
+static void filelist_read_dir(struct FileList *filelist);
+
+/* ********** Sort helpers ********** */
 
 static bool compare_is_directory(const struct direntry *entry)
 {
@@ -292,6 +399,28 @@ static int compare_extension(const void *a1, const void *a2)
 	return (BLI_strcasecmp(sufix1, sufix2));
 }
 
+void filelist_sort(struct FileList *filelist, short sort)
+{
+	switch (sort) {
+		case FILE_SORT_ALPHA:
+			qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_name);
+			break;
+		case FILE_SORT_TIME:
+			qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_date);
+			break;
+		case FILE_SORT_SIZE:
+			qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_size);
+			break;
+		case FILE_SORT_EXTENSION:
+			qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_extension);
+			break;
+	}
+
+	filelist_filter(filelist);
+}
+
+/* ********** Filter helpers ********** */
+
 static bool is_hidden_file(const char *filename, short hide_dot)
 {
 	bool is_hidden = false;
@@ -347,6 +476,7 @@ static bool is_filtered_lib(struct direntry *file, const char *dir, unsigned int
 	else {
 		is_filtered = is_filtered_file(file, dir, filter, hide_dot);
 	}
+
 	return is_filtered;
 }
 
@@ -386,6 +516,23 @@ void filelist_filter(FileList *filelist)
 	}
 }
 
+void filelist_hidedot(struct FileList *filelist, short hide)
+{
+	filelist->hide_dot = hide;
+}
+
+void filelist_setfilter(struct FileList *filelist, unsigned int filter)
+{
+	filelist->filter = filter;
+}
+
+void filelist_setfilter_types(struct FileList *filelist, const char *filter_glob)
+{
+	BLI_strncpy(filelist->filter_glob, filter_glob, sizeof(filelist->filter_glob));
+}
+
+/* ********** Icon/image helpers ********** */
+
 void filelist_init_icons(void)
 {
 	short x, y, k;
@@ -428,115 +575,86 @@ void filelist_free_icons(void)
 	}
 }
 
-/* -----------------FOLDERLIST (previous/next) -------------- */
-ListBase *folderlist_new(void)
-{
-	ListBase *p = MEM_callocN(sizeof(ListBase), "folderlist");
-	return p;
-}
-
-void folderlist_popdir(struct ListBase *folderlist, char *dir)
+void filelist_imgsize(struct FileList *filelist, short w, short h)
 {
-	const char *prev_dir;
-	struct FolderList *folder;
-	folder = folderlist->last;
-
-	if (folder) {
-		/* remove the current directory */
-		MEM_freeN(folder->foldername);
-		BLI_freelinkN(folderlist, folder);
-
-		folder = folderlist->last;
-		if (folder) {
-			prev_dir = folder->foldername;
-			BLI_strncpy(dir, prev_dir, FILE_MAXDIR);
-		}
-	}
-	/* delete the folder next or use setdir directly before PREVIOUS OP */
+	filelist->prv_w = w;
+	filelist->prv_h = h;
 }
 
-void folderlist_pushdir(ListBase *folderlist, const char *dir)
+ImBuf *filelist_getimage(struct FileList *filelist, int index)
 {
-	struct FolderList *folder, *previous_folder;
-	previous_folder = folderlist->last;
-
-	/* check if already exists */
-	if (previous_folder && previous_folder->foldername) {
-		if (BLI_path_cmp(previous_folder->foldername, dir) == 0) {
-			return;
-		}
-	}
-
-	/* create next folder element */
-	folder = (FolderList *)MEM_mallocN(sizeof(FolderList), "FolderList");
-	folder->foldername = BLI_strdup(dir);
-
-	/* add it to the end of the list */
-	BLI_addtail(folderlist, folder);
-}
+	ImBuf *ibuf = NULL;
+	int fidx = 0;
 
-const char *folderlist_peeklastdir(ListBase *folderlist)
-{
-	struct FolderList *folder;
+	BLI_assert(G.background == false);
 
-	if (!folderlist->last)
+	if ((index < 0) || (index >= filelist->numfiltered)) {
 		return NULL;
+	}
+	fidx = filelist->fidx[index];
+	ibuf = filelist->filelist[fidx].image;
 
-	folder = folderlist->last;
-	return folder->foldername;
+	return ibuf;
 }
 
-int folderlist_clear_next(struct SpaceFile *sfile)
+ImBuf *filelist_geticon(struct FileList *filelist, int index)
 {
-	struct FolderList *folder;
-
-	/* if there is no folder_next there is nothing we can clear */
-	if (!sfile->folders_next)
-		return 0;
-
-	/* if previous_folder, next_folder or refresh_folder operators are executed it doesn't clear folder_next */
-	folder = sfile->folders_prev->last;
-	if ((!folder) || (BLI_path_cmp(folder->foldername, sfile->params->dir) == 0))
-		return 0;
+	ImBuf *ibuf = NULL;
+	struct direntry *file = NULL;
+	int fidx = 0;
 
-	/* eventually clear flist->folders_next */
-	return 1;
-}
+	BLI_assert(G.background == false);
 
-/* not listbase itself */
-void folderlist_free(ListBase *folderlist)
-{
-	if (folderlist) {
-		FolderList *folder;
-		for (folder = folderlist->first; folder; folder = folder->next)
-			MEM_freeN(folder->foldername);
-		BLI_freelistN(folderlist);
+	if ((index < 0) || (index >= filelist->numfiltered)) {
+		return NULL;
 	}
-}
-
-ListBase *folderlist_duplicate(ListBase *folderlist)
-{
-	
-	if (folderlist) {
-		ListBase *folderlistn = MEM_callocN(sizeof(ListBase), "copy folderlist");
-		FolderList *folder;
-		
-		BLI_duplicatelist(folderlistn, folderlist);
-		
-		for (folder = folderlistn->first; folder; folder = folder->next) {
-			folder->foldername = MEM_dupallocN(folder->foldername);
+	fidx = filelist->fidx[index];
+	file = &filelist->filelist[fidx];
+	if (file->type & S_IFDIR) {
+		if (strcmp(filelist->filelist[fidx].relname, "..") == 0) {
+			ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
+		}
+		else if (strcmp(filelist->filelist[fidx].relname, ".") == 0) {
+			ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
+		}
+		else {
+			ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER];
 		}
-		return folderlistn;
 	}
-	return NULL;
-}
+	else {
+		ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
+	}
+
+	if (file->flags & BLENDERFILE) {
+		ibuf = gSpecialFileImages[SPECIAL_IMG_BLENDFILE];
+	}
+	else if ((file->flags & MOVIEFILE)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list