2009-06-28 09:48:12 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2009 Johannes Schwarz
|
|
|
|
* based on Will Robertson code in superdom
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
#include "plugin.h"
|
|
|
|
#include "display_text.h"
|
|
|
|
|
|
|
|
#ifdef HAVE_LCD_CHARCELLS
|
|
|
|
#define MARGIN 0
|
|
|
|
#else
|
|
|
|
#define MARGIN 5
|
|
|
|
#endif
|
|
|
|
|
|
|
|
bool display_text(short words, char** text, struct style_text* style,
|
|
|
|
struct viewport* vp_text)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_LCD_BITMAP
|
|
|
|
int prev_drawmode;
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_LCD_COLOR
|
2009-07-02 17:02:47 +00:00
|
|
|
int standard_fgcolor;
|
2009-06-28 09:48:12 +00:00
|
|
|
#endif
|
|
|
|
int space_w, width, height;
|
|
|
|
unsigned short x , y;
|
|
|
|
unsigned short vp_width = LCD_WIDTH;
|
|
|
|
unsigned short vp_height = LCD_HEIGHT;
|
|
|
|
int button;
|
2009-07-02 17:02:47 +00:00
|
|
|
unsigned short i = 0, style_index = 0;
|
2009-06-28 09:48:12 +00:00
|
|
|
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);
|
2009-07-15 15:14:17 +00:00
|
|
|
/* skip to next line if the word is an empty string */
|
2009-06-28 09:48:12 +00:00
|
|
|
if (rb->strcmp(text[i], "")==0) {
|
|
|
|
x = MARGIN;
|
|
|
|
y = y + height;
|
|
|
|
continue;
|
2009-07-15 15:14:17 +00:00
|
|
|
/* .. or if the current one can't fit the word */
|
|
|
|
} else if (x + width > vp_width - MARGIN) {
|
|
|
|
x = MARGIN;
|
|
|
|
y = y + height;
|
2009-06-28 09:48:12 +00:00
|
|
|
}
|
|
|
|
/* display the remaining text by button click or exit */
|
|
|
|
if (y + height > vp_height - MARGIN) {
|
|
|
|
y = MARGIN;
|
|
|
|
rb->screens[SCREEN_MAIN]->update_viewport();
|
|
|
|
do {
|
|
|
|
button = rb->button_get(true);
|
|
|
|
if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
|
|
|
|
return true;
|
|
|
|
} while( ( button == BUTTON_NONE )
|
|
|
|
|| ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
|
|
|
|
rb->screens[SCREEN_MAIN]->clear_viewport();
|
|
|
|
}
|
2009-07-02 17:02:47 +00:00
|
|
|
/* no text formatting available */
|
|
|
|
if (style==NULL || style[style_index].index != i) {
|
2009-06-28 09:48:12 +00:00
|
|
|
rb->lcd_putsxy(x, y, text[i]);
|
|
|
|
} else {
|
|
|
|
/* set align */
|
2009-07-02 17:02:47 +00:00
|
|
|
if (style[style_index].flags&TEXT_CENTER) {
|
2009-06-28 09:48:12 +00:00
|
|
|
x = (vp_width-width)/2;
|
|
|
|
}
|
|
|
|
/* set font color */
|
|
|
|
#ifdef HAVE_LCD_COLOR
|
2009-07-02 17:02:47 +00:00
|
|
|
switch (style[style_index].flags&TEXT_COLOR_MASK) {
|
2009-06-28 09:48:12 +00:00
|
|
|
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]);
|
2009-07-02 17:02:47 +00:00
|
|
|
/* underline the word */
|
2009-06-28 09:48:12 +00:00
|
|
|
#ifdef HAVE_LCD_BITMAP
|
2009-07-02 17:02:47 +00:00
|
|
|
if (style[style_index].flags&TEXT_UNDERLINE) {
|
2009-06-28 09:48:12 +00:00
|
|
|
rb->lcd_hline(x, x+width, y+height-1);
|
|
|
|
}
|
|
|
|
#endif
|
2009-07-02 17:02:47 +00:00
|
|
|
#ifdef HAVE_LCD_COLOR
|
|
|
|
rb->lcd_set_foreground(standard_fgcolor);
|
|
|
|
#endif
|
|
|
|
style_index++;
|
2009-06-28 09:48:12 +00:00
|
|
|
}
|
|
|
|
x += width + space_w;
|
|
|
|
}
|
|
|
|
rb->screens[SCREEN_MAIN]->update_viewport();
|
|
|
|
#ifdef HAVE_LCD_BITMAP
|
|
|
|
rb->lcd_set_drawmode(prev_drawmode);
|
|
|
|
#endif
|
|
|
|
return false;
|
|
|
|
}
|