annotate src/mbaf/animated_menu.c @ 842:76fe4afce640

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