Mercurial > MadButterfly
changeset 308:9e1d72eca57b
Seperate mb_animated_menu from the demo program
author | wycc |
---|---|
date | Sun, 22 Feb 2009 11:52:56 +0800 |
parents | b6891068109f |
children | 4dfb850dee92 |
files | examples/menu/Makefile.am examples/menu/main.c |
diffstat | 2 files changed, 13 insertions(+), 333 deletions(-) [+] |
line wrap: on
line diff
--- a/examples/menu/Makefile.am Sat Feb 21 21:51:05 2009 +0800 +++ b/examples/menu/Makefile.am Sun Feb 22 11:52:56 2009 +0800 @@ -9,10 +9,17 @@ $(MAKE) $(<:.svg=.o) $(CC) -shared -o $@ $(<:.svg=.o) -noinst_PROGRAMS = menu +browser.so:browser.svg + $(top_srcdir)/tools/svg2code.py $< $<.mb + m4 -I $(top_srcdir)/tools mb_c_source.m4 $<.mb > $(<:.svg=.c) + m4 -I $(top_srcdir)/tools mb_c_header.m4 $<.mb > $(<:.svg=.h) + $(MAKE) $(<:.svg=.o) + $(CC) -shared -o $@ $(<:.svg=.o) + +noinst_PROGRAMS = menu filebrowser list.so browser.so EXTRA_DIST = -menu_SOURCES = main.c +menu_SOURCES = main.c animated_menu.c animated_menu.h nodist_dynamic_SOURCES = CFLAGS = @pangocairo_CFLAGS@ menu_CFLAGS = @pangocairo_CFLAGS@ @@ -20,3 +27,7 @@ menu_LDADD = $(top_builddir)/src/libmbfly.la CLEANFILES = menu.mb menu.c menu.h +filebrowser_SOURCES = filebrowser.c animated_menu.c animated_menu.h +filebrowser_CFLAGS = @pangocairo_CFLAGS@ +filebrowser_LDFLAGS = @pangocairo_LIBS@ +filebrowser_LDADD = $(top_builddir)/src/libmbfly.la
--- a/examples/menu/main.c Sat Feb 21 21:51:05 2009 +0800 +++ b/examples/menu/main.c Sun Feb 22 11:52:56 2009 +0800 @@ -61,337 +61,6 @@ MBApp *myApp; -static void set_text(coord_t *g, char *text) -{ - geo_t *geo; - shape_t *shape; - - FOR_COORD_MEMBERS(g, geo) { - shape = geo_get_shape(geo); - if(shape->obj.obj_type == MBO_TEXT) { - sh_text_set_text(shape, text); - } - } -} - -static void mb_animated_menu_fillMenuContent(mb_animated_menu_t *m) -{ - int i; - coord_t *textgroup; - shape_t *text; - coord_t *group; - coord_t *lightbar; - int tmp; - mb_timeval_t start, playing, now; - mb_progm_t *progm; - mb_word_t *word; - - - // fill new item - for(i=0;i<8;i++) { - text = (shape_t *) m->objects[m->items[i]]; - set_text(text, m->titles[m->top+i]); - //rdman_shape_changed(MBAPP_RDMAN(m->app),text); - } - - - textgroup = (coord_t *) m->objects[m->items[i]]; - coord_hide(textgroup); - rdman_coord_changed(MBAPP_RDMAN(m->app),textgroup); - - lightbar = (coord_t *) m->lightbar; - group = (coord_t *) m->objects[m->cur]; - coord_x(lightbar) = coord_x(group); - coord_y(lightbar) = coord_y(group); - rdman_redraw_changed(MBAPP_RDMAN(m->app)); -} - -static void mb_animated_menu_complete(event_t *ev,void *arg) -{ - mb_animated_menu_t *m = (mb_animated_menu_t *) arg; - - m->ready++; - printf("animated done ready=%d\n", m->ready); -} - -static void mb_animated_menu_fillMenuContentUp(mb_animated_menu_t *m) -{ - int i; - coord_t *textgroup; - shape_t *text; - coord_t *group; - coord_t *lightbar; - int tmp; - mb_timeval_t start, playing, now; - mb_progm_t *progm; - mb_word_t *word; - - - // fill new item - text = (shape_t *) m->objects[m->items[8]]; - set_text(text, m->titles[m->top]); - - progm = mb_progm_new(2, MBAPP_RDMAN(m->app)); - MB_TIMEVAL_SET(&start, 0, 0); - MB_TIMEVAL_SET(&playing, 0, m->speed); - word = mb_progm_next_word(progm, &start, &playing); - get_now(&now); - - for(i=0;i<7;i++) { - //shift to the next item - textgroup = (coord_t *) m->objects[m->items[i]]; - mb_shift_new(0,m->menus_y[i+1]-coord_y(textgroup), textgroup,word); - } - // fade out the item[7] - textgroup = (coord_t *) m->objects[m->items[7]]; - mb_shift_new(0,100, textgroup,word); - - // fade in the item[8] - textgroup = (coord_t *) m->objects[m->items[8]]; - group = (coord_t *) m->objects[m->items[0]]; - coord_y(textgroup) = m->menus_y[0]-100; - coord_show(textgroup); - mb_shift_new(0,100, textgroup,word); - - lightbar = (coord_t *) m->lightbar; - mb_shift_new(0,m->menus_y[m->cur]-coord_y(lightbar),lightbar,word); - - MB_TIMEVAL_SET(&start, 0, m->speed); - MB_TIMEVAL_SET(&playing, 0, 0); - word = mb_progm_next_word(progm, &start, &playing); - textgroup = (coord_t *) m->objects[m->items[7]]; - mb_visibility_new(VIS_HIDDEN, textgroup,word); - - mb_progm_free_completed(progm); - m->ready--; - subject_add_observer(mb_progm_get_complete(progm), mb_animated_menu_complete,m); - mb_progm_start(progm, X_MB_tman(MBAPP_RDMAN(m->app)->rt), &now); - rdman_redraw_changed(MBAPP_RDMAN(m->app)); - tmp = m->items[8]; - for(i=8;i>0;i--) { - m->items[i] = m->items[i-1]; - } - m->items[0] = tmp; -} - - -static void mb_animated_menu_fillMenuContentDown(mb_animated_menu_t *m) -{ - int i; - coord_t *textgroup; - shape_t *text; - coord_t *group; - coord_t *lightbar; - char name[255]; - int tmp; - mb_timeval_t start, playing, now; - mb_progm_t *progm; - mb_word_t *word; - - - // fill new item - set_text(m->objects[m->items[8]], m->titles[m->top+7]); - - progm = mb_progm_new(2, MBAPP_RDMAN(m->app)); - MB_TIMEVAL_SET(&start, 0, 0); - MB_TIMEVAL_SET(&playing, 0, m->speed); - word = mb_progm_next_word(progm, &start, &playing); - get_now(&now); - - for(i=1;i<8;i++) { - //shift to the next item - 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); - } - // fade out the item[0] - mb_shift_new(0,-100, (coord_t *)m->objects[m->items[0]],word); - - // fade in the item[8] - coord_y((coord_t *)m->objects[m->items[8]]) = m->menus_y[7]+100; - coord_show(((coord_t *)(m->objects[m->items[8]]))); - mb_shift_new(0,-100, (coord_t *)m->objects[m->items[8]],word); - - mb_shift_new(0,m->menus_y[m->cur]-coord_y((coord_t *)m->lightbar),((coord_t *)(m->lightbar)),word); - - MB_TIMEVAL_SET(&start, 0, m->speed); - MB_TIMEVAL_SET(&playing, 0, 0); - word = mb_progm_next_word(progm, &start, &playing); - mb_visibility_new(VIS_VISIBLE, (coord_t *) m->objects[m->items[0]],word); - - mb_progm_free_completed(progm); - m->ready--; - subject_add_observer(mb_progm_get_complete(progm), mb_animated_menu_complete,m); - mb_progm_start(progm, X_MB_tman(MBAPP_RDMAN(m->app)->rt), &now); - rdman_redraw_changed(MBAPP_RDMAN(m->app)); - tmp = m->items[0]; - for(i=0;i<8;i++) { - m->items[i] = m->items[i+1]; - } - m->items[8] = tmp; -} - -void mb_animated_menu_moveLightBar(mb_animated_menu_t *m) -{ - mb_timeval_t start, playing, now; - mb_progm_t *progm; - mb_word_t *word; - coord_t *group; - coord_t *lightbar; - - progm = mb_progm_new(1, MBAPP_RDMAN(m->app)); - MB_TIMEVAL_SET(&start, 0, 0); - MB_TIMEVAL_SET(&playing, 0, m->speed); - word = mb_progm_next_word(progm, &start, &playing); - get_now(&now); - - lightbar = (coord_t *) m->lightbar; - mb_shift_new(0,m->menus_y[m->cur]-coord_y(lightbar),lightbar,word); - mb_progm_free_completed(progm); - m->ready--; - subject_add_observer(mb_progm_get_complete(progm), mb_animated_menu_complete,m); - mb_progm_start(progm, X_MB_tman(MBAPP_RDMAN(m->app)->rt), &now); - rdman_redraw_changed(MBAPP_RDMAN(m->app)); -} - -void mb_animated_menu_up(mb_animated_menu_t *m) -{ - if (m->cur > 5) { - m->cur--; - mb_animated_menu_moveLightBar(m); - } else { - if (m->top > 0) { - m->top--; - mb_animated_menu_fillMenuContentUp(m); - } else { - if (m->cur == 0) - return; - m->cur--; - mb_animated_menu_moveLightBar(m); - } - } -} -void mb_animated_menu_down(mb_animated_menu_t *m) -{ - - if (m->cur < 5) { - if (m->top+m->cur <= m->max) { - m->cur++; - mb_animated_menu_moveLightBar(m); - } - } else { - if ((m->top+8) < m->max-1) { - m->top++; - mb_animated_menu_fillMenuContentDown(m); - } else { - if (m->cur+m->top < m->max-2) { - m->cur++; - mb_animated_menu_moveLightBar(m); - } else - return; - } - } -} - -void mb_animated_menu_set_callback(mb_animated_menu_t *m, void (*f)(mb_animated_menu_t *m, int sel)) -{ - m->callback = f; -} -void mb_animated_menu_select(mb_animated_menu_t *m) -{ - if (m->callback) - m->callback(m,m->top+m->cur); -} - -void mb_animated_menu_keyHandler(event_t *ev, void *arg) -{ - mb_animated_menu_t *m = (mb_animated_menu_t *) arg; - X_kb_event_t *xkey = (X_kb_event_t *)ev; - if(xkey->event.type != EVT_KB_PRESS) { - return; - } - printf("read=%d\n",m->ready); - if (m->ready<=0) return; - switch(xkey->sym) { - case 0xff51: /* left */ - break; - - case 0xff52: /* up */ - mb_animated_menu_up(m); - break; - - case 0xff53: /* right */ - break; - - case 0xff54: /* down */ - mb_animated_menu_down(m); - break; - - case 0xff0d: /* enter */ - mb_animated_menu_select(m); - break; - default: - return; - } -} - -/** \brief Create an instace of animated menu. - * - * The objectnames is used to extract symbols from the SVG file. - * ${objectnames}0 - ${objectnames}8 is the text object. - * ${objectnames}_lightbar is the lightbar. - * - */ -mb_animated_menu_t *mb_animated_menu_new(MBApp *app,mb_sprite_t *sp,char *objnames,char *menus[]) -{ - mb_animated_menu_t *m; - int i,len; - char name[255]; - mb_obj_t *l; - - for(i=0;menus[i];i++); - len = i; - - m = (mb_animated_menu_t *) malloc(sizeof(mb_animated_menu_t)+sizeof(int)*len*2+sizeof(mb_obj_t *)*len); - m->app = app; - m->sprite = sp; - m->top = 0; - m->cur = 0; - m->ready = 1; - m->max = len; - m->items = (int *) (m+1); - m->menus_y = (int *) (m->items+len); - m->objects = (mb_obj_t **) (m->menus_y+len); - m->callback = NULL; - m->speed = 300000; - for(i=0;i<9;i++) { - m->items[i] = i; - snprintf(name,sizeof(name),"%s%d", objnames, i+1); - l = MB_SPRITE_GET_OBJ(sp,name); - if (l == NULL) { - fprintf(stderr,"Can not find symbol %s\n",name); - } - m->objects[i] = (mb_obj_t *) l; - m->menus_y[i] = coord_y((coord_t*)l); - } - m->titles = menus; - snprintf(name,sizeof(name), "%s_lightbar", objnames); - m->lightbar = (mb_obj_t *) MB_SPRITE_GET_OBJ(sp,name); - if (m->lightbar==NULL) - fprintf(stderr,"Can not find object %s\n",name); - mb_animated_menu_fillMenuContent(m); - subject_add_observer(MBAPP_keySubject(myApp), mb_animated_menu_keyHandler,m); - return m; -} - - -void mb_animated_menu_set_speed(mb_animated_menu_t *m,int speed) -{ - m->speed = speed*1000; -} - -int mb_animated_menu_get_speed(mb_animated_menu_t *m) -{ - return m->speed/1000; -} void myselect(mb_animated_menu_t *m, int select) {