[Bf-blender-cvs] [aa33680] asset-experiments: Merge branch 'master' into asset-experiments
Bastien Montagne
noreply at git.blender.org
Thu Jan 1 12:05:13 CET 2015
Commit: aa336809fa9b3a786e946122e3133a6ab2414428
Author: Bastien Montagne
Date: Thu Jan 1 11:08:21 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rBaa336809fa9b3a786e946122e3133a6ab2414428
Merge branch 'master' into asset-experiments
Conflicts:
source/blender/editors/space_file/filelist.c
source/blender/editors/space_file/filelist.h
source/blender/editors/space_file/space_file.c
===================================================================
===================================================================
diff --cc source/blender/editors/space_file/filelist.c
index 0f9b09b,4177901..e765414
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@@ -46,11 -46,8 +46,12 @@@
#include "BLI_blenlib.h"
#include "BLI_fileops_types.h"
+#include "BLI_fnmatch.h"
#include "BLI_linklist.h"
+#include "BLI_math.h"
+#include "BLI_threads.h"
#include "BLI_utildefines.h"
++#include "BLI_fileops_types.h"
#ifdef WIN32
# include "BLI_winstuff.h"
@@@ -101,10 -206,9 +215,11 @@@ typedef struct FileImage
typedef struct FileListFilter {
bool hide_dot;
+ bool hide_parent;
unsigned int filter;
+ unsigned int filter_id;
char filter_glob[64];
+ char filter_search[66]; /* + 2 for heading/trailing implicit '*' wildcards. */
} FileListFilter;
typedef struct FileList {
@@@ -116,27 -218,23 +229,31 @@@
short prv_w;
short prv_h;
- bool changed;
+ bool force_reset;
+ bool force_refresh;
+ bool filelist_ready;
+ bool filelist_pending;
- bool need_sorting;
short sort;
+ bool need_sorting;
+
FileListFilter filter_data;
+ int *fidx; /* Also used to detect when we need to filter! */
+ int numfiltered;
+
+ bool need_thumbnails;
+
++ bool use_recursion;
++ short recursion_level;
+
struct BlendHandle *libfiledata;
- bool hide_parent;
- void (*readf)(struct FileList *);
+ void (*read_jobf)(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
bool (*filterf)(struct direntry *, const char *, FileListFilter *);
-
- bool use_recursion;
- short recursion_level;
} FileList;
+#define FILELIST_MAX_RECURSION 3
+
#define FILENAME_IS_BREADCRUMBS(_n) \
(((_n)[0] == '.' && (_n)[1] == '\0') || ((_n)[0] == '.' && (_n)[1] == '.' && (_n)[2] == '\0'))
@@@ -166,7 -259,16 +278,17 @@@
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_readjob_main(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
++static void filelist_readjob_lib(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
++static void filelist_readjob_dir(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
+
-static void filelist_read_main(struct FileList *filelist);
-static void filelist_read_library(struct FileList *filelist);
-static void filelist_read_dir(struct FileList *filelist);
++/* 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 void filelist_filter_clear(FileList *filelist);
+
+ /* ********** Sort helpers ********** */
static bool compare_is_directory(const struct direntry *entry)
{
@@@ -325,160 -410,59 +447,87 @@@ static int compare_extension(const voi
if (strcmp(entry2->relname, ".") == 0) return (1);
if (strcmp(entry1->relname, "..") == 0) return (-1);
if (strcmp(entry2->relname, "..") == 0) return (1);
-
- return (BLI_strcasecmp(sufix1, sufix2));
+
+ if ((entry1->flags & BLENDERLIB) && !(entry2->flags & BLENDERLIB)) return -1;
+ if (!(entry1->flags & BLENDERLIB) && (entry2->flags & BLENDERLIB)) return 1;
+ if ((entry1->flags & BLENDERLIB) && (entry2->flags & BLENDERLIB)) {
+ char lib1[FILE_MAX_LIBEXTRA], lib2[FILE_MAX_LIBEXTRA];
+ char *group1, *group2, *name1, *name2;
+ int grp_comp;
+
+ BLO_library_path_explode(entry1->path, lib1, &group1, &name1);
+ BLO_library_path_explode(entry2->path, lib2, &group2, &name2);
+
+ BLI_assert(group1);
+ BLI_assert(group2);
+
+ grp_comp = strcmp(group1, group2);
+ if (grp_comp != 0 || (!name1 && !name2)) {
+ return grp_comp;
+ }
+
+ if (!name1) {
+ return -1;
+ }
+ if (!name2) {
+ return 1;
+ }
+ return BLI_strcasecmp(name1, name2);
+ }
+
+ return BLI_strcasecmp(sufix1, sufix2);
}
-
- /* -----------------FOLDERLIST (previous/next) -------------- */
-
- ListBase *folderlist_new(void)
- {
- ListBase *p = MEM_callocN(sizeof(ListBase), "folderlist");
- return p;
- }
-
- void folderlist_popdir(struct ListBase *folderlist, char *dir)
+ bool filelist_need_sorting(struct FileList *filelist)
{
- 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 */
+ return filelist->need_sorting && (filelist->sort != FILE_SORT_NONE);
}
- void folderlist_pushdir(ListBase *folderlist, const char *dir)
+ void filelist_sort(struct FileList *filelist)
{
- struct FolderList *folder, *previous_folder;
- previous_folder = folderlist->last;
+ if (filelist_need_sorting(filelist)) {
+ filelist->need_sorting = false;
- /* check if already exists */
- if (previous_folder && previous_folder->foldername) {
- if (BLI_path_cmp(previous_folder->foldername, dir) == 0) {
- return;
+ switch (filelist->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;
+ case FILE_SORT_NONE: /* Should never reach this point! */
+ default:
+ BLI_assert(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);
+ filelist_filter_clear(filelist);
}
}
- ListBase *folderlist_duplicate(ListBase *folderlist)
+ void filelist_setsorting(struct FileList *filelist, const short sort)
{
-
- 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;
+ if (filelist->sort != sort) {
+ filelist->sort = sort;
+ filelist->need_sorting = true;
}
- return NULL;
}
+ /* ********** Filter helpers ********** */
- /* ------------------FILELIST------------------------ */
-
- static void filelist_readjob_main(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
- static void filelist_readjob_lib(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
- static void filelist_readjob_dir(struct FileList *, const char *, short *, short *, float *, ThreadMutex *);
-
- /* 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)
+ static bool is_hidden_file(const char *filename, FileListFilter *filter)
{
+ char *sep = (char *)BLI_last_slash(filename);
bool is_hidden = false;
- if (hide_dot) {
- if (filename[0] == '.' && filename[1] != '.' && filename[1] != 0) {
+ if (filter->hide_dot) {
+ if (filename[0] == '.' && filename[1] != '.' && filename[1] != '\0') {
is_hidden = true; /* ignore .file */
}
else {
@@@ -488,25 -472,14 +537,30 @@@
}
}
}
- if (!is_hidden && ((filename[0] == '.') && (filename[1] == 0))) {
+ if (!is_hidden && filter->hide_parent) {
+ if (filename[0] == '.' && filename[1] == '.' && filename[2] == '\0') {
+ is_hidden = true; /* ignore .. */
+ }
+ }
+ if (!is_hidden && ((filename[0] == '.') && (filename[1] == '\0'))) {
is_hidden = true; /* ignore . */
}
+ /* filename might actually be a piece of path, in which case we have to check all its parts. */
+ if (!is_hidden && sep) {
+ char tmp_filename[FILE_MAX_LIBEXTRA];
+
+ BLI_strncpy(tmp_filename, filename, sizeof(tmp_filename));
+ sep = tmp_filename + (sep - filename);
+ while (sep) {
+ BLI_assert(sep[1] != '\0');
- if (is_hidden_file(sep + 1, hide_dot)) {
++ if (is_hidden_file(sep + 1, filter)) {
+ is_hidden = true;
+ break;
+ }
+ *sep = '\0';
+ sep = (char *)BLI_last_slash(tmp_filename);
+ }
+ }
return is_hidden;
}
@@@ -533,29 -501,11 +587,29 @@@ static bool is_filtered_file(struct dir
static bool is_filtered_lib(struct direntry *file, const char *root, FileListFilter *filter)
{
- bool is_filtered = !is_hidden_file(file->relname, filter);
- char dir[FILE_MAXDIR], group[BLO_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list