Mercurial > MadButterfly
annotate examples/menu/filebrowser.c @ 1111:fa5f71d4aa04
console backend
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 08 Dec 2010 18:59:44 +0800 |
parents | ac2e6468a22a |
children | e030c9d4b79b |
rev | line source |
---|---|
309 | 1 /*! \file |
2 * | |
3 * This is the demo program for the animated menu. We will use to test the MBAF API. | |
4 * We need to have group item1-item9 in the SVG file. Initially, we will show | |
5 * item1-item8 only. When a up/down key is pressed, we will draw the next item in item9 and | |
6 * add two words to move item1-item9 smoothly. The first word move items to the 3/4 position | |
7 * fastly. The second will move it from 3/4 to the final position slowly to make retard effect. | |
8 * | |
9 * If we press another key before the second words finish, we will delete the word and replace | |
10 * it with a word to move it fastly to the final position and then we will repeat the procedure | |
11 * to add another two words to move it to the next position. | |
12 */ | |
13 #include <stdio.h> | |
14 #include <mb.h> | |
15 #include <string.h> | |
16 #include <dirent.h> | |
325 | 17 //#include "menu.h" |
456
26c302b47de1
Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents:
454
diff
changeset
|
18 #include "mb_af.h" |
26c302b47de1
Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents:
454
diff
changeset
|
19 #include <mb_ani_menu.h> |
309 | 20 |
21 | |
22 | |
23 struct fileinfo { | |
24 int height; | |
25 int width; | |
26 int depth; | |
27 int bitrate; | |
28 int duration; | |
29 int year; | |
30 char *comment; | |
31 }; | |
32 #define MAX_ENTRY 1000 | |
33 typedef struct { | |
34 mb_animated_menu_t *m; | |
35 char *curDir; | |
36 struct fileinfo *files[MAX_ENTRY]; | |
37 char *titles[MAX_ENTRY]; | |
38 int nFiles; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
39 }app_data_t; |
309 | 40 |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
41 mbaf_t *app; |
309 | 42 |
43 | |
44 | |
45 void myselect(mb_animated_menu_t *m, int select) | |
46 { | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
47 app_data_t *data = MBAF_DATA(app,app_data_t); |
309 | 48 char path[1024]; |
49 int len,i; | |
50 | |
51 if (strcmp(data->titles[select],"..")==0) { | |
52 strcpy(path, data->curDir); | |
53 len = strlen(path); | |
602
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
54 for(i=len-2;i>0;i--) { |
309 | 55 if (path[i] == '/') { |
56 path[i] = 0; | |
57 break; | |
58 } | |
59 } | |
60 } else { | |
602
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
61 snprintf(path,1024,"%s%s", data->curDir,data->titles[select]); |
309 | 62 } |
63 | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
64 MyApp_fillDirInfo(app, path); |
309 | 65 } |
66 | |
67 | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
68 void mypreview(app_data_t *data, char *path) |
344 | 69 { |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
70 redraw_man_t *rdman = MBAF_RDMAN(app); |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
71 paint_t *paint, *old_paint; |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
72 shape_t *obj = (shape_t *) MB_SPRITE_GET_OBJ(app->rootsprite, "previewimg"); |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
73 int w, h; |
344 | 74 |
75 printf("Preview %s\n",path); | |
542
d7f224b97b7f
Fix the wrong way of getting the paint of an image.
Thinker K.F. Li <thinker@branda.to>
parents:
456
diff
changeset
|
76 paint = rdman_img_ldr_load_paint(rdman, path); /* return a cached |
d7f224b97b7f
Fix the wrong way of getting the paint of an image.
Thinker K.F. Li <thinker@branda.to>
parents:
456
diff
changeset
|
77 * paint if the |
d7f224b97b7f
Fix the wrong way of getting the paint of an image.
Thinker K.F. Li <thinker@branda.to>
parents:
456
diff
changeset
|
78 * path was loaded |
d7f224b97b7f
Fix the wrong way of getting the paint of an image.
Thinker K.F. Li <thinker@branda.to>
parents:
456
diff
changeset
|
79 * before */ |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
80 if (paint) { |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
81 paint_image_get_size(paint, &w, &h); |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
82 printf("image %d %d\n",w, h); |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
83 old_paint = sh_get_fill(obj); |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
84 rdman_paint_fill(rdman, paint, obj); |
542
d7f224b97b7f
Fix the wrong way of getting the paint of an image.
Thinker K.F. Li <thinker@branda.to>
parents:
456
diff
changeset
|
85 if(old_paint != paint) |
356
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
86 rdman_paint_free(rdman, old_paint); |
3e84458968ec
Move mb_img_data_t out from argument list of rdman_shape_image_new().
Thinker K.F. Li <thinker@branda.to>
parents:
348
diff
changeset
|
87 |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
88 rdman_shape_changed(MBAF_RDMAN(app),obj); |
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
89 rdman_redraw_changed(MBAF_RDMAN(app)); |
344 | 90 } |
91 } | |
92 | |
93 int endWith(char *path, char *ext) | |
94 { | |
95 int i; | |
96 char *s; | |
97 | |
98 s = path+strlen(path)-1; | |
99 for(i=strlen(ext)-1;i>=0;i--) { | |
100 if (*s != ext[i]) return 0; | |
101 s--; | |
102 if (s < path) return 0; | |
103 } | |
104 return 1; | |
105 } | |
106 | |
107 void myupdate(mb_animated_menu_t *m, int select) | |
108 { | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
109 app_data_t *data = MBAF_DATA(app,app_data_t); |
344 | 110 char *s = data->titles[select]; |
111 char path[1024]; | |
112 | |
113 printf("check %s\n",s); | |
114 | |
601
8863d23cea4b
Load images with Imlib2.
Thinker K.F. Li <thinker@branda.to>
parents:
542
diff
changeset
|
115 if (endWith(s,".png") || endWith(s, ".jpg") || |
8863d23cea4b
Load images with Imlib2.
Thinker K.F. Li <thinker@branda.to>
parents:
542
diff
changeset
|
116 endWith(s, ".PNG") || endWith(s, ".JPG")) { |
344 | 117 snprintf(path,1024,"%s%s", data->curDir,data->titles[select]); |
118 mypreview(data,path); | |
119 } | |
120 } | |
121 | |
122 | |
123 | |
309 | 124 struct fileinfo *fileinfo_new() |
125 { | |
126 struct fileinfo *f = (struct fileinfo *) malloc(sizeof(struct fileinfo)); | |
127 | |
128 f->width = 0; | |
129 f->height = 0; | |
130 f->depth = 0; | |
131 f->bitrate = 0; | |
132 f->duration = 0; | |
133 f->year = 0; | |
134 f->comment = NULL; | |
135 return f; | |
136 } | |
137 | |
138 void fileinfo_free(struct fileinfo *f) | |
139 { | |
140 free(f); | |
141 } | |
142 | |
143 | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
144 MyApp_fillDirInfo(mbaf_t *app,char *curdir) |
309 | 145 { |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
146 app_data_t *data = MBAF_DATA(app,app_data_t); |
309 | 147 DIR *dir; |
148 struct dirent *e; | |
149 struct fileinfo *f; | |
602
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
150 char *path; |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
151 int sz; |
309 | 152 int i; |
153 | |
154 dir = opendir(curdir); | |
155 if (dir == NULL) { | |
156 printf("We can not open the direftory %s\n", curdir); | |
157 return; | |
158 } | |
159 | |
329
740844ee48c4
Update position of light-bar after update menu item
Thinker K.F. Li <thinker@branda.to>
parents:
325
diff
changeset
|
160 if (data->curDir) |
740844ee48c4
Update position of light-bar after update menu item
Thinker K.F. Li <thinker@branda.to>
parents:
325
diff
changeset
|
161 free(data->curDir); |
602
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
162 |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
163 sz = strlen(curdir); |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
164 if(curdir[sz - 1] != '/') |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
165 sz++; |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
166 data->curDir = (char *)malloc(sz + 1); |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
167 strcpy(data->curDir, curdir); |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
168 if(curdir[sz - 1] == '\0') |
ac2e6468a22a
Replace mbe_image_surface_create_from_png() with mbe_pattern_create_image()
Thinker K.F. Li <thinker@branda.to>
parents:
601
diff
changeset
|
169 strcat(data->curDir, "/"); |
329
740844ee48c4
Update position of light-bar after update menu item
Thinker K.F. Li <thinker@branda.to>
parents:
325
diff
changeset
|
170 |
309 | 171 if (data->files) { |
172 for(i=0;i<data->nFiles;i++) { | |
173 fileinfo_free(data->files[i]); | |
174 free(data->titles[i]); | |
175 } | |
176 } | |
177 data->nFiles = 0; | |
178 while(e = readdir(dir)) { | |
179 if (strcmp(e->d_name,".")==0) continue; | |
180 if (e->d_type == DT_DIR) { | |
181 if (data->nFiles < MAX_ENTRY) { | |
182 f = fileinfo_new(); | |
183 data->files[data->nFiles] = f; | |
184 data->titles[data->nFiles++] = strdup(e->d_name); | |
185 printf("%s\n", e->d_name); | |
186 } | |
187 } | |
188 } | |
189 | |
190 closedir(dir); | |
191 dir = opendir(curdir); | |
192 while(e = readdir(dir)) { | |
193 if (strcmp(e->d_name,".")==0) continue; | |
194 if (e->d_type == DT_REG) { | |
195 if (data->nFiles < MAX_ENTRY) { | |
196 f = fileinfo_new(); | |
197 data->files[data->nFiles] = f; | |
198 data->titles[data->nFiles++] = strdup(e->d_name); | |
199 printf("%s\n", e->d_name); | |
200 } | |
201 } | |
202 } | |
203 closedir(dir); | |
204 data->titles[data->nFiles] = NULL; | |
205 mb_animated_menu_set_titles(data->m,data->titles); | |
206 } | |
207 | |
208 | |
209 MyApp_InitContent(char *dir) | |
210 { | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
211 app_data_t *data = MBAF_DATA(app,app_data_t); |
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
212 subject_t *key = MBAF_KB_SUBJECT(app); |
309 | 213 char name[255]; |
214 coord_t *l; | |
215 int i; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
216 mb_sprite_t *sprite=app->rootsprite; |
309 | 217 |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
218 data->m = mb_animated_menu_new(app,app->rootsprite,"item",NULL); |
309 | 219 mb_animated_menu_set_callback(data->m, myselect); |
344 | 220 mb_animated_menu_set_update_callback(data->m, myupdate); |
309 | 221 data->curDir = NULL; |
222 data->nFiles=0; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
223 MyApp_fillDirInfo(app,dir); |
309 | 224 mb_animated_menu_set_speed(data->m,300); |
225 } | |
226 | |
227 int main(int argc, char * const argv[]) { | |
228 subject_t *subject; | |
229 mb_obj_t *button; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
230 app_data_t data; |
309 | 231 mb_timeval_t tmo,interval; |
232 char *dir; | |
233 | |
234 if (argc > 1) | |
235 dir = argv[1]; | |
236 else | |
237 dir ="/tmp"; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
238 app = mbaf_init("browser", ".libs"); |
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
239 mbaf_set_data(app,&data); |
309 | 240 MyApp_InitContent(dir); |
241 | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
242 mbaf_loop(app); |
309 | 243 |
244 return 0; | |
245 } | |
246 | |
247 /* vim: set ts=4 */ |