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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to