From c484ae4494c6aab821b70a04ac59cc4e3739f44f Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 5 May 2002 10:45:50 +0000 Subject: builds with Player LCD too git-svn-id: svn://svn.rockbox.org/rockbox/trunk@435 a1c6a512-1295-4272-9138-f99709370657 --- uisimulator/tree.c | 111 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 25 deletions(-) diff --git a/uisimulator/tree.c b/uisimulator/tree.c index b6342c67f5..74da12e9c7 100644 --- a/uisimulator/tree.c +++ b/uisimulator/tree.c @@ -17,18 +17,22 @@ * ****************************************************************************/ +#include +#include + #include +#include #include #include #include #include "kernel.h" #include "tree.h" -#ifdef WIN32 -#include -#endif // WIN32 -#define TREE_MAX_LEN 15 -#define TREE_MAX_ON_SCREEN 7 +#include "play.h" + +#define TREE_MAX_FILENAMELEN 64 +#define TREE_MAX_ON_SCREEN 7 +#define TREE_MAX_LEN_DISPLAY 17 /* max length that fits on screen */ int dircursor=0; @@ -36,34 +40,80 @@ void browse_root(void) { dirbrowse("/"); } -bool dirbrowse(char *root) +struct entry { + int file; /* TRUE if file, FALSE if dir */ + char name[TREE_MAX_FILENAMELEN]; + int namelen; +}; + +#define LINE_Y 8 /* Y position the entry-list starts at */ +#define LINE_X 6 /* X position the entry-list starts at */ +#define LINE_HEIGTH 8 /* pixels for each text line */ + +#ifdef HAVE_LCD_BITMAP + +int static +showdir(char *path, struct entry *buffer, int start) { - DIR *dir = opendir(root); int i; + DIR *dir = opendir(path); struct dirent *entry; - char buffer[TREE_MAX_ON_SCREEN][20]; if(!dir) - return TRUE; /* failure */ + return 0; /* no entries */ -#ifdef HAVE_LCD_BITMAP - lcd_clearrect(0, 0, LCD_WIDTH, LCD_HEIGHT); + i=start; + while((entry = readdir(dir))) { + int len; - lcd_puts(0,0, "[Browse]", 0); + if(entry->d_name[0] == '.') + /* skip names starting with a dot */ + continue; - i=0; - while((entry = readdir(dir))) { - strncpy(buffer[i], entry->d_name, TREE_MAX_LEN); - buffer[i][TREE_MAX_LEN]=0; - lcd_puts(6, 8+i*8, buffer[i], 0); + len = strlen(entry->d_name); + if(len < TREE_MAX_FILENAMELEN) + /* strncpy() is evil, we memcpy() instead, +1 includes the + trailing zero */ + memcpy(buffer[i].name, entry->d_name, len+1); + else + memcpy(buffer[i].name, "too long", 9); + + buffer[i].file = TRUE; /* files only for now */ + + if(len < TREE_MAX_LEN_DISPLAY) + lcd_puts(LINE_X, LINE_Y+i*LINE_HEIGTH, buffer[i].name, 0); + else { + char storage = buffer[i].name[TREE_MAX_LEN_DISPLAY]; + buffer[i].name[TREE_MAX_LEN_DISPLAY]=0; + lcd_puts(LINE_X, LINE_Y+i*LINE_HEIGTH, buffer[i].name, 0); + buffer[i].name[TREE_MAX_LEN_DISPLAY]=storage; + } if(++i >= TREE_MAX_ON_SCREEN) break; } + i--; /* number of files on screen */ closedir(dir); - lcd_puts(0, 8+dircursor, "-", 0); + return i; +} + +#endif + +bool dirbrowse(char *root) +{ + struct entry buffer[TREE_MAX_ON_SCREEN]; + int numentries; + +#ifdef HAVE_LCD_BITMAP + lcd_clear_display(); + + lcd_puts(0,0, "[Browse]", 0); + + numentries = showdir(root, buffer, 0); + + lcd_puts(0, LINE_Y+dircursor*LINE_HEIGTH, "-", 0); lcd_update(); @@ -79,20 +129,31 @@ bool dirbrowse(char *root) case BUTTON_LEFT: return FALSE; break; + + case BUTTON_RIGHT: + case BUTTON_PLAY: + playtune(root, buffer[dircursor].name); + + lcd_clear_display(); + lcd_puts(0,0, "[Browse]", 0); + numentries = showdir(root, buffer, 0); + lcd_puts(0, LINE_Y+dircursor*LINE_HEIGTH, "-", 0); + lcd_update(); + break; case BUTTON_UP: if(dircursor) { - lcd_puts(0, 8+dircursor, " ", 0); - dircursor -= 8; - lcd_puts(0, 8+dircursor, "-", 0); + lcd_puts(0, LINE_Y+dircursor*LINE_HEIGTH, " ", 0); + dircursor--; + lcd_puts(0, LINE_Y+dircursor*LINE_HEIGTH, "-", 0); lcd_update(); } break; case BUTTON_DOWN: - if(dircursor < (8 * TREE_MAX_ON_SCREEN)) { - lcd_puts(0, 8+dircursor, " ", 0); - dircursor += 8; - lcd_puts(0, 8+dircursor, "-", 0); + if(dircursor < numentries) { + lcd_puts(0, LINE_Y+dircursor*LINE_HEIGTH, " ", 0); + dircursor++; + lcd_puts(0, LINE_Y+dircursor*LINE_HEIGTH, "-", 0); lcd_update(); } break; -- cgit v1.2.3