summaryrefslogtreecommitdiff
path: root/uisimulator/tree.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-05-05 10:45:50 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-05-05 10:45:50 +0000
commitc484ae4494c6aab821b70a04ac59cc4e3739f44f (patch)
tree350888a23434007a295e2d6ae27c4d08ea6a347e /uisimulator/tree.c
parent08e2b4917bb46fb1408134808bf946b282c473c3 (diff)
builds with Player LCD too
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@435 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator/tree.c')
-rw-r--r--uisimulator/tree.c111
1 files 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 <string.h>
+#include <stdlib.h>
+
#include <dir.h>
+#include <file.h>
#include <types.h>
#include <lcd.h>
#include <button.h>
#include "kernel.h"
#include "tree.h"
-#ifdef WIN32
-#include <windows.h>
-#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;