summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-07-16 15:30:23 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-07-16 15:30:23 +0000
commitad7de31660bd3c499c0513ea2ad374e391086a89 (patch)
treede437465066d183176c2b399de06e6f632435bac /apps
parent761d6840b6270513e57e78999063d43d47c8def9 (diff)
downloadrockbox-ad7de31660bd3c499c0513ea2ad374e391086a89.zip
rockbox-ad7de31660bd3c499c0513ea2ad374e391086a89.tar.gz
rockbox-ad7de31660bd3c499c0513ea2ad374e391086a89.tar.bz2
rockbox-ad7de31660bd3c499c0513ea2ad374e391086a89.tar.xz
Fixing the bugs introduced by last commit.
Using attributes for M3U and MP3 instead of checking filenames. Chops extensions only on display, not in cache. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1374 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/tree.c119
1 files changed, 65 insertions, 54 deletions
diff --git a/apps/tree.c b/apps/tree.c
index de630df..5f54784 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -106,6 +106,7 @@ extern unsigned char bitmap_icons_6x8[LastIcon][6];
#endif /* HAVE_RECORDER_KEYPAD */
#define TREE_ATTR_M3U 0x80 /* unused by FAT attributes */
+#define TREE_ATTR_MP3 0x40 /* unused by FAT attributes */
static int compare(const void* e1, const void* e2)
{
@@ -125,51 +126,45 @@ static int showdir(char *path, int start)
DIR *dir = opendir(path);
if(!dir)
return -1; /* not a directory */
+
memset(dircacheptr,0,sizeof(dircacheptr));
for ( i=0; i<MAX_FILES_IN_DIR; i++ ) {
int len;
struct dirent *entry = readdir(dir);
+ struct entry* dptr = &dircache[i];
if (!entry)
break;
/* skip directories . and .. */
- if (!strncmp(entry->d_name, ".", 1) ||
- !strncmp(entry->d_name, "..", 2)) {
+ if ((entry->attribute & ATTR_DIRECTORY) &&
+ (!strncmp(entry->d_name, ".", 1) ||
+ !strncmp(entry->d_name, "..", 2))) {
i--;
continue;
}
- dircache[i].attr = entry->attribute;
-
+ dptr->attr = entry->attribute;
len = strlen(entry->d_name);
- if ( global_settings.mp3filter ) {
- /* filter hidden files and directories */
- if ( dircache[i].attr & ATTR_HIDDEN ) {
- i--;
- continue;
- }
+ /* mark mp3 and m3u files as such */
+ if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) ) {
+ if (!strcasecmp(&entry->d_name[len-4], ".mp3"))
+ dptr->attr |= TREE_ATTR_MP3;
+ else
+ if (!strcasecmp(&entry->d_name[len-4], ".m3u"))
+ dptr->attr |= TREE_ATTR_M3U;
+ }
- if ( !(dircache[i].attr & ATTR_DIRECTORY) ) {
- /* if not an mp3 or m3u, skip this file */
- if ( (len > 4) &&
- (strcasecmp(&entry->d_name[len-4], ".m3u") &&
- strcasecmp(&entry->d_name[len-4], ".mp3"))) {
- i--;
- continue;
- }
- else if ( len > 4 ) {
- /* mark m3u files as playlists */
- if ( !strcasecmp(&entry->d_name[len-4], ".m3u") )
- dircache[i].attr |= TREE_ATTR_M3U;
- /* cut off .mp3 and .m3u extensions */
- entry->d_name[len-4] = 0;
- }
- }
+ /* filter hidden files and directories and non-mp3 or m3u files */
+ if ( global_settings.mp3filter &&
+ ((dptr->attr & ATTR_HIDDEN) ||
+ !(dptr->attr & (ATTR_DIRECTORY|TREE_ATTR_MP3|TREE_ATTR_M3U))) ) {
+ i--;
+ continue;
}
- strncpy(dircache[i].name,entry->d_name,TREE_MAX_FILENAMELEN);
- dircache[i].name[TREE_MAX_FILENAMELEN-1]=0;
- dircacheptr[i] = &dircache[i];
+ strncpy(dptr->name,entry->d_name,TREE_MAX_FILENAMELEN);
+ dptr->name[TREE_MAX_FILENAMELEN-1]=0;
+ dircacheptr[i] = dptr;
}
filesindir = i;
closedir(dir);
@@ -197,19 +192,29 @@ static int showdir(char *path, int start)
len = strlen(dircacheptr[i]->name);
#ifdef HAVE_LCD_BITMAP
- if ( !(dircacheptr[i]->attr & ATTR_DIRECTORY) ) {
- if ( (dircacheptr[i]->attr & TREE_ATTR_M3U) ||
- !strcasecmp(&dircacheptr[i]->name[len-4], ".m3u"))
+ if ( dircacheptr[i]->attr & ATTR_DIRECTORY )
+ icon_type = Folder;
+ else {
+ if ( dircacheptr[i]->attr & TREE_ATTR_M3U )
icon_type = Playlist;
else
icon_type = File;
- } else
- icon_type=Folder;
+ }
lcd_bitmap(bitmap_icons_6x8[icon_type],
6, MARGIN_Y+(i-start)*LINE_HEIGTH, 6, 8, true);
#endif
- lcd_puts(LINE_X, LINE_Y+i-start, dircacheptr[i]->name);
+ /* if MP3 filter is on, cut off the extension */
+ if (global_settings.mp3filter &&
+ (dircacheptr[i]->attr & (TREE_ATTR_M3U|TREE_ATTR_MP3)))
+ {
+ char temp = dircacheptr[i]->name[len-4];
+ dircacheptr[i]->name[len-4] = 0;
+ lcd_puts(LINE_X, LINE_Y+i-start, dircacheptr[i]->name);
+ dircacheptr[i]->name[len-4] = temp;
+ }
+ else
+ lcd_puts(LINE_X, LINE_Y+i-start, dircacheptr[i]->name);
}
return filesindir;
@@ -240,8 +245,7 @@ char* peek_next_track(int steps)
dircursor++;
else
start++;
- if ( !(dircacheptr[dircursor+start]->attr & ATTR_DIRECTORY) &&
- dircacheptr[dircursor+start]->name[strlen(dircacheptr[dircursor+start]->name)-1] == '3') {
+ if ( dircacheptr[dircursor+start]->attr & TREE_ATTR_MP3 ) {
snprintf(buf,sizeof buf,"%s/%s",
currdir, dircacheptr[dircursor+start]->name );
return buf;
@@ -254,8 +258,7 @@ char* peek_next_track(int steps)
dircursor--;
else
start--;
- if ( !(dircacheptr[dircursor+start]->attr & ATTR_DIRECTORY) &&
- dircacheptr[dircursor+start]->name[strlen(dircacheptr[dircursor+start]->name)-1] == '3') {
+ if ( dircacheptr[dircursor+start]->attr & TREE_ATTR_MP3 ) {
snprintf(buf, sizeof(buf), "%s/%s",
currdir, dircacheptr[dircursor+start]->name);
return buf;
@@ -276,7 +279,6 @@ bool dirbrowse(char *root)
{
char buf[MAX_PATH];
int i;
- int button;
int rc;
memcpy(currdir,root,sizeof(currdir));
@@ -285,16 +287,32 @@ bool dirbrowse(char *root)
return -1; /* root is not a directory */
put_cursorxy(0, CURSOR_Y + dircursor, true);
- if ( numentries )
- lcd_puts_scroll(LINE_X, LINE_Y+dircursor,
- dircacheptr[start+dircursor]->name);
- lcd_update();
while(1) {
bool restore = false;
- button = button_get(true);
- switch(button) {
+ if ( numentries ) {
+ i = start+dircursor;
+
+ /* if MP3 filter is on, cut off the extension */
+ if (global_settings.mp3filter &&
+ (dircacheptr[i]->attr &
+ (TREE_ATTR_M3U|TREE_ATTR_MP3)))
+ {
+ int len = strlen(dircacheptr[i]->name);
+ char temp = dircacheptr[i]->name[len-4];
+ dircacheptr[i]->name[len-4] = 0;
+ lcd_puts_scroll(LINE_X, LINE_Y+dircursor,
+ dircacheptr[i]->name);
+ dircacheptr[i]->name[len-4] = temp;
+ }
+ else
+ lcd_puts_scroll(LINE_X, LINE_Y+dircursor,
+ dircacheptr[i]->name);
+ }
+ lcd_update();
+
+ switch ( button_get(true) ) {
case TREE_EXIT:
if ( play_mode == 1 )
play_mode = 0;
@@ -349,11 +367,8 @@ bool dirbrowse(char *root)
dircursor=0;
start=0;
} else {
- int len=strlen(dircacheptr[dircursor+start]->name);
lcd_stop_scroll();
- if((len > 4) &&
- !strcasecmp(&dircacheptr[dircursor+start]->name[len-4],
- ".m3u"))
+ if(dircacheptr[dircursor+start]->attr & TREE_ATTR_M3U )
{
play_mode = 2;
play_list(currdir, dircacheptr[dircursor+start]->name);
@@ -491,10 +506,6 @@ bool dirbrowse(char *root)
}
lcd_stop_scroll();
- if ( numentries )
- lcd_puts_scroll(LINE_X, LINE_Y+dircursor,
- dircacheptr[start+dircursor]->name);
- lcd_update();
}
return false;