Index: apps/playlist.c =================================================================== --- apps/playlist.c (revision 18740) +++ apps/playlist.c (working copy) @@ -1425,20 +1425,21 @@ { struct playlist_info* playlist = ¤t_playlist; int result = -1; - int sort_dir = global_settings.sort_dir; char *start_dir = NULL; bool exit = false; struct tree_context* tc = tree_get_context(); int dirfilter = *(tc->dirfilter); + + /* process random folder advance */ if (global_settings.next_folder == FOLDER_ADVANCE_RANDOM) { int fd = open(ROCKBOX_DIR "/folder_advance_list.dat",O_RDONLY); - char buffer[MAX_PATH]; - int folder_count = 0,i; - srand(current_tick); - *(tc->dirfilter) = SHOW_MUSIC; if (fd >= 0) { + char buffer[MAX_PATH]; + int folder_count = 0,i; + srand(current_tick); + *(tc->dirfilter) = SHOW_MUSIC; read(fd,&folder_count,sizeof(int)); if (!folder_count) exit = true; @@ -1458,12 +1459,15 @@ return 0; } } - /* not random folder advance */ - if (recursion){ + + /* not random folder advance (or random folder advance unavailable) */ + if (recursion) + { /* start with root */ dir[0] = '\0'; } - else{ + else + { /* start with current directory */ strncpy(dir, playlist->filename, playlist->dirlen-1); dir[playlist->dirlen-1] = '\0'; @@ -1473,15 +1477,31 @@ *(tc->dirfilter) = SHOW_ALL; /* sort in another direction if previous dir is requested */ - if(!is_forward){ - if ((global_settings.sort_dir == 0) || (global_settings.sort_dir == 3)) - global_settings.sort_dir = 4; - else if (global_settings.sort_dir == 1) - global_settings.sort_dir = 2; - else if (global_settings.sort_dir == 2) - global_settings.sort_dir = 1; - else if (global_settings.sort_dir == 4) - global_settings.sort_dir = 0; + int sort_dir = global_settings.sort_dir; + if (!is_forward) + { + + switch(sort_dir) + { + case 0: /* Alpha */ + sort_dir = 4; /* Reverse alpha */ + break; + case 1: /* Date */ + sort_dir = 2; /* Reverse date */ + break; + case 2: /* Reverse date */ + sort_dir = 1; /* Date */ + break; + case 3: /* Type */ + sort_dir = 5; /* Reverse type */ + break; + case 4: /* Reverse alpha */ + sort_dir = 0; /* Alpha */ + break; + case 5: /* Reverse type */ + sort_dir = 3; /* Type */ + break; + } } while (!exit) @@ -1490,7 +1510,7 @@ int num_files = 0; int i; - if (ft_load(tc, (dir[0]=='\0')?"/":dir) < 0) + if (ft_load(tc, (dir[0]=='\0')?"/":dir, sort_dir) < 0) { splash(HZ*2, ID2P(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); exit = true; @@ -1542,14 +1562,12 @@ } } - /* restore dirfilter & sort_dir */ + /* restore dirfilter */ *(tc->dirfilter) = dirfilter; - global_settings.sort_dir = sort_dir; /* special case if nothing found: try start searching again from root */ - if (result == -1 && !recursion){ - result = get_next_dir(dir,is_forward, true); - } + if (result == -1 && !recursion) + result = get_next_dir(dir, is_forward, true); return result; } @@ -1571,7 +1589,7 @@ snprintf(dir+dirlen, MAX_PATH-dirlen, "/%s", subdir); - if (ft_load(tc, dir) < 0) + if (ft_load(tc, dir, global_settings.sort_dir) < 0) { splash(HZ*2, ID2P(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); return -2; @@ -1625,7 +1643,7 @@ } /* we now need to reload our current directory */ - if(ft_load(tc, dir) < 0) + if(ft_load(tc, dir, global_settings.sort_dir) < 0) splash(HZ*2, ID2P(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); } return result; @@ -3480,7 +3498,7 @@ /* use the tree browser dircache to load files */ *(tc->dirfilter) = SHOW_ALL; - if (ft_load(tc, dirname) < 0) + if (ft_load(tc, dirname, global_settings.sort_dir) < 0) { splash(HZ*2, ID2P(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); *(tc->dirfilter) = old_dirfilter; @@ -3515,7 +3533,7 @@ break; /* we now need to reload our current directory */ - if(ft_load(tc, dirname) < 0) + if(ft_load(tc, dirname, global_settings.sort_dir) < 0) { result = -1; break; Index: apps/tree.c =================================================================== --- apps/tree.c (revision 18740) +++ apps/tree.c (working copy) @@ -366,7 +366,7 @@ /* if the tc.currdir has been changed, reload it ...*/ if (strncmp(tc.currdir, lastdir, sizeof(lastdir)) || reload_dir) { - if (ft_load(&tc, NULL) < 0) + if (ft_load(&tc, NULL, global_settings.sort_dir) < 0) return -1; strcpy(lastdir, tc.currdir); changed = true; @@ -484,7 +484,7 @@ bool id3db = *tc.dirfilter == SHOW_ID3DB; #endif - if (ft_load(&tc, dir) < 0) + if (ft_load(&tc, dir, global_settings.sort_dir) < 0) return; lastdir[0] = 0; @@ -588,7 +588,7 @@ } } } - if (ft_load(&tc, NULL) >= 0) + if (ft_load(&tc, NULL, global_settings.sort_dir) >= 0) { tc.selected_item = tree_get_file_position(lastfile); } Index: apps/settings.h =================================================================== --- apps/settings.h (revision 18740) +++ apps/settings.h (working copy) @@ -542,8 +542,8 @@ bool talk_battery_level; /* file browser sorting */ - int sort_file; /* 0=alpha, 1=date, 2=date (new first), 3=type */ - int sort_dir; /* 0=alpha, 1=date (old first), 2=date (new first) */ + int sort_file; /* 0=alpha, 1=date, 2=reverse date, 3=type, (4=reverse alpha, 5=reverse type) */ + int sort_dir; /* 0=alpha, 1=date, 2=reverse date, 3=type, (4=reverse alpha, 5=reverse type) */ #ifdef HAVE_REMOTE_LCD /* remote lcd */ Index: apps/filetree.c =================================================================== --- apps/filetree.c (revision 18740) +++ apps/filetree.c (working copy) @@ -55,6 +55,8 @@ #include "backdrop.h" +static int compare_sort_dir; /* qsort key for sorting directories */ + int ft_build_playlist(struct tree_context* c, int start_index) { int i; @@ -189,7 +191,7 @@ if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) { /* two directories */ - criteria = global_settings.sort_dir; + criteria = compare_sort_dir; #ifdef HAVE_MULTIVOLUME if (e1->attr & ATTR_VOLUME || e2->attr & ATTR_VOLUME) @@ -211,43 +213,36 @@ switch(criteria) { - case 3: /* sort type */ + case 3: /* type */ + case 5: /* reverse type */ { int t1 = e1->attr & FILE_ATTR_MASK; int t2 = e2->attr & FILE_ATTR_MASK; - if (!t1) /* unknown type */ t1 = INT_MAX; /* gets a high number, to sort after known */ if (!t2) /* unknown type */ t2 = INT_MAX; /* gets a high number, to sort after known */ - if (t1 - t2) /* if different */ - return t1 - t2; + if (t1 != t2) /* if different */ + return (t1 - t2) * (criteria == 5 ? -1 : 1); /* else fall through to alphabetical sorting */ } - case 0: /* sort alphabetically asc */ + case 0: /* alpha */ + case 4: /* reverse alpha */ if (global_settings.sort_case) - return strncmp(e1->name, e2->name, MAX_PATH); + return strncmp(e1->name, e2->name, MAX_PATH) * (criteria == 4 ? -1 : 1); else - return strncasecmp(e1->name, e2->name, MAX_PATH); + return strncasecmp(e1->name, e2->name, MAX_PATH) * (criteria == 4 ? -1 : 1); - case 4: /* sort alphabetically desc */ - if (global_settings.sort_case) - return strncmp(e2->name, e1->name, MAX_PATH); - else - return strncasecmp(e2->name, e1->name, MAX_PATH); - - case 1: /* sort date */ - return e1->time_write - e2->time_write; - - case 2: /* sort date, newest first */ - return e2->time_write - e1->time_write; + case 1: /* date */ + case 2: + return (e1->time_write - e2->time_write) * (criteria == 2 ? -1 : 1); } return 0; /* never reached */ } /* load and sort directory into dircache. returns NULL on failure. */ -int ft_load(struct tree_context* c, const char* tempdir) +int ft_load(struct tree_context* c, const char* tempdir, int sort_dir) { int i; int name_buffer_used = 0; @@ -345,6 +340,7 @@ c->dirlength = i; closedir(dir); + compare_sort_dir = sort_dir; qsort(c->dircache,i,sizeof(struct entry),compare); /* If thumbnail talking is enabled, make an extra run to mark files with Index: apps/filetree.h =================================================================== --- apps/filetree.h (revision 18740) +++ apps/filetree.h (working copy) @@ -22,7 +22,7 @@ #define FILETREE_H #include "tree.h" -int ft_load(struct tree_context* c, const char* tempdir); +int ft_load(struct tree_context* c, const char* tempdir, int sort_dir); int ft_enter(struct tree_context* c); int ft_exit(struct tree_context* c); int ft_build_playlist(struct tree_context* c, int start_index); Index: apps/playlist_catalog.c =================================================================== --- apps/playlist_catalog.c (revision 18740) +++ apps/playlist_catalog.c (working copy) @@ -127,7 +127,7 @@ /* use the tree browser dircache to load only playlists */ *(tc->dirfilter) = SHOW_PLAYLIST; - if (ft_load(tc, playlist_dir) < 0) + if (ft_load(tc, playlist_dir, global_settings.sort_dir) < 0) { splashf(HZ*2, ID2P(LANG_CATALOG_NO_DIRECTORY), playlist_dir); goto exit;