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; }
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; }