annotate src/mbaf/animated_menu.c @ 776:77b561bb7929

Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object. However, the image does not work here since it does not use the transformation of the group.
author wycc
date Mon, 30 Aug 2010 08:56:44 +0800
parents f43224bf3524
children 586e50f82c1f
rev   line source
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
1 #include <stdio.h>
4b58e58c78da Add missing file
wycc
parents:
diff changeset
2 #include <mb.h>
4b58e58c78da Add missing file
wycc
parents:
diff changeset
3 #include <string.h>
325
4453ea44a83d Remove the menu.h
root@localhost.localdomain
parents: 321
diff changeset
4 //#include "menu.h"
456
26c302b47de1 Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents: 455
diff changeset
5 #include "mb_af.h"
26c302b47de1 Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents: 455
diff changeset
6 #include "mb_ani_menu.h"
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
7 static void mb_animated_menu_update(mb_animated_menu_t *m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
8 static void set_text(coord_t *g, char *text)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
9 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
10 geo_t *geo;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
11 shape_t *shape;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
12
4b58e58c78da Add missing file
wycc
parents:
diff changeset
13 FOR_COORD_MEMBERS(g, geo) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
14 shape = geo_get_shape(geo);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
15 if(shape->obj.obj_type == MBO_TEXT) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
16 sh_text_set_text(shape, text);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
17 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
18 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
19 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
20
4b58e58c78da Add missing file
wycc
parents:
diff changeset
21 static void mb_animated_menu_fillMenuContent(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
22 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
23 int i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
24 coord_t *textgroup;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
25 coord_t *group;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
26 coord_t *lightbar;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
27
4b58e58c78da Add missing file
wycc
parents:
diff changeset
28 // fill new item
4b58e58c78da Add missing file
wycc
parents:
diff changeset
29 for(i=0;i<8;i++) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
30 group = (coord_t *) m->objects[m->items[i]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
31 if (i < m->max)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
32 set_text(group, m->titles[m->top+i]);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
33 else
4b58e58c78da Add missing file
wycc
parents:
diff changeset
34 set_text(group, "");
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
35 rdman_coord_changed(MBAF_RDMAN(m->app),group);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
36 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
37
4b58e58c78da Add missing file
wycc
parents:
diff changeset
38
4b58e58c78da Add missing file
wycc
parents:
diff changeset
39 textgroup = (coord_t *) m->objects[m->items[i]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
40 coord_hide(textgroup);
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
41 rdman_coord_changed(MBAF_RDMAN(m->app),textgroup);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
42
4b58e58c78da Add missing file
wycc
parents:
diff changeset
43 lightbar = (coord_t *) m->lightbar;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
44 group = (coord_t *) m->objects[m->cur];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
45 coord_y(lightbar) = coord_y(group);
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
46 rdman_coord_changed(MBAF_RDMAN(m->app),lightbar);
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
47 rdman_redraw_changed(MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
48 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
49
4b58e58c78da Add missing file
wycc
parents:
diff changeset
50 static void mb_animated_menu_complete(event_t *ev,void *arg)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
51 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
52 mb_animated_menu_t *m = (mb_animated_menu_t *) arg;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
53
4b58e58c78da Add missing file
wycc
parents:
diff changeset
54 m->ready++;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
55 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
56
4b58e58c78da Add missing file
wycc
parents:
diff changeset
57 static void mb_animated_menu_fillMenuContentUp(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
58 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
59 int i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
60 coord_t *textgroup;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
61 coord_t *group;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
62 coord_t *lightbar;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
63 int tmp;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
64 mb_timeval_t start, playing, now;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
65 mb_progm_t *progm;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
66 mb_word_t *word;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
67
4b58e58c78da Add missing file
wycc
parents:
diff changeset
68
4b58e58c78da Add missing file
wycc
parents:
diff changeset
69 // fill new item
4b58e58c78da Add missing file
wycc
parents:
diff changeset
70 group = (coord_t *) m->objects[m->items[8]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
71 set_text(group, m->titles[m->top]);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
72
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
73 m->progm = progm = mb_progm_new(2, MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
74 MB_TIMEVAL_SET(&start, 0, 0);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
75 MB_TIMEVAL_SET(&playing, 0, m->speed);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
76 word = mb_progm_next_word(progm, &start, &playing);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
77 get_now(&now);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
78
4b58e58c78da Add missing file
wycc
parents:
diff changeset
79 for(i=0;i<7;i++) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
80 //shift to the next item
4b58e58c78da Add missing file
wycc
parents:
diff changeset
81 textgroup = (coord_t *) m->objects[m->items[i]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
82 mb_shift_new(0,m->menus_y[i+1]-coord_y(textgroup), textgroup,word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
83 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
84 // fade out the item[7]
4b58e58c78da Add missing file
wycc
parents:
diff changeset
85 textgroup = (coord_t *) m->objects[m->items[7]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
86 mb_shift_new(0,100, textgroup,word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
87
4b58e58c78da Add missing file
wycc
parents:
diff changeset
88 // fade in the item[8]
4b58e58c78da Add missing file
wycc
parents:
diff changeset
89 textgroup = (coord_t *) m->objects[m->items[8]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
90 group = (coord_t *) m->objects[m->items[0]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
91 coord_y(textgroup) = m->menus_y[0]-100;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
92 coord_show(textgroup);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
93 mb_shift_new(0,100, textgroup,word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
94
4b58e58c78da Add missing file
wycc
parents:
diff changeset
95 lightbar = (coord_t *) m->lightbar;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
96 mb_shift_new(0,m->menus_y[m->cur]-coord_y(lightbar),lightbar,word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
97
4b58e58c78da Add missing file
wycc
parents:
diff changeset
98 MB_TIMEVAL_SET(&start, 0, m->speed);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
99 MB_TIMEVAL_SET(&playing, 0, 0);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
100 word = mb_progm_next_word(progm, &start, &playing);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
101 textgroup = (coord_t *) m->objects[m->items[7]];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
102 mb_visibility_new(VIS_HIDDEN, textgroup,word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
103
4b58e58c78da Add missing file
wycc
parents:
diff changeset
104 mb_progm_free_completed(progm);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
105 m->ready--;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
106 subject_add_observer(mb_progm_get_complete(progm), mb_animated_menu_complete,m);
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
107 mb_progm_start(progm, X_MB_tman(MBAF_RDMAN(m->app)->rt), &now);
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
108 rdman_redraw_changed(MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
109 tmp = m->items[8];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
110 for(i=8;i>0;i--) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
111 m->items[i] = m->items[i-1];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
112 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
113 m->items[0] = tmp;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
114 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
115
4b58e58c78da Add missing file
wycc
parents:
diff changeset
116
4b58e58c78da Add missing file
wycc
parents:
diff changeset
117 static void mb_animated_menu_fillMenuContentDown(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
118 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
119 int i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
120 int tmp;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
121 mb_timeval_t start, playing, now;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
122 mb_progm_t *progm;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
123 mb_word_t *word;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
124
4b58e58c78da Add missing file
wycc
parents:
diff changeset
125
4b58e58c78da Add missing file
wycc
parents:
diff changeset
126 // fill new item
4b58e58c78da Add missing file
wycc
parents:
diff changeset
127 set_text((coord_t *)m->objects[m->items[8]], m->titles[m->top+7]);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
128
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
129 m->progm = progm = mb_progm_new(2, MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
130 MB_TIMEVAL_SET(&start, 0, 0);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
131 MB_TIMEVAL_SET(&playing, 0, m->speed);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
132 word = mb_progm_next_word(progm, &start, &playing);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
133 get_now(&now);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
134
4b58e58c78da Add missing file
wycc
parents:
diff changeset
135 for(i=1;i<8;i++) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
136 //shift to the next item
4b58e58c78da Add missing file
wycc
parents:
diff changeset
137 mb_shift_new(0,m->menus_y[i-1]-coord_y((coord_t *)m->objects[m->items[i]]), (coord_t *) m->objects[m->items[i]],word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
138 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
139 // fade out the item[0]
4b58e58c78da Add missing file
wycc
parents:
diff changeset
140 mb_shift_new(0,-100, (coord_t *)m->objects[m->items[0]],word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
141
4b58e58c78da Add missing file
wycc
parents:
diff changeset
142 // fade in the item[8]
4b58e58c78da Add missing file
wycc
parents:
diff changeset
143 coord_y((coord_t *)m->objects[m->items[8]]) = m->menus_y[7]+100;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
144 coord_show(((coord_t *)(m->objects[m->items[8]])));
4b58e58c78da Add missing file
wycc
parents:
diff changeset
145 mb_shift_new(0,-100, (coord_t *)m->objects[m->items[8]],word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
146
4b58e58c78da Add missing file
wycc
parents:
diff changeset
147 mb_shift_new(0,m->menus_y[m->cur]-coord_y((coord_t *)m->lightbar),((coord_t *)(m->lightbar)),word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
148
4b58e58c78da Add missing file
wycc
parents:
diff changeset
149 MB_TIMEVAL_SET(&start, 0, m->speed);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
150 MB_TIMEVAL_SET(&playing, 0, 0);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
151 word = mb_progm_next_word(progm, &start, &playing);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
152 mb_visibility_new(VIS_VISIBLE, (coord_t *) m->objects[m->items[0]],word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
153
4b58e58c78da Add missing file
wycc
parents:
diff changeset
154 mb_progm_free_completed(progm);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
155 m->ready--;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
156 subject_add_observer(mb_progm_get_complete(progm), mb_animated_menu_complete,m);
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
157 mb_progm_start(progm, X_MB_tman(MBAF_RDMAN(m->app)->rt), &now);
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
158 rdman_redraw_changed(MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
159 tmp = m->items[0];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
160 for(i=0;i<8;i++) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
161 m->items[i] = m->items[i+1];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
162 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
163 m->items[8] = tmp;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
164 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
165
4b58e58c78da Add missing file
wycc
parents:
diff changeset
166 void mb_animated_menu_moveLightBar(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
167 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
168 mb_timeval_t start, playing, now;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
169 mb_progm_t *progm;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
170 mb_word_t *word;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
171 coord_t *lightbar;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
172
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
173 m->progm = progm = mb_progm_new(1, MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
174 MB_TIMEVAL_SET(&start, 0, 0);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
175 MB_TIMEVAL_SET(&playing, 0, m->speed);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
176 word = mb_progm_next_word(progm, &start, &playing);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
177 get_now(&now);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
178
4b58e58c78da Add missing file
wycc
parents:
diff changeset
179 lightbar = (coord_t *) m->lightbar;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
180 mb_shift_new(0,m->menus_y[m->cur]-coord_y(lightbar),lightbar,word);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
181 mb_progm_free_completed(progm);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
182 m->ready--;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
183 subject_add_observer(mb_progm_get_complete(progm), mb_animated_menu_complete,m);
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
184 mb_progm_start(progm, X_MB_tman(MBAF_RDMAN(m->app)->rt), &now);
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
185 rdman_redraw_changed(MBAF_RDMAN(m->app));
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
186 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
187
4b58e58c78da Add missing file
wycc
parents:
diff changeset
188 static void mb_animated_menu_up(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
189 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
190 if (m->cur > 5) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
191 m->cur--;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
192 mb_animated_menu_moveLightBar(m);
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
193 mb_animated_menu_update(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
194 } else {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
195 if (m->top > 0) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
196 m->top--;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
197 mb_animated_menu_fillMenuContentUp(m);
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
198 mb_animated_menu_update(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
199 } else {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
200 if (m->cur == 0)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
201 return;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
202 m->cur--;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
203 mb_animated_menu_moveLightBar(m);
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
204 mb_animated_menu_update(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
205 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
206 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
207 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
208 static void mb_animated_menu_down(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
209 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
210
4b58e58c78da Add missing file
wycc
parents:
diff changeset
211 if (m->cur < 5) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
212 if (m->top+m->cur <= m->max) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
213 m->cur++;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
214 mb_animated_menu_moveLightBar(m);
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
215 mb_animated_menu_update(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
216 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
217 } else {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
218 if ((m->top+8) < m->max-1) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
219 m->top++;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
220 mb_animated_menu_fillMenuContentDown(m);
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
221 mb_animated_menu_update(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
222 } else {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
223 if (m->cur+m->top < m->max-1) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
224 m->cur++;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
225 mb_animated_menu_moveLightBar(m);
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
226 mb_animated_menu_update(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
227 } else
4b58e58c78da Add missing file
wycc
parents:
diff changeset
228 return;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
229 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
230 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
231 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
232
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
233 void mb_animated_menu_set_update_callback(mb_animated_menu_t *m, void (*f)(mb_animated_menu_t *m, int sel))
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
234 {
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
235 m->update_callback = f;
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
236 }
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
237 void mb_animated_menu_set_callback(mb_animated_menu_t *m, void (*f)(mb_animated_menu_t *m, int sel))
4b58e58c78da Add missing file
wycc
parents:
diff changeset
238 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
239 m->callback = f;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
240 }
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
241 static void mb_animated_menu_update(mb_animated_menu_t *m)
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
242 {
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
243 if (m->update_callback)
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
244 m->update_callback(m,m->top+m->cur);
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
245
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
246 }
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
247 static void mb_animated_menu_select(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
248 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
249 if (m->callback)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
250 m->callback(m,m->top+m->cur);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
251 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
252
332
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
253 // Send the pending key in the animation progm complete callback
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
254 static void mb_animated_menu_keyHandler(event_t *ev, void *arg);
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
255 static void mb_animated_menu_send_pending_key(event_t *ev,void *arg)
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
256 {
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
257 mb_animated_menu_t *m = (mb_animated_menu_t *) arg;
455
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
258 X_kb_event_t *xkey;
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
259
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
260 xkey = &m->pending_keys[m->pending_pos];
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
261 m->pending_pos = (m->pending_pos + 1) & 0xf;
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
262 mb_animated_menu_keyHandler((event_t *) xkey, m);
332
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
263 }
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
264 static void mb_animated_menu_keyHandler(event_t *ev, void *arg)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
265 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
266 mb_animated_menu_t *m = (mb_animated_menu_t *) arg;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
267 X_kb_event_t *xkey = (X_kb_event_t *)ev;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
268 if(xkey->event.type != EVT_KB_PRESS) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
269 return;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
270 }
332
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
271 if (m->ready<=0) {
455
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
272 m->pending_keys[m->pending_last++] = *xkey;
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
273 m->pending_last &= 0xf;
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
274 if(m->pending_last == m->pending_pos)
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
275 m->pending_last = (m->pending_last - 1) & 0xf;
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
276 else
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
277 subject_add_observer(mb_progm_get_complete(m->progm),
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
278 mb_animated_menu_send_pending_key,
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
279 m);
332
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
280 return;
f90c60967a9c Add mb_progm_finish to terminate the current animation and put all objects in the final position.
wycc
parents: 329
diff changeset
281 }
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
282 switch(xkey->sym) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
283 case 0xff51: /* left */
4b58e58c78da Add missing file
wycc
parents:
diff changeset
284 break;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
285
4b58e58c78da Add missing file
wycc
parents:
diff changeset
286 case 0xff52: /* up */
4b58e58c78da Add missing file
wycc
parents:
diff changeset
287 mb_animated_menu_up(m);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
288 break;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
289
4b58e58c78da Add missing file
wycc
parents:
diff changeset
290 case 0xff53: /* right */
4b58e58c78da Add missing file
wycc
parents:
diff changeset
291 break;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
292
4b58e58c78da Add missing file
wycc
parents:
diff changeset
293 case 0xff54: /* down */
4b58e58c78da Add missing file
wycc
parents:
diff changeset
294 mb_animated_menu_down(m);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
295 break;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
296
4b58e58c78da Add missing file
wycc
parents:
diff changeset
297 case 0xff0d: /* enter */
4b58e58c78da Add missing file
wycc
parents:
diff changeset
298 mb_animated_menu_select(m);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
299 break;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
300 default:
4b58e58c78da Add missing file
wycc
parents:
diff changeset
301 return;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
302 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
303 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
304
4b58e58c78da Add missing file
wycc
parents:
diff changeset
305 /** \brief Create an instace of animated menu.
4b58e58c78da Add missing file
wycc
parents:
diff changeset
306 *
4b58e58c78da Add missing file
wycc
parents:
diff changeset
307 * The objectnames is used to extract symbols from the SVG file.
4b58e58c78da Add missing file
wycc
parents:
diff changeset
308 * ${objectnames}0 - ${objectnames}8 is the text object.
4b58e58c78da Add missing file
wycc
parents:
diff changeset
309 * ${objectnames}_lightbar is the lightbar.
4b58e58c78da Add missing file
wycc
parents:
diff changeset
310 *
4b58e58c78da Add missing file
wycc
parents:
diff changeset
311 */
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
312 mb_animated_menu_t *mb_animated_menu_new(mbaf_t *app,mb_sprite_t *sp,char *objnames,char *menus[])
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
313 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
314 mb_animated_menu_t *m;
757
f43224bf3524 Remove unused variables and refactor to X_MB_init_with_win
Thinker K.F. Li <thinker@codemud.net>
parents: 456
diff changeset
315 int i;
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
316 char name[255];
4b58e58c78da Add missing file
wycc
parents:
diff changeset
317 mb_obj_t *l;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
318 int ii;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
319
4b58e58c78da Add missing file
wycc
parents:
diff changeset
320 if (menus == NULL)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
321 i=0;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
322 else
4b58e58c78da Add missing file
wycc
parents:
diff changeset
323 for(i=0;menus[i];i++);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
324 ii=9;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
325
4b58e58c78da Add missing file
wycc
parents:
diff changeset
326 m = (mb_animated_menu_t *) malloc(sizeof(mb_animated_menu_t));
4b58e58c78da Add missing file
wycc
parents:
diff changeset
327 m->items = (int *) malloc(sizeof(int)*ii*2+sizeof(mb_obj_t *)*ii);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
328 m->app = app;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
329 m->sprite = sp;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
330 m->top = 0;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
331 m->cur = 0;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
332 m->ready = 1;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
333 m->max = i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
334 m->menus_y = (int *) (m->items+ii);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
335 m->objects = (mb_obj_t **) (m->menus_y+ii);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
336 m->callback = NULL;
344
ab7f3c00fd05 Implement PMNG viewer
wycc
parents: 332
diff changeset
337 m->update_callback = NULL;
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
338 m->speed = 300000;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
339 for(i=0;i<9;i++) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
340 m->items[i] = i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
341 snprintf(name,sizeof(name),"%s%d", objnames, i+1);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
342 l = MB_SPRITE_GET_OBJ(sp,name);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
343 if (l == NULL) {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
344 fprintf(stderr,"Can not find symbol %s\n",name);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
345 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
346 m->objects[i] = (mb_obj_t *) l;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
347 m->menus_y[i] = coord_y((coord_t*)l);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
348 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
349 m->titles = menus;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
350 snprintf(name,sizeof(name), "%s_lightbar", objnames);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
351 m->lightbar = (mb_obj_t *) MB_SPRITE_GET_OBJ(sp,name);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
352 if (m->lightbar==NULL)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
353 fprintf(stderr,"Can not find object %s\n",name);
455
58b6337fb3b2 Fix bugs of pending keys of animated menu.
Thinker K.F. Li <thinker@branda.to>
parents: 454
diff changeset
354 m->pending_pos = m->pending_last = 0;
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
355 mb_animated_menu_fillMenuContent(m);
454
9b8dda201ccb Make naming convention consistent with MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents: 368
diff changeset
356 subject_add_observer(MBAF_KB_SUBJECT(app), mb_animated_menu_keyHandler,m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
357 return m;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
358 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
359
4b58e58c78da Add missing file
wycc
parents:
diff changeset
360 void mb_animated_menu_set_titles(mb_animated_menu_t *m, char *menus[])
4b58e58c78da Add missing file
wycc
parents:
diff changeset
361 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
362 int i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
363 for(i=0;menus[i];i++);
4b58e58c78da Add missing file
wycc
parents:
diff changeset
364
4b58e58c78da Add missing file
wycc
parents:
diff changeset
365 m->max = i;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
366 m->top = 0;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
367 m->cur = 0;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
368 m->titles = menus;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
369 mb_animated_menu_fillMenuContent(m);
329
740844ee48c4 Update position of light-bar after update menu item
Thinker K.F. Li <thinker@branda.to>
parents: 328
diff changeset
370 mb_animated_menu_moveLightBar(m);
318
4b58e58c78da Add missing file
wycc
parents:
diff changeset
371 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
372
4b58e58c78da Add missing file
wycc
parents:
diff changeset
373
4b58e58c78da Add missing file
wycc
parents:
diff changeset
374 void mb_animated_menu_set_speed(mb_animated_menu_t *m,int speed)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
375 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
376 m->speed = speed*1000;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
377 }
4b58e58c78da Add missing file
wycc
parents:
diff changeset
378
4b58e58c78da Add missing file
wycc
parents:
diff changeset
379 int mb_animated_menu_get_speed(mb_animated_menu_t *m)
4b58e58c78da Add missing file
wycc
parents:
diff changeset
380 {
4b58e58c78da Add missing file
wycc
parents:
diff changeset
381 return m->speed/1000;
4b58e58c78da Add missing file
wycc
parents:
diff changeset
382 }