Code Cleanup: style and redundant casts
[blender.git] / source / blender / editors / space_file / filelist.c
index 7d7dccdf0e69970221d76b51d229a3506f3628d8..748a0bd884c743535ab58ce68a7420455312657e 100644 (file)
@@ -152,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);
@@ -188,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);
@@ -221,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);
@@ -262,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);
@@ -294,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 . */
                }
        }
@@ -360,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++;
                }
        }
@@ -374,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;
                }
        }
@@ -463,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;
@@ -538,6 +556,7 @@ FileList *filelist_new(short type)
                default:
                        p->readf = filelist_read_dir;
                        p->filterf = is_filtered_file;
+                       break;
 
        }
        return p;
@@ -610,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];
@@ -627,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];
@@ -650,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) {
@@ -679,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];
@@ -756,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)
 {
-       int type = file_extension_type(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 = path_extension_type(path);
        
        if (type == BLENDERFILE)
                return ICON_FILE_BLEND;
@@ -840,12 +876,13 @@ 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[0] &&
                    BLI_testextensie_glob(file->relname, filelist->filter_glob))
@@ -957,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);
@@ -996,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);
@@ -1294,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);
                }
@@ -1355,7 +1393,7 @@ void thumbnails_start(FileList *filelist, const 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)) ) {
+                       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;