Mercurial > MadButterfly
diff examples/dynamic/mbbutton.c @ 247:d9a78c859660
Seperate the frameowrk codes from the main.c.
Write a simpler MBAF demo hello program.
author | wycc |
---|---|
date | Thu, 01 Jan 2009 08:32:03 +0800 |
parents | |
children | ab8284c8dcee |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/dynamic/mbbutton.c Thu Jan 01 08:32:03 2009 +0800 @@ -0,0 +1,138 @@ + +#include <stdio.h> +#include <mb.h> +#include <string.h> +#include "mbapp.h" + + + +#define CMOUSE(e) (coord_get_mouse_event(e)) +#define MBAPP_DATA(app,type) ((type *) ((app)->private)) +#define MBAPP_RDMAN(app) (((MBApp *) app)->rdman) + + +static void mb_button_pressed(event_t *evt, void *arg); +static void mb_button_out(event_t *evt, void *arg); + +void mb_button_add_onClick(mb_button_t *b, void (*h)(void *arg), void *arg) +{ + b->press = h; + b->arg = arg; +} + +void mb_button_refresh(mb_button_t *btn) +{ + rdman_coord_changed(btn->en->rdman,btn->root); + rdman_redraw_changed(btn->en->rdman); +} + +static void mb_button_move(event_t *evt, void *arg) +{ + mb_button_t *btn = (mb_button_t *) arg; + MBApp *en = btn->en; + + + printf("Mouse move\n"); + arg = (void *)en; + coord_show(btn->active); + mb_button_refresh(btn); +} +static void mb_button_out(event_t *evt, void *arg) +{ + mb_button_t *btn = (mb_button_t *) arg; + MBApp *en = btn->en; + arg = (void *) en; + + if (btn->progm) { + mb_progm_abort(btn->progm); + btn->progm = NULL; + } + printf("mouse out\n"); + coord_hide(btn->click); + coord_hide(btn->active); + coord_show(btn->normal); + mb_button_refresh(btn); +} + +static void mb_button_show_active(event_t *evt, void *arg) +{ + mb_button_t *btn = (mb_button_t *) arg; + MBApp *en = btn->en; + + coord_show(btn->active); + mb_button_refresh(btn); +} + +static void mb_button_pressed(event_t *evt, void *arg) +{ + mb_button_t *btn = (mb_button_t *) arg; + MBApp *en = btn->en; + mb_timeval_t start, playing, now; + mb_progm_t *progm; + mb_word_t *word; + arg = (void *) en; + + printf("Pressed\n"); + if (btn->progm) { + mb_progm_abort(btn->progm); + btn->progm = NULL; + } + coord_show(btn->click); + coord_hide(btn->active); + rdman_coord_changed(MBAPP_RDMAN(arg),btn->root); + rdman_redraw_changed(MBAPP_RDMAN(arg)); + + btn->progm = progm = mb_progm_new(1, MBAPP_RDMAN(arg)); + MB_TIMEVAL_SET(&start, 0, 500000); + MB_TIMEVAL_SET(&playing, 0, 0); + word = mb_progm_next_word(progm, &start, &playing); + mb_visibility_new(VIS_HIDDEN, btn->click, word); + mb_visibility_new(VIS_VISIBLE, btn->active, word); + mb_progm_free_completed(progm); + get_now(&now); + mb_progm_start(progm, X_MB_tman(en->rt), &now); + if (btn->press) + btn->press(btn->arg); +} +mb_button_t *mb_button_new(MBApp *app,mb_sprite_t *sp, char *name) +{ + mb_button_t *btn = (mb_button_t *) malloc(sizeof(mb_button_t)); + char *buf = (char *) malloc(strlen(name)+5); + MBApp *arg = app; + + btn->root = (coord_t *) MB_SPRITE_GET_OBJ(sp, name); + sprintf(buf, "%s_normal", name); + btn->normal = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf); + if (btn->normal == NULL) { + printf("Missing normal button, this is not a correct button\n"); + } + sprintf(buf, "%s_active", name); + btn->active = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf); + if (btn->active == NULL) { + printf("Missing click button, this is not a correct button\n"); + } + sprintf(buf, "%s_click", name); + btn->click = (coord_t *) MB_SPRITE_GET_OBJ(sp, buf); + if (btn->active == NULL) { + printf("Missing click button, this is not a correct button\n"); + } + btn->press = NULL; + // Show only the normal button + coord_hide(btn->active); + coord_hide(btn->click); + coord_show(btn->normal); + // Move to the same position + btn->active->matrix[2] = 200; + btn->active->matrix[5] = 200; + btn->normal->matrix[2] = 200; + btn->normal->matrix[5] = 200; + btn->click->matrix[2] = 200; + btn->click->matrix[5] = 200; + btn->en = app; + btn->obs_move = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_MOVE, mb_button_move,btn); + btn->obs_press = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_BUT_PRESS, mb_button_pressed,btn); + btn->obs_out = subject_add_event_observer(CMOUSE(btn->root), EVT_MOUSE_OUT, mb_button_out,btn); + btn->progm = NULL; + rdman_redraw_changed(MBAPP_RDMAN(arg)); + return btn; +}