Code Cleanup: style and redundant casts
[blender.git] / source / blender / editors / space_file / filelist.c
index c24447f16c39acdaa775c9062ec2e35f44ed0468..748a0bd884c743535ab58ce68a7420455312657e 100644 (file)
@@ -48,6 +48,7 @@
 #include "BLI_linklist.h"
 #include "BLI_threads.h"
 #include "BLI_utildefines.h"
+#include "BLI_fileops_types.h"
 
 #ifdef WIN32
 #  include "BLI_winstuff.h"
@@ -151,17 +152,27 @@ static ImBuf *gSpecialFileImages[SPECIAL_IMG_MAX];
 
 /* ******************* SORT ******************* */
 
+static bool compare_is_directory(const struct direntry *entry)
+{
+       /* for library browse .blend files may be treated as directories, but
+        * for sorting purposes they should be considered regular files */
+       if (S_ISDIR(entry->type))
+               return !(entry->flags & (BLENDERFILE | BLENDERFILE_BACKUP));
+       
+       return false;
+}
+
 static int compare_name(const void *a1, const void *a2)
 {
        const struct direntry *entry1 = a1, *entry2 = a2;
 
        /* type is equal to stat.st_mode */
 
-       if (S_ISDIR(entry1->type)) {
-               if (S_ISDIR(entry2->type) == 0) return (-1);
+       if (compare_is_directory(entry1)) {
+               if (compare_is_directory(entry2) == 0) return (-1);
        }
        else {
-               if (S_ISDIR(entry2->type)) return (1);
+               if (compare_is_directory(entry2)) return (1);
        }
        if (S_ISREG(entry1->type)) {
                if (S_ISREG(entry2->type) == 0) return (-1);
@@ -187,11 +198,11 @@ static int compare_date(const void *a1, const void *a2)
        
        /* type is equal to stat.st_mode */
 
-       if (S_ISDIR(entry1->type)) {
-               if (S_ISDIR(entry2->type) == 0) return (-1);
+       if (compare_is_directory(entry1)) {
+               if (compare_is_directory(entry2) == 0) return (-1);
        }
        else {
-               if (S_ISDIR(entry2->type)) return (1);
+               if (compare_is_directory(entry2)) return (1);
        }
        if (S_ISREG(entry1->type)) {
                if (S_ISREG(entry2->type) == 0) return (-1);
@@ -220,11 +231,11 @@ static int compare_size(const void *a1, const void *a2)
 
        /* type is equal to stat.st_mode */
 
-       if (S_ISDIR(entry1->type)) {
-               if (S_ISDIR(entry2->type) == 0) return (-1);
+       if (compare_is_directory(entry1)) {
+               if (compare_is_directory(entry2) == 0) return (-1);
        }
        else {
-               if (S_ISDIR(entry2->type)) return (1);
+               if (compare_is_directory(entry2)) return (1);
        }
        if (S_ISREG(entry1->type)) {
                if (S_ISREG(entry2->type) == 0) return (-1);
@@ -261,11 +272,11 @@ static int compare_extension(const void *a1, const void *a2)
 
        /* type is equal to stat.st_mode */
 
-       if (S_ISDIR(entry1->type)) {
-               if (S_ISDIR(entry2->type) == 0) return (-1);
+       if (compare_is_directory(entry1)) {
+               if (compare_is_directory(entry2) == 0) return (-1);
        }
        else {
-               if (S_ISDIR(entry2->type)) return (1);
+               if (compare_is_directory(entry2)) return (1);
        }
        if (S_ISREG(entry1->type)) {
                if (S_ISREG(entry2->type) == 0) return (-1);
@@ -293,18 +304,18 @@ static int is_hidden_file(const char *filename, short hide_dot)
                if (filename[0] == '.' && filename[1] != '.' && filename[1] != 0) {
                        is_hidden = 1; /* ignore .file */
                }
-               else if (((filename[0] == '.') && (filename[1] == 0) )) {
+               else if (((filename[0] == '.') && (filename[1] == 0))) {
                        is_hidden = 1; /* ignore . */
                }
                else {
                        int len = strlen(filename);
-                       if ( (len > 0) && (filename[len - 1] == '~') ) {
+                       if ((len > 0) && (filename[len - 1] == '~')) {
                                is_hidden = 1;  /* ignore file~ */
                        }
                }
        }
        else {
-               if (((filename[0] == '.') && (filename[1] == 0) )) {
+               if (((filename[0] == '.') && (filename[1] == 0))) {
                        is_hidden = 1; /* ignore . */
                }
        }
@@ -359,7 +370,7 @@ void filelist_filter(FileList *filelist)
        /* How many files are left after filter ? */
        for (i = 0; i < filelist->numfiles; ++i) {
                struct direntry *file = &filelist->filelist[i];
-               if (filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot) ) {
+               if (filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot)) {
                        num_filtered++;
                }
        }
@@ -373,7 +384,7 @@ void filelist_filter(FileList *filelist)
 
        for (i = 0, j = 0; i < filelist->numfiles; ++i) {
                struct direntry *file = &filelist->filelist[i];
-               if (filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot) ) {
+               if (filelist->filterf(file, filelist->dir, filelist->filter, filelist->hide_dot)) {
                        filelist->fidx[j++] = i;
                }
        }
@@ -462,15 +473,23 @@ void folderlist_pushdir(ListBase *folderlist, const char *dir)
 
        /* create next folder element */
        folder = (FolderList *)MEM_mallocN(sizeof(FolderList), "FolderList");
-       folder->foldername = (char *)MEM_mallocN(sizeof(char) * (strlen(dir) + 1), "foldername");
-       folder->foldername[0] = '\0';
-
-       BLI_strncpy(folder->foldername, dir, FILE_MAXDIR);
+       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;
@@ -537,6 +556,7 @@ FileList *filelist_new(short type)
                default:
                        p->readf = filelist_read_dir;
                        p->filterf = is_filtered_file;
+                       break;
 
        }
        return p;
@@ -545,8 +565,6 @@ FileList *filelist_new(short type)
 
 void filelist_free(struct FileList *filelist)
 {
-       int i;
-
        if (!filelist) {
                printf("Attempting to delete empty filelist.\n");
                return;
@@ -557,23 +575,8 @@ void filelist_free(struct FileList *filelist)
                filelist->fidx = NULL;
        }
 
-       for (i = 0; i < filelist->numfiles; ++i) {
-               if (filelist->filelist[i].image) {
-                       IMB_freeImBuf(filelist->filelist[i].image);
-               }
-               filelist->filelist[i].image = NULL;
-               if (filelist->filelist[i].relname)
-                       MEM_freeN(filelist->filelist[i].relname);
-               if (filelist->filelist[i].path)
-                       MEM_freeN(filelist->filelist[i].path);
-               filelist->filelist[i].relname = NULL;
-               if (filelist->filelist[i].string)
-                       MEM_freeN(filelist->filelist[i].string);
-               filelist->filelist[i].string = NULL;
-       }
-       
+       BLI_free_filelist(filelist->filelist, filelist->numfiles);
        filelist->numfiles = 0;
-       free(filelist->filelist);
        filelist->filelist = NULL;
        filelist->filter = 0;
        filelist->filter_glob[0] = '\0';
@@ -626,7 +629,7 @@ ImBuf *filelist_getimage(struct FileList *filelist, int index)
 
        BLI_assert(G.background == FALSE);
 
-       if ( (index < 0) || (index >= filelist->numfiltered) ) {
+       if ((index < 0) || (index >= filelist->numfiltered)) {
                return NULL;
        }
        fidx = filelist->fidx[index];
@@ -643,7 +646,7 @@ ImBuf *filelist_geticon(struct FileList *filelist, int index)
 
        BLI_assert(G.background == FALSE);
 
-       if ( (index < 0) || (index >= filelist->numfiltered) ) {
+       if ((index < 0) || (index >= filelist->numfiltered)) {
                return NULL;
        }
        fidx = filelist->fidx[index];
@@ -666,7 +669,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) || (file->flags & MOVIEFILE_ICON)) {
                ibuf = gSpecialFileImages[SPECIAL_IMG_MOVIEFILE];
        }
        else if (file->flags & SOUNDFILE) {
@@ -695,7 +698,7 @@ struct direntry *filelist_file(struct FileList *filelist, int index)
 {
        int fidx = 0;
        
-       if ( (index < 0) || (index >= filelist->numfiltered) ) {
+       if ((index < 0) || (index >= filelist->numfiltered)) {
                return NULL;
        }
        fidx = filelist->fidx[index];
@@ -744,6 +747,7 @@ void filelist_setfilter_types(struct FileList *filelist, const char *filter_glob
        BLI_strncpy(filelist->filter_glob, filter_glob, sizeof(filelist->filter_glob));
 }
 
+/* would recognize .blend as well */
 static int file_is_blend_backup(const char *str)
 {
        short a, b;
@@ -771,56 +775,73 @@ static int file_is_blend_backup(const char *str)
        return (retval);
 }
 
-
-static int file_extension_type(const char *relname)
+static int path_extension_type(const char *path)
 {
-       if (BLO_has_bfile_extension(relname)) {
+       if (BLO_has_bfile_extension(path)) {
                return BLENDERFILE;
        }
-       else if (file_is_blend_backup(relname)) {
+       else if (file_is_blend_backup(path)) {
                return BLENDERFILE_BACKUP;
        }
-       else if (BLI_testextensie(relname, ".py")) {
+       else if (BLI_testextensie(path, ".app")) {
+               return APPLICATIONBUNDLE;
+       }
+       else if (BLI_testextensie(path, ".py")) {
                return PYSCRIPTFILE;
        }
-       else if (BLI_testextensie(relname, ".txt")  ||
-                BLI_testextensie(relname, ".glsl") ||
-                BLI_testextensie(relname, ".osl")  ||
-                BLI_testextensie(relname, ".data"))
+       else if (BLI_testextensie(path, ".txt")  ||
+                BLI_testextensie(path, ".glsl") ||
+                BLI_testextensie(path, ".osl")  ||
+                BLI_testextensie(path, ".data"))
        {
                return TEXTFILE;
        }
-       else if (BLI_testextensie(relname, ".ttf") ||
-                BLI_testextensie(relname, ".ttc") ||
-                BLI_testextensie(relname, ".pfb") ||
-                BLI_testextensie(relname, ".otf") ||
-                BLI_testextensie(relname, ".otc"))
+       else if (BLI_testextensie(path, ".ttf") ||
+                BLI_testextensie(path, ".ttc") ||
+                BLI_testextensie(path, ".pfb") ||
+                BLI_testextensie(path, ".otf") ||
+                BLI_testextensie(path, ".otc"))
        {
                return FTFONTFILE;
        }
-       else if (BLI_testextensie(relname, ".btx")) {
+       else if (BLI_testextensie(path, ".btx")) {
                return BTXFILE;
        }
-       else if (BLI_testextensie(relname, ".dae")) {
+       else if (BLI_testextensie(path, ".dae")) {
                return COLLADAFILE;
        }
-       else if (BLI_testextensie_array(relname, imb_ext_image) ||
-                (G.have_quicktime && BLI_testextensie_array(relname, imb_ext_image_qt)))
+       else if (BLI_testextensie_array(path, imb_ext_image) ||
+                (G.have_quicktime && BLI_testextensie_array(path, imb_ext_image_qt)))
        {
                return IMAGEFILE;
        }
-       else if (BLI_testextensie_array(relname, imb_ext_movie)) {
+       else if (BLI_testextensie(path, ".ogg")) {
+               if (IMB_isanim(path)) {
+                       return MOVIEFILE;
+               }
+               else {
+                       return SOUNDFILE;
+               }
+       }
+       else if (BLI_testextensie_array(path, imb_ext_movie)) {
                return MOVIEFILE;
        }
-       else if (BLI_testextensie_array(relname, imb_ext_audio)) {
+       else if (BLI_testextensie_array(path, imb_ext_audio)) {
                return SOUNDFILE;
        }
        return 0;
 }
 
-int ED_file_extension_icon(const char *relname)
+static int file_extension_type(const char *dir, const char *relname)
+{
+       char path[FILE_MAX];
+       BLI_join_dirfile(path, sizeof(path), dir, relname);
+       return path_extension_type(path);
+}
+
+int ED_file_extension_icon(const char *path)
 {
-       int type = file_extension_type(relname);
+       int type = path_extension_type(path);
        
        if (type == BLENDERFILE)
                return ICON_FILE_BLEND;
@@ -855,14 +876,15 @@ static void filelist_setfiletypes(struct FileList *filelist)
        
        for (num = 0; num < filelist->numfiles; num++, file++) {
                file->type = file->s.st_mode;  /* restore the mess below */
-               
-               /* Don't check extensions for directories */ 
+#ifndef __APPLE__
+               /* Don't check extensions for directories, allow in OSX cause bundles have extensions*/
                if (file->type & S_IFDIR) {
                        continue;
                }
-               file->flags = file_extension_type(file->relname);
+#endif
+               file->flags = file_extension_type(filelist->dir, file->relname);
                
-               if (filelist->filter_glob &&
+               if (filelist->filter_glob[0] &&
                    BLI_testextensie_glob(file->relname, filelist->filter_glob))
                {
                        file->flags = OPERATORFILE;
@@ -873,18 +895,14 @@ static void filelist_setfiletypes(struct FileList *filelist)
 
 static void filelist_read_dir(struct FileList *filelist)
 {
-       char wdir[FILE_MAX] = "";
        if (!filelist) return;
 
        filelist->fidx = NULL;
        filelist->filelist = NULL;
 
-       BLI_current_working_dir(wdir, sizeof(wdir));  /* backup cwd to restore after */
-
        BLI_cleanup_dir(G.main->name, filelist->dir);
        filelist->numfiles = BLI_dir_contents(filelist->dir, &(filelist->filelist));
 
-       if (!chdir(wdir)) {} /* fix warning about not checking return value */
        filelist_setfiletypes(filelist);
        filelist_filter(filelist);
 }
@@ -976,7 +994,7 @@ void filelist_select_file(struct FileList *filelist, int index, FileSelType sele
 void filelist_select(struct FileList *filelist, FileSelection *sel, FileSelType select, unsigned int flag, FileCheckType check)
 {
        /* select all valid files between first and last indicated */
-       if ( (sel->first >= 0) && (sel->first < filelist->numfiltered) && (sel->last >= 0) && (sel->last < filelist->numfiltered) ) {
+       if ((sel->first >= 0) && (sel->first < filelist->numfiltered) && (sel->last >= 0) && (sel->last < filelist->numfiltered)) {
                int current_file;
                for (current_file = sel->first; current_file <= sel->last; current_file++) {
                        filelist_select_file(filelist, current_file, select, flag, check);
@@ -1015,6 +1033,7 @@ void filelist_sort(struct FileList *filelist, short sort)
                        break;
                case FILE_SORT_EXTENSION:
                        qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_extension);
+                       break;
        }
 
        filelist_filter(filelist);
@@ -1032,7 +1051,7 @@ static int groupname_to_code(const char *group)
        char *lslash;
        
        BLI_strncpy(buf, group, sizeof(buf));
-       lslash = BLI_last_slash(buf);
+       lslash = (char *)BLI_last_slash(buf);
        if (lslash)
                lslash[0] = '\0';
 
@@ -1161,7 +1180,11 @@ void filelist_from_main(struct FileList *filelist)
        if (filelist->dir[0] == 0) {
                
                /* make directories */
+#ifdef WITH_FREESTYLE
                filelist->numfiles = 25;
+#else
+               filelist->numfiles = 24;
+#endif
                filelist->filelist = (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry));
                
                for (a = 0; a < filelist->numfiles; a++) {
@@ -1192,7 +1215,9 @@ void filelist_from_main(struct FileList *filelist)
                filelist->filelist[21].relname = BLI_strdup("Action");
                filelist->filelist[22].relname = BLI_strdup("NodeTree");
                filelist->filelist[23].relname = BLI_strdup("Speaker");
-               filelist->filelist[24].relname= BLI_strdup("FreestyleLineStyle");
+#ifdef WITH_FREESTYLE
+               filelist->filelist[24].relname = BLI_strdup("FreestyleLineStyle");
+#endif
                filelist_sort(filelist, FILE_SORT_ALPHA);
        }
        else {
@@ -1307,7 +1332,7 @@ static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float
        tj->stop = stop;
        tj->do_update = do_update;
 
-       while ( (*stop == 0) && (limg) ) {
+       while ((*stop == 0) && (limg)) {
                if (limg->flags & IMAGEFILE) {
                        limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_IMAGE);
                }
@@ -1357,7 +1382,7 @@ static void thumbnails_free(void *tjv)
 }
 
 
-void thumbnails_start(struct FileList *filelist, const struct bContext *C)
+void thumbnails_start(FileList *filelist, const bContext *C)
 {
        wmJob *wm_job;
        ThumbnailJob *tj;
@@ -1368,8 +1393,8 @@ void thumbnails_start(struct FileList *filelist, const struct bContext *C)
        tj->filelist = filelist;
        for (idx = 0; idx < filelist->numfiles; idx++) {
                if (!filelist->filelist[idx].image) {
-                       if ( (filelist->filelist[idx].flags & (IMAGEFILE | MOVIEFILE | BLENDERFILE | BLENDERFILE_BACKUP)) ) {
-                               FileImage *limg = MEM_callocN(sizeof(struct FileImage), "loadimage");
+                       if ((filelist->filelist[idx].flags & (IMAGEFILE | MOVIEFILE | BLENDERFILE | BLENDERFILE_BACKUP))) {
+                               FileImage *limg = MEM_callocN(sizeof(FileImage), "loadimage");
                                BLI_strncpy(limg->path, filelist->filelist[idx].path, FILE_MAX);
                                limg->index = idx;
                                limg->flags = filelist->filelist[idx].flags;
@@ -1391,12 +1416,12 @@ void thumbnails_start(struct FileList *filelist, const struct bContext *C)
        WM_jobs_start(CTX_wm_manager(C), wm_job);
 }
 
-void thumbnails_stop(struct FileList *filelist, const struct bContext *C)
+void thumbnails_stop(wmWindowManager *wm, FileList *filelist)
 {
-       WM_jobs_kill(CTX_wm_manager(C), filelist, NULL);
+       WM_jobs_kill(wm, filelist, NULL);
 }
 
-int thumbnails_running(struct FileList *filelist, const struct bContext *C)
+int thumbnails_running(wmWindowManager *wm, FileList *filelist)
 {
-       return WM_jobs_test(CTX_wm_manager(C), filelist, WM_JOB_TYPE_FILESEL_THUMBNAIL);
+       return WM_jobs_test(wm, filelist, WM_JOB_TYPE_FILESEL_THUMBNAIL);
 }