diff examples/menu/filebrowser.c @ 309:4dfb850dee92

Add filebrowser program and SVG file.
author wycc
date Sun, 22 Feb 2009 13:45:28 +0800
parents
children 4453ea44a83d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/menu/filebrowser.c	Sun Feb 22 13:45:28 2009 +0800
@@ -0,0 +1,180 @@
+/*! \file
+ *
+ *  This is the demo program for the animated menu. We will use to test the MBAF API.
+ *  We need to have group item1-item9 in the SVG file. Initially, we will show
+ *  item1-item8 only. When a up/down key is pressed, we will draw the next item in item9 and 
+ *  add two words to move item1-item9 smoothly. The first word move items to the 3/4 position 
+ *  fastly. The second will move it from 3/4 to the final position slowly to make retard effect.
+ *
+ *  If we press another key before the second words finish, we will delete the word and replace 
+ *  it with a word to move it fastly to the final position and then we will repeat the procedure
+ *  to add another two words to move it to the next position.
+ */
+#include <stdio.h>
+#include <mb.h>
+#include <string.h>
+#include <dirent.h>
+#include "menu.h"
+#include "mbapp.h"
+#include <animated_menu.h>
+
+
+
+struct fileinfo {
+	int height;
+	int width;
+	int depth;
+	int bitrate;
+	int duration;
+	int year;
+	char *comment;
+};
+#define MAX_ENTRY 1000
+typedef struct {
+	mb_animated_menu_t *m;
+	char *curDir;
+	struct fileinfo *files[MAX_ENTRY];
+	char *titles[MAX_ENTRY];
+	int nFiles;
+}MyAppData;
+
+MBApp *myApp;
+
+
+
+void myselect(mb_animated_menu_t *m, int select)
+{
+    MyAppData *data = MBAPP_DATA(myApp,MyAppData);
+    char path[1024];
+    int len,i;
+
+    if (strcmp(data->titles[select],"..")==0) {
+	    strcpy(path, data->curDir);
+	    len = strlen(path);
+	    for(i=len-1;i>0;i--) {
+		    if (path[i] == '/') {
+			    path[i] = 0;
+			    break;
+		    }
+	    }
+    } else {
+    	snprintf(path,1024,"%s/%s", data->curDir,data->titles[select]);
+    }
+
+    MyApp_fillDirInfo(myApp, path);
+}
+
+
+struct fileinfo *fileinfo_new()
+{
+    struct fileinfo *f = (struct fileinfo *) malloc(sizeof(struct fileinfo));
+
+    f->width = 0;
+    f->height = 0;
+    f->depth = 0;
+    f->bitrate = 0;
+    f->duration = 0;
+    f->year = 0;
+    f->comment = NULL;
+    return f;
+}
+
+void fileinfo_free(struct fileinfo *f)
+{
+    free(f);
+}
+
+
+MyApp_fillDirInfo(MBApp *app,char *curdir)
+{
+    MyAppData *data = MBAPP_DATA(myApp,MyAppData);
+    DIR *dir;
+    struct dirent *e;
+    struct fileinfo *f;
+    int i;
+
+    if (data->curDir)
+	    free(data->curDir);
+    data->curDir = strdup(curdir);
+    dir = opendir(curdir);
+    if (dir == NULL) {
+	    printf("We can not open the direftory %s\n", curdir);
+	    return;
+    }
+
+    if (data->files) {
+	    for(i=0;i<data->nFiles;i++) {
+		    fileinfo_free(data->files[i]);
+		    free(data->titles[i]);
+	    }    
+    }
+    data->nFiles = 0;
+    while(e = readdir(dir)) {
+	    if (strcmp(e->d_name,".")==0) continue;
+	    if (e->d_type == DT_DIR) {
+		    if (data->nFiles < MAX_ENTRY) {
+			    f = fileinfo_new();
+			    data->files[data->nFiles] = f;
+			    data->titles[data->nFiles++] = strdup(e->d_name);
+			    printf("%s\n", e->d_name);
+		    }
+	    }
+    }
+
+    closedir(dir);
+    dir = opendir(curdir);
+    while(e = readdir(dir)) {
+	    if (strcmp(e->d_name,".")==0) continue;
+	    if (e->d_type == DT_REG) {
+		    if (data->nFiles < MAX_ENTRY) {
+			    f = fileinfo_new();
+			    data->files[data->nFiles] = f;
+			    data->titles[data->nFiles++] = strdup(e->d_name);
+			    printf("%s\n", e->d_name);
+		    }
+	    }
+    }
+    closedir(dir);
+    data->titles[data->nFiles] = NULL;
+    mb_animated_menu_set_titles(data->m,data->titles);
+}
+
+
+MyApp_InitContent(char *dir)
+{
+    MyAppData *data = MBAPP_DATA(myApp,MyAppData);
+    subject_t *key = MBAPP_keySubject(myApp);
+    char name[255];
+    coord_t *l;
+    int i;
+    mb_sprite_t *sprite=myApp->rootsprite;
+    
+    data->m = mb_animated_menu_new(myApp,myApp->rootsprite,"item",NULL);
+    mb_animated_menu_set_callback(data->m, myselect);
+    data->curDir = NULL;
+    data->nFiles=0;
+    MyApp_fillDirInfo(myApp,dir);
+    mb_animated_menu_set_speed(data->m,300);
+}
+
+int main(int argc, char * const argv[]) {
+    subject_t *subject;
+    mb_obj_t *button;
+    MyAppData data;
+    mb_timeval_t tmo,interval;
+    char *dir;
+
+    if (argc > 1)
+	    dir = argv[1];
+    else
+	    dir ="/tmp";
+    myApp = MBApp_Init("browser");
+    MBApp_setData(myApp,&data);
+    MyApp_InitContent(dir);
+
+    MBApp_loop(myApp);
+
+    return 0;
+}
+
+/* vim: set ts=4 */