Mercurial > MadButterfly
annotate examples/menu/filebrowser.c @ 1395:a768d74e5f49
Fix the svg:use. For a svg:use, it is a group which include the content it reference. It means that we can not tween it to its origin object directly. Instead, we need to ungroup it and then use the result matrix to generate the tweened transformation matrix. Therefore, we need to concate its matrix to the referenced object.
Ad center object when the bbox-x is not available.
author | wycc |
---|---|
date | Sat, 02 Apr 2011 05:36:36 +0800 |
parents | e030c9d4b79b |
children |
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; | |
1121 | 194 printf("e->d_type=%d %d name=%s\n",e->d_type,DT_REG,e->d_name); |
195 if (e->d_type == DT_REG || e->d_type == DT_LNK) { | |
309 | 196 if (data->nFiles < MAX_ENTRY) { |
197 f = fileinfo_new(); | |
198 data->files[data->nFiles] = f; | |
199 data->titles[data->nFiles++] = strdup(e->d_name); | |
200 printf("%s\n", e->d_name); | |
201 } | |
202 } | |
203 } | |
204 closedir(dir); | |
205 data->titles[data->nFiles] = NULL; | |
206 mb_animated_menu_set_titles(data->m,data->titles); | |
207 } | |
208 | |
209 | |
210 MyApp_InitContent(char *dir) | |
211 { | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
212 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
|
213 subject_t *key = MBAF_KB_SUBJECT(app); |
309 | 214 char name[255]; |
215 coord_t *l; | |
216 int i; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
217 mb_sprite_t *sprite=app->rootsprite; |
309 | 218 |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
219 data->m = mb_animated_menu_new(app,app->rootsprite,"item",NULL); |
309 | 220 mb_animated_menu_set_callback(data->m, myselect); |
344 | 221 mb_animated_menu_set_update_callback(data->m, myupdate); |
309 | 222 data->curDir = NULL; |
223 data->nFiles=0; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
224 MyApp_fillDirInfo(app,dir); |
309 | 225 mb_animated_menu_set_speed(data->m,300); |
226 } | |
227 | |
228 int main(int argc, char * const argv[]) { | |
229 subject_t *subject; | |
230 mb_obj_t *button; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
231 app_data_t data; |
309 | 232 mb_timeval_t tmo,interval; |
233 char *dir; | |
234 | |
235 if (argc > 1) | |
236 dir = argv[1]; | |
237 else | |
238 dir ="/tmp"; | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
239 app = mbaf_init("browser", ".libs"); |
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
240 mbaf_set_data(app,&data); |
309 | 241 MyApp_InitContent(dir); |
242 | |
454
9b8dda201ccb
Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
453
diff
changeset
|
243 mbaf_loop(app); |
309 | 244 |
245 return 0; | |
246 } | |
247 | |
248 /* vim: set ts=4 */ |