summaryrefslogtreecommitdiff
path: root/apps/tree.c
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 /apps/tree.c
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
Diffstat (limited to 'apps/tree.c')
-rw-r--r--apps/tree.c38
1 files changed, 35 insertions, 3 deletions
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)