Ejemplo n.º 1
0
int menu_select(menu_t *p_menu, uint32_t available_options, int *p_submenus)
{
  vSetActiveFont(p_menu->p_font);

  while (vGetButtonData())
    ;

  p_menu->available_options = available_options;

  while(1)
    {
      uint32_t keys;


      vSetForeColor(vRGB(0,0,0));
      vFillRect(p_menu->x1, p_menu->y1, p_menu->x2, p_menu->y2);
      menu_draw(p_menu);
      vFlipScreen(1);
      msSleep(300);

      keys = wait_key_press();

      if (keys & KEY_UP)
	select_next(p_menu, 0, -1);
      else if (keys & KEY_DOWN)
	select_next(p_menu, 0, 1);
      else if (keys & KEY_LEFT)
	select_next(p_menu, -1, 0);
      else if (keys & KEY_RIGHT)
	select_next(p_menu, 1, 0);
      else if (keys & KEY_SELECT)
	return -1;
      else if (keys & KEY_FIRE ||
	       keys & KEY_FIRE2)
	{
	  int ret = p_menu->cur_sel;
	  int i;

	  if (!is_submenu_title(p_menu, ret))
	    {
	      for (i=0; i<p_menu->n_submenus; i++)
		p_submenus[i] = p_menu->p_submenus[i].sel;
	      p_menu->cur_sel = 0;

	      return ret;
	    }
	}
    }

  return -1;
}
Ejemplo n.º 2
0
bool display_text(unsigned short words, char** text, struct style_text* style,
                  struct viewport* vp_text, bool wait_key)
{
#ifdef HAVE_LCD_BITMAP
    int prev_drawmode;
#endif
#ifdef HAVE_LCD_COLOR
    int standard_fgcolor;
#endif
    int space_w, width, height;
    unsigned short x , y;
    unsigned short vp_width = LCD_WIDTH;
    unsigned short vp_height = LCD_HEIGHT;
    unsigned short i = 0, style_index = 0;
    if (vp_text != NULL) {
        vp_width = vp_text->width;
        vp_height = vp_text->height;
    }
    rb->screens[SCREEN_MAIN]->set_viewport(vp_text);
#ifdef HAVE_LCD_BITMAP
    prev_drawmode = rb->lcd_get_drawmode();
    rb->lcd_set_drawmode(DRMODE_SOLID);
#endif
#ifdef HAVE_LCD_COLOR
    standard_fgcolor = rb->lcd_get_foreground();
#endif
    rb->screens[SCREEN_MAIN]->clear_viewport();
    x = MARGIN;
    y = MARGIN;
    rb->button_clear_queue();
    rb->lcd_getstringsize(" ", &space_w, &height);
    for (i = 0; i < words; i++) {
        rb->lcd_getstringsize(text[i], &width, NULL);
        /* skip to next line if the word is an empty string */
        if (rb->strcmp(text[i], "")==0) {
            x = MARGIN;
            y = y + height;
            continue;
        /* .. or if the current one can't fit the word */
        } else if (x + width > vp_width - MARGIN) {
            x = MARGIN;
            y = y + height;
        }
        /* display the remaining text by button click or exit */
        if (y + height > vp_height - MARGIN) {
            y = MARGIN;
            rb->screens[SCREEN_MAIN]->update_viewport();
            if (wait_key_press())
                return true;
            rb->screens[SCREEN_MAIN]->clear_viewport();
        }
        /* no text formatting available */
        if (style==NULL || style[style_index].index != i) {
            rb->lcd_putsxy(x, y, text[i]);
        } else {
            /* set align */
            if (style[style_index].flags&TEXT_CENTER) {
                x = (vp_width-width)/2;
            }
            /* set font color */
#ifdef HAVE_LCD_COLOR
            switch (style[style_index].flags&TEXT_COLOR_MASK) {
                case C_RED:
                    rb->lcd_set_foreground(LCD_RGBPACK(255,0,0));
                    break;
                case C_YELLOW:
                    rb->lcd_set_foreground(LCD_RGBPACK(255,255,0));
                    break;
                case C_GREEN:
                    rb->lcd_set_foreground(LCD_RGBPACK(0,192,0));
                    break;
                case C_BLUE:
                    rb->lcd_set_foreground(LCD_RGBPACK(0,0,255));
                    break;
                case C_ORANGE:
                    rb->lcd_set_foreground(LCD_RGBPACK(255,192,0));
                    break;
                case STANDARD:
                default:
                    rb->lcd_set_foreground(standard_fgcolor);
                    break;
            }
#endif
            rb->lcd_putsxy(x, y, text[i]);
            /* underline the word */
#ifdef HAVE_LCD_BITMAP
            if (style[style_index].flags&TEXT_UNDERLINE) {
                rb->lcd_hline(x, x+width, y+height-1);
            }
#endif
#ifdef HAVE_LCD_COLOR
            rb->lcd_set_foreground(standard_fgcolor);
#endif
            style_index++;
        }
        x += width + space_w;
    }
    rb->screens[SCREEN_MAIN]->update_viewport();
#ifdef HAVE_LCD_BITMAP
    rb->lcd_set_drawmode(prev_drawmode);
#endif
    if (wait_key)
    {
        if (wait_key_press())
            return true;
    }
    return false;
}