changeset 318:4b58e58c78da

Add missing file
author wycc
date Thu, 05 Mar 2009 07:53:58 +0800
parents e4abe8e149de
children 1633b5aadfc3
files examples/menu/animated_menu.c
diffstat 1 files changed, 357 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/menu/animated_menu.c	Thu Mar 05 07:53:58 2009 +0800
@@ -0,0 +1,357 @@
+#include <stdio.h>
+#include <mb.h>
+#include <string.h>
+#include "menu.h"
+#include "mbapp.h"
+#include <animated_menu.h>
+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;
+
+    printf("max item is %d\n", m->max);
+    // fill new item
+    for(i=0;i<8;i++) {
+        group = (coord_t *) m->objects[m->items[i]];
+	if (i < m->max)
+	        set_text(group, m->titles[m->top+i]);
+	else
+	        set_text(group, "");
+    	rdman_coord_changed(MBAPP_RDMAN(m->app),group);
+    }
+
+
+    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_coord_changed(MBAPP_RDMAN(m->app),lightbar);
+    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
+    group = (coord_t *) m->objects[m->items[8]];
+    set_text(group, 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((coord_t *)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));
+}
+
+static 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);
+	}
+    }
+}
+static 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-1) {
+	        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;
+}
+static void mb_animated_menu_select(mb_animated_menu_t *m)
+{
+   if (m->callback)
+	   m->callback(m,m->top+m->cur);
+}
+
+static 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;
+    int ii;
+
+    if (menus == NULL)
+	    i=0;
+    else
+	    for(i=0;menus[i];i++);
+    ii=9;
+    
+    m = (mb_animated_menu_t *) malloc(sizeof(mb_animated_menu_t));
+    m->items = (int *) malloc(sizeof(int)*ii*2+sizeof(mb_obj_t *)*ii);
+    m->app = app;
+    m->sprite = sp;
+    m->top = 0;
+    m->cur = 0;
+    m->ready = 1;
+    m->max = i;
+    m->menus_y = (int *) (m->items+ii);
+    m->objects = (mb_obj_t **) (m->menus_y+ii);
+    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(app), mb_animated_menu_keyHandler,m);
+    return m;
+}
+
+void mb_animated_menu_set_titles(mb_animated_menu_t *m, char *menus[])
+{
+    int i;
+    for(i=0;menus[i];i++);
+
+    m->max = i;
+    m->top = 0;
+    m->cur = 0;
+    m->titles = menus;
+    mb_animated_menu_fillMenuContent(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;
+}