| /*************************************************************************** |
| * __________ __ ___. |
| * 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 */ |
| |