annotate examples/dynamic/mbbutton.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 26c302b47de1
children
rev   line source
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
1
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
2 #include <stdio.h>
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
3 #include <mb.h>
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
4 #include <string.h>
456
26c302b47de1 Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents: 249
diff changeset
5 #include "mb_af.h"
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
6
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
7
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
8
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
9 #define CMOUSE(e) (coord_get_mouse_event(e))
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
10
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
11
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
12 static void mb_button_pressed(event_t *evt, void *arg);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
13 static void mb_button_out(event_t *evt, void *arg);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
14
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
15 void mb_button_add_onClick(mb_button_t *b, void (*h)(void *arg), void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
16 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
17 b->press = h;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
18 b->arg = arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
19 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
20
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
21 void mb_button_refresh(mb_button_t *btn)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
22 {
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
23 rdman_coord_changed(btn->rdman,btn->root);
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
24 rdman_redraw_changed(btn->rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
25 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
26
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
27 static void mb_button_move(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
28 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
29 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
30
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
31
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
32 printf("Mouse move\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
33 coord_show(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
34 mb_button_refresh(btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
35 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
36 static void mb_button_out(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
37 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
38 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
39
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
40 if (btn->progm) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
41 mb_progm_abort(btn->progm);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
42 btn->progm = NULL;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
43 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
44 printf("mouse out\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
45 coord_hide(btn->click);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
46 coord_hide(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
47 coord_show(btn->normal);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
48 mb_button_refresh(btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
49 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
50
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
51 static void mb_button_show_active(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
52 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
53 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
54
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
55 coord_show(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
56 mb_button_refresh(btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
57 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
58
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
59 static void mb_button_pressed(event_t *evt, void *arg)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
60 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
61 mb_button_t *btn = (mb_button_t *) arg;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
62 mb_timeval_t start, playing, now;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
63 mb_progm_t *progm;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
64 mb_word_t *word;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
65
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
66 printf("Pressed\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
67 if (btn->progm) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
68 mb_progm_abort(btn->progm);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
69 btn->progm = NULL;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
70 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
71 coord_show(btn->click);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
72 coord_hide(btn->active);
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
73 rdman_coord_changed(btn->rdman,btn->root);
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
74 rdman_redraw_changed(btn->rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
75
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
76 btn->progm = progm = mb_progm_new(1, btn->rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
77 MB_TIMEVAL_SET(&start, 0, 500000);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
78 MB_TIMEVAL_SET(&playing, 0, 0);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
79 word = mb_progm_next_word(progm, &start, &playing);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
80 mb_visibility_new(VIS_HIDDEN, btn->click, word);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
81 mb_visibility_new(VIS_VISIBLE, btn->active, word);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
82 mb_progm_free_completed(progm);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
83 get_now(&now);
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
84 printf("rt = %x\n", btn->rdman->rt);
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
85 mb_progm_start(progm, X_MB_tman(btn->rdman->rt), &now);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
86 if (btn->press)
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
87 btn->press(btn->arg);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
88 }
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
89 mb_button_t *mb_button_new(redraw_man_t *rdman,mb_sprite_t *sp, char *name)
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
90 {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
91 mb_button_t *btn = (mb_button_t *) malloc(sizeof(mb_button_t));
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
92 char *buf = (char *) malloc(strlen(name)+5);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
93
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
94 btn->root = (coord_t *) MB_SPRITE_GET_OBJ(sp, name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
95 sprintf(buf, "%s_normal", name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
96 btn->normal = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
97 if (btn->normal == NULL) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
98 printf("Missing normal button, this is not a correct button\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
99 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
100 sprintf(buf, "%s_active", name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
101 btn->active = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
102 if (btn->active == NULL) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
103 printf("Missing click button, this is not a correct button\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
104 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
105 sprintf(buf, "%s_click", name);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
106 btn->click = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
107 if (btn->active == NULL) {
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
108 printf("Missing click button, this is not a correct button\n");
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
109 }
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
110 btn->press = NULL;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
111 // Show only the normal button
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
112 coord_hide(btn->active);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
113 coord_hide(btn->click);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
114 coord_show(btn->normal);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
115 // Move to the same position
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
116 btn->active->matrix[2] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
117 btn->active->matrix[5] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
118 btn->normal->matrix[2] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
119 btn->normal->matrix[5] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
120 btn->click->matrix[2] = 200;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
121 btn->click->matrix[5] = 200;
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
122 btn->rdman = rdman;
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
123 btn->obs_move = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_MOVE, mb_button_move,btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
124 btn->obs_press = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_BUT_PRESS, mb_button_pressed,btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
125 btn->obs_out = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_OUT, mb_button_out,btn);
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
126 btn->progm = NULL;
249
ab8284c8dcee * Add loopback reference from rdman to the backend. This is only required when we need to acquire the tman for the animation. This is not a reasonable arrangement since the animation should be backend transparent. We should not touch the backend directly from the animation. We should relocate the tman to the rdman.
wycc
parents: 247
diff changeset
127 rdman_redraw_changed(rdman);
247
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
128 return btn;
d9a78c859660 Seperate the frameowrk codes from the main.c.
wycc
parents:
diff changeset
129 }