Mercurial > MadButterfly
diff examples/dynamic/main.c @ 201:31933f9ee70e
Chkec in demo for dynamic rectangle creation and button.
author | wycc@wycc-desktop |
---|---|
date | Sun, 07 Dec 2008 18:00:06 +0800 |
parents | |
children | 8d9d717c9300 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/dynamic/main.c Sun Dec 07 18:00:06 2008 +0800 @@ -0,0 +1,201 @@ +/*! \file + * + * svg2code_ex is an example that show programmers how to create a + * menu with MadButterfly. + * + */ +#include <stdio.h> +#include <mb.h> +#include "menu.h" +#include "button.h" + + +typedef struct _engine engine_t; +struct _engine { + X_MB_runtime_t *rt; + redraw_man_t *rdman; + menu_t *menu; + button_t *button; + int state; + co_aix orx,ory; + int start_x,start_y; + observer_t *obs1,*obs2; + shape_t *rect; + co_aix rx,ry; +}; +engine_t *engine_init() +{ + + X_MB_runtime_t *rt; + rt = X_MB_new(":0.0", 800, 600); + engine_t *en = (engine_t *) malloc(sizeof(engine_t)); + + en->rt = rt; + en->rdman = X_MB_rdman(rt); + return en; +} + +void engine_close(engine_t *en) +{ + /* + * Start handle connections, includes one to X server. + * User start to interact with the application. + */ + X_MB_handle_connection(en->rt); + + /* + * Clean + */ + menu_free(en->menu); + X_MB_free(en->rt); + free(en); +} +#define COORD_SHOW(group) coord_show(group);rdman_coord_changed(en->rdman, group) +#define COORD_HIDE(group) coord_hide(group);rdman_coord_changed(en->rdman, group) + +#define CMOUSE(e) (coord_get_mouse_event(e)) + + + +static void button_move(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + + + printf("Mouse move\n"); + COORD_SHOW(en->button->active); + rdman_coord_changed(en->rdman,en->button->root_coord); + rdman_redraw_changed(en->rdman); +} +static void button_out(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + + printf("mouse out\n"); + COORD_HIDE(en->button->active); + rdman_coord_changed(en->rdman,en->button->root_coord); + rdman_redraw_changed(en->rdman); +} + +void button_pressed(event_t *evt, void *arg) +{ + printf("Pressed\n"); +} + +void engine_add_button(engine_t *en, coord_t *normal, coord_t *active, void (*func)()) +{ + active->matrix[2] = 200; + active->matrix[5] = 200; + normal->matrix[2] = 200; + normal->matrix[5] = 200; + COORD_HIDE(en->button->active); + rdman_coord_changed(en->rdman,en->button->root_coord); + rdman_redraw_changed(en->rdman); + subject_add_event_observer(CMOUSE(normal), EVT_MOUSE_MOVE, button_move,en); + subject_add_event_observer(CMOUSE(active), EVT_MOUSE_OUT, button_out,en); + subject_add_event_observer(CMOUSE(active), EVT_MOUSE_BUT_RELEASE, button_pressed,en); +} + + +void coord_move(coord_t *c, co_aix x, co_aix y) +{ + c->matrix[2] = x; + c->matrix[5] = y; +} + + + +static void add_rect_move(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + mouse_event_t *mev = (mouse_event_t *) evt; + + printf("resize rectangle\n"); + sh_rect_set(en->rect, en->start_x, en->start_y, mev->x - en->start_x, mev->y-en->start_y,en->rx,en->ry); + rdman_shape_changed(en->rdman,en->rect); + rdman_redraw_changed(en->rdman); +} + +static void add_rect_release(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + mouse_event_t *mev = (mouse_event_t *) evt; + + printf("rectangle done\n"); + subject_remove_observer(CMOUSE(en->rdman->root_coord), en->obs1); + subject_remove_observer(CMOUSE(en->rdman->root_coord), en->obs2); +} + +static void add_rect_2(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + mouse_event_t *mev = (mouse_event_t *) evt; + paint_t *color; + + printf("select first point\n"); + // Add an rect path + + en->start_x = mev->x; + en->start_y = mev->y; + subject_remove_observer(CMOUSE(en->rdman->root_coord), en->obs1); + subject_remove_observer(CMOUSE(en->rdman->root_coord), en->obs2); + en->obs1 = subject_add_event_observer(CMOUSE(en->rdman->root_coord), EVT_MOUSE_MOVE, add_rect_move, en); + en->obs2 = subject_add_event_observer(CMOUSE(en->rdman->root_coord), EVT_MOUSE_BUT_RELEASE, add_rect_release, en); +} + +static void add_rect_2_move(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + mouse_event_t *mev = (mouse_event_t *) evt; + + sh_rect_set(en->rect, mev->x, mev->y, 50,50,en->rx,en->ry); + rdman_shape_changed(en->rdman,en->rect); + rdman_redraw_changed(en->rdman); +} + +static void add_rect(event_t *evt, void *arg) +{ + engine_t *en = (engine_t *) arg; + mouse_event_t *mev = (mouse_event_t *) evt; + paint_t *color; + + printf("menut selected\n"); + en->obs1 = subject_add_event_observer(CMOUSE(en->rdman->root_coord), EVT_MOUSE_BUT_PRESS, add_rect_2, en); + en->obs2 = subject_add_event_observer(CMOUSE(en->rdman->root_coord), EVT_MOUSE_MOVE, add_rect_2_move, en); + en->rect = rdman_shape_rect_new(en->rdman, mev->x, mev->y, 50 , 50, en->rx, en->ry); + // Paint it with color + color = rdman_paint_color_new(en->rdman, 0.800000, 0.800000, 0.400000, 1.000000); + rdman_paint_fill(en->rdman, color, en->rect); + // Add to the stage + rdman_add_shape(en->rdman, en->rect, en->menu->root_coord); +} + + + + + +int main(int argc, char * const argv[]) { + subject_t *subject; + engine_t *en; + + en = engine_init(); + en->menu = menu_new(en->rdman, en->rdman->root_coord); + en->button = button_new(en->rdman, en->rdman->root_coord); + engine_add_button(en, en->button->normal, en->button->active, button_pressed); + + en->rx = 0; + en->ry = 0; + + /* + * Register observers to subjects of events for objects. + */ + subject = coord_get_mouse_event(en->menu->rect); + subject_add_event_observer(subject, EVT_MOUSE_BUT_RELEASE, add_rect, en); + + + engine_close(en); + + return 0; +} + +/* vim: set ts=4 */