summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Hohensohn <hohensoh@rockbox.org>2004-06-22 09:16:44 +0000
committerJörg Hohensohn <hohensoh@rockbox.org>2004-06-22 09:16:44 +0000
commit5c8a2f5835f0980f7d1646c6c9288235b7e3499b (patch)
tree4dd4c58b37d636c44451bcd348349def75f437cd
parentcac729ef82b0da450f32b142b48923576f66caaf (diff)
downloadrockbox-5c8a2f5835f0980f7d1646c6c9288235b7e3499b.tar.gz
rockbox-5c8a2f5835f0980f7d1646c6c9288235b7e3499b.zip
sort options for files & directories
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4789 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/lang/english.lang44
-rw-r--r--apps/settings.c5
-rw-r--r--apps/settings.h4
-rw-r--r--apps/settings_menu.c27
-rw-r--r--apps/tree.c38
-rw-r--r--apps/tree.h11
6 files changed, 115 insertions, 14 deletions
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 4722d743a9..2c1f72ffb2 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -154,7 +154,7 @@ new:
154id: LANG_SORT_CASE 154id: LANG_SORT_CASE
155desc: in settings_menu 155desc: in settings_menu
156eng: "Sort Case Sensitive" 156eng: "Sort Case Sensitive"
157voice: "" 157voice: "Sort Case Sensitive"
158new: 158new:
159 159
160id: LANG_RESUME 160id: LANG_RESUME
@@ -254,9 +254,9 @@ voice: ""
254new: 254new:
255 255
256id: LANG_CASE_MENU 256id: LANG_CASE_MENU
257desc: in fileview_settings_menu() 257desc: DEPRECATED
258eng: "Sort Mode" 258eng: ""
259voice: "Sort Mode" 259voice: ""
260new: 260new:
261 261
262id: LANG_SCROLL_MENU 262id: LANG_SCROLL_MENU
@@ -2685,3 +2685,39 @@ desc: Onplay open with
2685eng: "Open with" 2685eng: "Open with"
2686voice: "open with" 2686voice: "open with"
2687new: 2687new:
2688
2689id: LANG_SORT_DIR
2690desc: browser sorting setting
2691eng: "Sort Directories"
2692voice: "sort directories"
2693new:
2694
2695id: LANG_SORT_FILE
2696desc: browser sorting setting
2697eng: "Sort Files"
2698voice: "sort files"
2699new:
2700
2701id: LANG_SORT_ALPHA
2702desc: browser sorting setting
2703eng: "Alphabetical"
2704voice: "Alphabetical"
2705new:
2706
2707id: LANG_SORT_DATE
2708desc: browser sorting setting
2709eng: "by date"
2710voice: "by date"
2711new:
2712
2713id: LANG_SORT_DATE_REVERSE
2714desc: browser sorting setting
2715eng: "by newest date"
2716voice: "by newest date"
2717new:
2718
2719id: LANG_SORT_TYPE
2720desc: browser sorting setting
2721eng: "by type"
2722voice: "by type"
2723new:
diff --git a/apps/settings.c b/apps/settings.c
index 56f61eb9b7..36fcff3814 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -318,8 +318,11 @@ static struct bit_entry hd_bits[] =
318 {2, S_O(talk_file), 0, "talk file", "off,number,spell" }, 318 {2, S_O(talk_file), 0, "talk file", "off,number,spell" },
319 {1, S_O(talk_menu), true, "talk menu", off_on }, 319 {1, S_O(talk_menu), true, "talk menu", off_on },
320 320
321 /* new stuff to be added here */ 321 /* new stuff to be added at the end */
322 /* If values are just added to the end, no need to bump the version. */ 322 /* If values are just added to the end, no need to bump the version. */
323 {2, S_O(sort_file), 0, "sort files", "alpha,oldest,newest,type" },
324 {2, S_O(sort_dir), 0, "sort dirs", "alpha,oldest,newest" },
325
323 326
324 /* Sum of all bit sizes must not grow beyond 0xB8*8 = 1472 */ 327 /* Sum of all bit sizes must not grow beyond 0xB8*8 = 1472 */
325}; 328};
diff --git a/apps/settings.h b/apps/settings.h
index 315824cd9e..ddc3aca599 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -208,6 +208,10 @@ struct user_settings
208 bool talk_menu; /* enable voice UI */ 208 bool talk_menu; /* enable voice UI */
209 int talk_dir; /* talkbox mode: 0=off 1=number 2=clip@enter 3=clip@hover */ 209 int talk_dir; /* talkbox mode: 0=off 1=number 2=clip@enter 3=clip@hover */
210 int talk_file; /* voice filename mode: 0=off, 1=number, other t.b.d. */ 210 int talk_file; /* voice filename mode: 0=off, 1=number, other t.b.d. */
211
212 /* file browser sorting */
213 int sort_file; /* 0=alpha, 1=date, 2=date (new first), 3=type */
214 int sort_dir; /* 0=alpha, 1=date (old first), 2=date (new first) */
211}; 215};
212 216
213enum optiontype { INT, BOOL }; 217enum optiontype { INT, BOOL };
diff --git a/apps/settings_menu.c b/apps/settings_menu.c
index 34f7a99c2a..d20aa3bda0 100644
--- a/apps/settings_menu.c
+++ b/apps/settings_menu.c
@@ -476,6 +476,29 @@ static bool sort_case(void)
476 return set_bool( str(LANG_SORT_CASE), &global_settings.sort_case ); 476 return set_bool( str(LANG_SORT_CASE), &global_settings.sort_case );
477} 477}
478 478
479static bool sort_file(void)
480{
481 struct opt_items names[] = {
482 { STR(LANG_SORT_ALPHA) },
483 { STR(LANG_SORT_DATE) },
484 { STR(LANG_SORT_DATE_REVERSE) },
485 { STR(LANG_SORT_TYPE) }
486 };
487 return set_option( str(LANG_SORT_FILE), &global_settings.sort_file, INT,
488 names, 4, NULL );
489}
490
491static bool sort_dir(void)
492{
493 struct opt_items names[] = {
494 { STR(LANG_SORT_ALPHA) },
495 { STR(LANG_SORT_DATE) },
496 { STR(LANG_SORT_DATE_REVERSE) }
497 };
498 return set_option( str(LANG_SORT_DIR), &global_settings.sort_dir, INT,
499 names, 3, NULL );
500}
501
479static bool resume(void) 502static bool resume(void)
480{ 503{
481 struct opt_items names[] = { 504 struct opt_items names[] = {
@@ -1056,7 +1079,9 @@ static bool fileview_settings_menu(void)
1056 bool result; 1079 bool result;
1057 1080
1058 struct menu_item items[] = { 1081 struct menu_item items[] = {
1059 { STR(LANG_CASE_MENU), sort_case }, 1082 { STR(LANG_SORT_CASE), sort_case },
1083 { STR(LANG_SORT_DIR), sort_dir },
1084 { STR(LANG_SORT_FILE), sort_file },
1060 { STR(LANG_FILTER), dir_filter }, 1085 { STR(LANG_FILTER), dir_filter },
1061 { STR(LANG_FOLLOW), browse_current }, 1086 { STR(LANG_FOLLOW), browse_current },
1062 { STR(LANG_SHOW_ICONS), show_icons }, 1087 { STR(LANG_SHOW_ICONS), show_icons },
diff --git a/apps/tree.c b/apps/tree.c
index 09391b31b6..c68927be60 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -255,14 +255,46 @@ static int compare(const void* p1, const void* p2)
255{ 255{
256 struct entry* e1 = (struct entry*)p1; 256 struct entry* e1 = (struct entry*)p1;
257 struct entry* e2 = (struct entry*)p2; 257 struct entry* e2 = (struct entry*)p2;
258 int criteria;
258 259
259 if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY )) 260 if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY)
261 { /* two directories */
262 criteria = global_settings.sort_dir;
263 }
264 else if (!(e1->attr & ATTR_DIRECTORY) && !(e2->attr & ATTR_DIRECTORY))
265 { /* two files */
266 criteria = global_settings.sort_file;
267 }
268 else /* dir and file, dir goes first */
269 return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY );
270
271 switch(criteria)
272 {
273 case 3: /* sort type */
274 {
275 int t1 = e1->attr & TREE_ATTR_MASK;
276 int t2 = e2->attr & TREE_ATTR_MASK;
277
278 if (!t1) /* unknown type */
279 t1 = 0x7FFFFFFF; /* gets a high number, to sort after known */
280 if (!t2) /* unknown type */
281 t2 = 0x7FFFFFFF; /* gets a high number, to sort after known */
282
283 if (t1 - t2) /* if different */
284 return t1 - t2;
285 /* else fall through to alphabetical sorting */
286 }
287 case 0: /* sort alphabetically */
260 if (global_settings.sort_case) 288 if (global_settings.sort_case)
261 return strncmp(e1->name, e2->name, MAX_PATH); 289 return strncmp(e1->name, e2->name, MAX_PATH);
262 else 290 else
263 return strncasecmp(e1->name, e2->name, MAX_PATH); 291 return strncasecmp(e1->name, e2->name, MAX_PATH);
264 else 292 case 1: /* sort date */
265 return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY ); 293 return e1->time_write - e2->time_write;
294 case 2: /* sort date, newest first */
295 return e2->time_write - e1->time_write;
296 }
297 return 0; /* never reached */
266} 298}
267 299
268static void showfileline(int line, int direntry, bool scroll, int *dirfilter) 300static void showfileline(int line, int direntry, bool scroll, int *dirfilter)
diff --git a/apps/tree.h b/apps/tree.h
index a0015b6e76..01f3669477 100644
--- a/apps/tree.h
+++ b/apps/tree.h
@@ -36,15 +36,16 @@ struct filetype {
36 36
37 37
38/* using attribute not used by FAT */ 38/* using attribute not used by FAT */
39#define TREE_ATTR_MPA 0x0100 /* mpeg audio file */ 39/* (this also reflects the sort order if by type) */
40#define TREE_ATTR_BMARK 0x0100 /* book mark file */
40#define TREE_ATTR_M3U 0x0200 /* playlist */ 41#define TREE_ATTR_M3U 0x0200 /* playlist */
41#define TREE_ATTR_WPS 0x0300 /* wps config file */ 42#define TREE_ATTR_MPA 0x0300 /* mpeg audio file */
42#define TREE_ATTR_MOD 0x0400 /* firmware file */ 43#define TREE_ATTR_CFG 0x0400 /* config file */
43#define TREE_ATTR_CFG 0x0500 /* config file */ 44#define TREE_ATTR_WPS 0x0500 /* wps config file */
44#define TREE_ATTR_FONT 0x0600 /* font file */ 45#define TREE_ATTR_FONT 0x0600 /* font file */
45#define TREE_ATTR_LNG 0x0700 /* binary lang file */ 46#define TREE_ATTR_LNG 0x0700 /* binary lang file */
46#define TREE_ATTR_ROCK 0x0800 /* binary rockbox plugin */ 47#define TREE_ATTR_ROCK 0x0800 /* binary rockbox plugin */
47#define TREE_ATTR_BMARK 0x0900 /* book mark file */ 48#define TREE_ATTR_MOD 0x0900 /* firmware file */
48#define TREE_ATTR_MASK 0xFFC0 /* which bits tree.c uses (above) */ 49#define TREE_ATTR_MASK 0xFFC0 /* which bits tree.c uses (above) */
49 50
50void tree_get_filetypes(struct filetype**, int*); 51void tree_get_filetypes(struct filetype**, int*);