rockbox/apps/gui/quickscreen.c
Daniel Stenberg b05eec8b1e Big Code Police raid. Pretty pretty please, we do no macrofy simple
assignments and things just to make them appear as function calls. That makes
code harder to follow. Did some gcc4 warning fixes as well.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8163 a1c6a512-1295-4272-9138-f99709370657
2005-12-05 23:37:14 +00:00

201 lines
6.9 KiB
C

/***************************************************************************
* __________ __ ___.
* 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",&w,&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 */