/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2005 by Kevin Ferrare * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include "quickscreen.h" #ifdef HAS_QUICKSCREEN #include "icons.h" #include "textarea.h" #include "font.h" #include "kernel.h" #include "misc.h" #include "statusbar.h" void gui_quickscreen_init(struct gui_quickscreen * qs, struct option_select *left_option, struct option_select *bottom_option, struct option_select *right_option, char * left_right_title, quickscreen_callback callback) { qs->left_option=left_option; qs->bottom_option=bottom_option; qs->right_option=right_option; qs->left_right_title=left_right_title; qs->callback=callback; } void gui_quickscreen_draw(struct gui_quickscreen * qs, struct screen * display) { int w,h; char buffer[30]; const unsigned char *option; const unsigned char *title; #ifdef HAS_BUTTONBAR display->has_buttonbar=false; #endif gui_textarea_clear(display); display->setfont(FONT_SYSFIXED); display->getstringsize((unsigned char *)"M", NULL, &h); /* Displays the icons */ display->mono_bitmap(bitmap_icons_7x8[Icon_FastBackward], display->width/2 - 16, display->height/2 - 4, 7, 8); display->mono_bitmap(bitmap_icons_7x8[Icon_DownArrow], display->width/2 - 3, display->height - h*3, 7, 8); display->mono_bitmap(bitmap_icons_7x8[Icon_FastForward], display->width/2 + 8, display->height/2 - 4, 7, 8); /* Displays the left's text */ title=(unsigned char *)qs->left_option->title; option=(unsigned char *)option_select_get_text(qs->left_option, buffer, sizeof buffer); display->putsxy(0, display->height/2 - h*2, title); display->putsxy(0, display->height/2 - h, (unsigned char *)qs->left_right_title); display->putsxy(0, display->height/2, option); /* Displays the bottom's text */ title=(unsigned char *)qs->bottom_option->title; option=(unsigned char *)option_select_get_text(qs->bottom_option, buffer, sizeof buffer); display->getstringsize(title, &w, &h); display->putsxy((display->width-w)/2, display->height - h*2, title); display->getstringsize(option, &w, &h); display->putsxy((display->width-w)/2, display->height - h, option); /* Displays the right's text */ title=(unsigned char *)qs->right_option->title; option=(unsigned char *)option_select_get_text(qs->right_option, buffer, sizeof buffer); display->getstringsize(title,&w,&h); display->putsxy(display->width - w, display->height/2 - h*2, title); display->getstringsize((unsigned char *)qs->left_right_title, &w, &h); display->putsxy(display->width - w, display->height/2 - h, (unsigned char *)qs->left_right_title); display->getstringsize(option,&w,&h); display->putsxy(display->width - w, display->height/2, option); gui_textarea_update(display); display->setfont(FONT_UI); } void gui_syncquickscreen_draw(struct gui_quickscreen * qs) { int i; FOR_NB_SCREENS(i) gui_quickscreen_draw(qs, &screens[i]); } bool gui_quickscreen_do_button(struct gui_quickscreen * qs, int button) { switch(button) { case QUICKSCREEN_LEFT : case QUICKSCREEN_LEFT | BUTTON_REPEAT : #ifdef QUICKSCREEN_RC_LEFT case QUICKSCREEN_RC_LEFT : case QUICKSCREEN_RC_LEFT | BUTTON_REPEAT : #endif option_select_next(qs->left_option); return(true); case QUICKSCREEN_BOTTOM : case QUICKSCREEN_BOTTOM | BUTTON_REPEAT : #ifdef QUICKSCREEN_RC_BOTTOM case QUICKSCREEN_RC_BOTTOM : case QUICKSCREEN_RC_BOTTOM | BUTTON_REPEAT : #endif option_select_next(qs->bottom_option); return(true); case QUICKSCREEN_RIGHT : case QUICKSCREEN_RIGHT | BUTTON_REPEAT : #ifdef QUICKSCREEN_RC_RIGHT case QUICKSCREEN_RC_RIGHT : case QUICKSCREEN_RC_RIGHT | BUTTON_REPEAT : #endif option_select_next(qs->right_option); return(true); case QUICKSCREEN_BOTTOM_INV : case QUICKSCREEN_BOTTOM_INV | BUTTON_REPEAT : #ifdef QUICKSCREEN_RC_BOTTOM_INV case QUICKSCREEN_RC_BOTTOM_INV : case QUICKSCREEN_RC_BOTTOM_INV | BUTTON_REPEAT : #endif option_select_prev(qs->bottom_option); return(true); } return(false); } #ifdef BUTTON_REMOTE #define uncombine_button(key_read, combined_button) \ key_read & ~(combined_button & ~BUTTON_REMOTE) #else #define uncombine_button(key_read, combined_button) \ key_read & ~combined_button #endif bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter) { int raw_key, button; /* To quit we need either : * - a second press on the button that made us enter * - an action taken while pressing the enter button, * then release the enter button*/ bool can_quit=false; gui_syncquickscreen_draw(qs); gui_syncstatusbar_draw(&statusbars, true); while (true) { raw_key = button_get(true); button=uncombine_button(raw_key, button_enter); if(default_event_handler(button) == SYS_USB_CONNECTED) return(true); if(gui_quickscreen_do_button(qs, button)) { can_quit=true; if(qs->callback) qs->callback(qs); gui_syncquickscreen_draw(qs); } else if(raw_key==button_enter) can_quit=true; if(raw_key==(button_enter | BUTTON_REL) && can_quit) return(false); #ifdef QUICKSCREEN_QUIT if(raw_key==QUICKSCREEN_QUIT #ifdef QUICKSCREEN_QUIT2 || raw_key==QUICKSCREEN_QUIT2 #endif #if QUICKSCREEN_RC_QUIT || raw_key==QUICKSCREEN_RC_QUIT #endif ) return(false); #endif /* QUICKSCREEN_QUIT */ gui_syncstatusbar_draw(&statusbars, false); } } #endif /* HAS_QUICKSCREEN */