Mercurial > MadButterfly
annotate src/mbaf/mbbutton.c @ 1293:10bffaffef82
Fix the supporting of removing key tween partially.
- For key tween that only middle or right part of the ween being
covered by removing range, we shrink the size of the tween and keep
the key.
- After shrink the size, start removing frames at the frame next to
new end frame of the scene after shrinking.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Sat, 15 Jan 2011 22:41:58 +0800 |
parents | dffecd62817c |
children |
rev | line source |
---|---|
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
456
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:
456
diff
changeset
|
2 // vim: sw=4:ts=8:sts=4 |
294 | 3 |
4 #include <stdio.h> | |
5 #include <mb.h> | |
6 #include <string.h> | |
456
26c302b47de1
Change name of header files.
Thinker K.F. Li <thinker@branda.to>
parents:
335
diff
changeset
|
7 #include "mb_af.h" |
294 | 8 |
9 | |
10 | |
11 #define CMOUSE(e) (coord_get_mouse_event(e)) | |
12 | |
13 | |
14 static void mb_button_pressed(event_t *evt, void *arg); | |
15 static void mb_button_out(event_t *evt, void *arg); | |
16 | |
17 void mb_button_add_onClick(mb_button_t *b, void (*h)(void *arg), void *arg) | |
18 { | |
19 b->press = h; | |
20 b->arg = arg; | |
21 } | |
22 | |
23 void mb_button_refresh(mb_button_t *btn) | |
24 { | |
25 rdman_coord_changed(btn->rdman,btn->root); | |
26 rdman_redraw_changed(btn->rdman); | |
27 } | |
28 | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
456
diff
changeset
|
29 static void mb_button_move(event_t *evt, void *arg) |
294 | 30 { |
31 mb_button_t *btn = (mb_button_t *) arg; | |
32 | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
456
diff
changeset
|
33 |
294 | 34 printf("Mouse move\n"); |
35 coord_show(btn->active); | |
36 mb_button_refresh(btn); | |
37 } | |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
456
diff
changeset
|
38 static void mb_button_out(event_t *evt, void *arg) |
294 | 39 { |
40 mb_button_t *btn = (mb_button_t *) arg; | |
41 | |
42 if (btn->progm) { | |
43 mb_progm_abort(btn->progm); | |
44 btn->progm = NULL; | |
45 } | |
46 printf("mouse out\n"); | |
47 coord_hide(btn->click); | |
48 coord_hide(btn->active); | |
49 coord_show(btn->normal); | |
50 mb_button_refresh(btn); | |
51 } | |
52 | |
53 static void mb_button_show_active(event_t *evt, void *arg) | |
54 { | |
55 mb_button_t *btn = (mb_button_t *) arg; | |
56 | |
57 coord_show(btn->active); | |
58 mb_button_refresh(btn); | |
59 } | |
60 | |
335
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
61 static void mb_button_end_animated_cb(event_t *evt, void *arg) |
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
62 { |
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
63 mb_button_t *btn = (mb_button_t *) arg; |
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
64 |
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
65 btn->progm = NULL; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
456
diff
changeset
|
66 |
335
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
67 } |
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
68 |
294 | 69 static void mb_button_pressed(event_t *evt, void *arg) |
70 { | |
71 mb_button_t *btn = (mb_button_t *) arg; | |
72 mb_timeval_t start, playing, now; | |
73 mb_progm_t *progm; | |
74 mb_word_t *word; | |
75 | |
76 printf("Pressed\n"); | |
77 if (btn->progm) { | |
78 mb_progm_abort(btn->progm); | |
79 btn->progm = NULL; | |
80 } | |
81 coord_show(btn->click); | |
82 coord_hide(btn->active); | |
83 rdman_coord_changed(btn->rdman,btn->root); | |
84 rdman_redraw_changed(btn->rdman); | |
85 | |
86 btn->progm = progm = mb_progm_new(1, btn->rdman); | |
87 MB_TIMEVAL_SET(&start, 0, 500000); | |
88 MB_TIMEVAL_SET(&playing, 0, 0); | |
89 word = mb_progm_next_word(progm, &start, &playing); | |
90 mb_visibility_new(VIS_HIDDEN, btn->click, word); | |
91 mb_visibility_new(VIS_VISIBLE, btn->active, word); | |
92 mb_progm_free_completed(progm); | |
335
01038b8d8f05
Set the progm to be NULL so that we won't call mb_progm_abort when we call it at the next time. This will fix the crash issue of the dynamic. However, the dynamic is still crash sometimes if we click the button quickly. It looks like it crashes in the refresh. We need to future figure out the issue.
wycc
parents:
294
diff
changeset
|
93 subject_add_observer(mb_progm_get_complete(btn->progm), mb_button_end_animated_cb,btn); |
294 | 94 get_now(&now); |
95 printf("rt = %x\n", btn->rdman->rt); | |
1023
dffecd62817c
Use mb_timer_man_t instead of mb_tman_t in mbaf
Thinker K.F. Li <thinker@codemud.net>
parents:
822
diff
changeset
|
96 mb_progm_start(progm, mb_runtime_timer_man(btn->rdman->rt), &now); |
294 | 97 if (btn->press) |
98 btn->press(btn->arg); | |
99 } | |
100 mb_button_t *mb_button_new(redraw_man_t *rdman,mb_sprite_t *sp, char *name) | |
101 { | |
102 mb_button_t *btn = (mb_button_t *) malloc(sizeof(mb_button_t)); | |
103 char *buf = (char *) malloc(strlen(name)+5); | |
104 | |
105 btn->root = (coord_t *) MB_SPRITE_GET_OBJ(sp, name); | |
106 sprintf(buf, "%s_normal", name); | |
107 btn->normal = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf); | |
108 if (btn->normal == NULL) { | |
109 printf("Missing normal button, this is not a correct button\n"); | |
110 } | |
111 sprintf(buf, "%s_active", name); | |
112 btn->active = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf); | |
113 if (btn->active == NULL) { | |
114 printf("Missing click button, this is not a correct button\n"); | |
115 } | |
116 sprintf(buf, "%s_click", name); | |
117 btn->click = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf); | |
118 if (btn->active == NULL) { | |
119 printf("Missing click button, this is not a correct button\n"); | |
120 } | |
121 btn->press = NULL; | |
122 // Show only the normal button | |
123 coord_hide(btn->active); | |
124 coord_hide(btn->click); | |
125 coord_show(btn->normal); | |
126 // Move to the same position | |
127 btn->active->matrix[2] = 200; | |
128 btn->active->matrix[5] = 200; | |
129 btn->normal->matrix[2] = 200; | |
130 btn->normal->matrix[5] = 200; | |
131 btn->click->matrix[2] = 200; | |
132 btn->click->matrix[5] = 200; | |
133 btn->rdman = rdman; | |
134 btn->obs_move = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_MOVE, mb_button_move,btn); | |
135 btn->obs_press = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_BUT_PRESS, mb_button_pressed,btn); | |
136 btn->obs_out = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_OUT, mb_button_out,btn); | |
137 btn->progm = NULL; | |
138 rdman_redraw_changed(rdman); | |
139 return btn; | |
140 } |