From 4ca83e347a739d79eb2e255a50984e932af44d86 Mon Sep 17 00:00:00 2001 From: Peter D'Hoye Date: Thu, 30 Aug 2007 19:55:54 +0000 Subject: Accept FS #6854 by Sylvain Fourmanoit: allow navigation when viewing credits and do not exit immediately when pressing a key. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14544 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/credits.c | 188 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 147 insertions(+), 41 deletions(-) (limited to 'apps/plugins') diff --git a/apps/plugins/credits.c b/apps/plugins/credits.c index 531ad1f5b7..1b855dbd88 100644 --- a/apps/plugins/credits.c +++ b/apps/plugins/credits.c @@ -21,6 +21,66 @@ PLUGIN_HEADER +#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) + +#define QUIT BUTTON_OFF +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + +#elif CONFIG_KEYPAD == ONDIO_PAD + +#define QUIT BUTTON_OFF +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + +#elif CONFIG_KEYPAD == RECORDER_PAD + +#define QUIT BUTTON_OFF +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + +#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD + +#define QUIT BUTTON_OFF +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + +#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || \ + (CONFIG_KEYPAD == IPOD_4G_PAD) + +#define QUIT BUTTON_MENU +#define UP BUTTON_SCROLL_BACK +#define DOWN BUTTON_SCROLL_FWD + +#elif (CONFIG_KEYPAD == GIGABEAT_PAD) + +#define QUIT BUTTON_A +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + +#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD /* grayscale at the moment */ + +#define QUIT BUTTON_POWER +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN + +#elif CONFIG_KEYPAD == SANSA_E200_PAD + +#define QUIT BUTTON_POWER +#define UP BUTTON_SCROLL_UP +#define DOWN BUTTON_SCROLL_DOWN + +#elif CONFIG_KEYPAD == IRIVER_H10_PAD /* grayscale at the moment */ + +#define QUIT BUTTON_POWER +#define UP BUTTON_SCROLL_UP +#define DOWN BUTTON_SCROLL_DOWN + +#else +#error Unsupported keypad +#endif + + void roll_credits(void); const char* const credits[] = { #include "credits.raw" /* generated list of names from docs/CREDITS */ @@ -49,7 +109,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) rb->sleep((HZ*2)/10); btn = rb->button_get(false); - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) + if (btn != BUTTON_NONE && (btn & QUIT)) goto end_of_proc; } @@ -107,7 +167,7 @@ void roll_credits(void) rb->lcd_update(); /* abort on keypress */ - if (rb->button_get_w_tmo(HZ/8) & BUTTON_REL) + if (rb->button_get_w_tmo(HZ/8) & QUIT) return; if (++curr_index >= curr_len) @@ -147,7 +207,7 @@ void roll_credits(void) #define NUM_VISIBLE_LINES (LCD_HEIGHT/font_h - 1) #define CREDITS_TARGETPOS ((LCD_WIDTH/2)-(credits_w/2)) - int i=0, j=0, namepos=0, offset_dummy, btn; + int i=0, j=0, k=0, namepos=0, offset_dummy, btn; int name_w, name_h, name_targetpos=1, font_h; int credits_w, credits_pos; int numnames = (sizeof(credits)/sizeof(char*)); @@ -197,9 +257,9 @@ void roll_credits(void) rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); rb->lcd_update_rect(CREDITS_TARGETPOS, 0, credits_w, font_h); - /* exit on keypress */ + /* exit on power key */ btn = rb->button_get_w_tmo(HZ/ANIM_SPEED); - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) + if (btn != BUTTON_NONE && (btn & QUIT)) return; } } @@ -207,52 +267,91 @@ void roll_credits(void) /* pause for a bit if needed */ btn = rb->button_get_w_tmo(HZ*PAUSE_TIME); /* exit on keypress */ - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) + if (btn != BUTTON_NONE && (btn & QUIT)) return; /* now begin looping the in-out animation */ - while(j < numnames) - { - /* just a screen's worth at a time */ - for(i=0; i= numnames) + /* just a screen's worth at a time */ + for(i=0; i= numnames) break; - offset_dummy=1; + offset_dummy=1; - rb->snprintf(name, sizeof(name), "%s", credits[j+i-NUM_VISIBLE_LINES]); - rb->lcd_getstringsize(name, &name_w, &name_h); + rb->snprintf(name, sizeof(name), "%s", + credits[(j>=NUM_VISIBLE_LINES)? + j+i-NUM_VISIBLE_LINES:j+i]); + rb->lcd_getstringsize(name, &name_w, &name_h); - /* fly out an existing line.. */ - while(nameposlcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); /* clear trails */ rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_putsxy(namepos, font_h*(i+1), name); rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); - /* exit on keypress */ + /* exit on keypress, react to scrolling */ btn = rb->button_get_w_tmo(HZ/ANIM_SPEED); - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) + if (btn != BUTTON_NONE) + { + if (btn & QUIT) return; - + else if ((btn & UP) ^ (btn & DOWN)) + { + /* compute the new position */ + j+=((btn & UP)?-1:1)*(NUM_VISIBLE_LINES/2); + if (j+i >= numnames) j=numnames-i-1; + if (j < 0) j = 0; + + /* and refresh the whole screen */ + rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + rb->lcd_fillrect(0, 0, LCD_WIDTH, + font_h * (NUM_VISIBLE_LINES+1)); + rb->lcd_set_drawmode(DRMODE_SOLID); + + rb->snprintf(elapsednames, sizeof(elapsednames), + "[Credits] %d/%d", j+i+1, numnames); + rb->lcd_getstringsize(elapsednames, &credits_w, NULL); + rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); + + for (k=0; ksnprintf(name, sizeof(name), "%s", + credits[(j>=NUM_VISIBLE_LINES)? + ((klcd_putsxy(0, font_h*(k+1), name); + } + rb->lcd_update_rect(0, font_h, LCD_WIDTH, + font_h * (NUM_VISIBLE_LINES+1)); + break; + } + } namepos += offset_dummy; offset_dummy++; - } + } - rb->snprintf(name, sizeof(name), "%s", credits[j+i]); - rb->lcd_getstringsize(name, &name_w, &name_h); + rb->snprintf(name, sizeof(name), "%s", credits[j+i]); + rb->lcd_getstringsize(name, &name_w, &name_h); - rb->snprintf(elapsednames, sizeof(elapsednames), "[Credits] %d/%d", - j+i+1, numnames); - rb->lcd_getstringsize(elapsednames, &credits_w, NULL); - rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); + rb->snprintf(elapsednames, sizeof(elapsednames), "[Credits] %d/%d", + j+i+1, numnames); + rb->lcd_getstringsize(elapsednames, &credits_w, NULL); + rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); + if (j+i < NUM_VISIBLE_LINES) /* takes care of trail on loop */ + rb->lcd_update_rect(0, 0, LCD_WIDTH, font_h); - for(namepos = 0-name_w; namepos <= name_targetpos; - namepos += (name_targetpos - namepos + 14) / 7) - { + for(namepos = 0-name_w; namepos <= name_targetpos; + namepos += (name_targetpos - namepos + 14) / 7) + { rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); rb->lcd_set_drawmode(DRMODE_SOLID); @@ -262,23 +361,30 @@ void roll_credits(void) /* exit on keypress */ btn = rb->button_get_w_tmo(HZ/ANIM_SPEED); - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) - return; - } + if (btn != BUTTON_NONE && (btn & QUIT)) + return; + } - namepos = name_targetpos; + namepos = name_targetpos; - /* ..and repeat. */ - } - j+=i; + /* ..and repeat. */ + } - btn = rb->button_get_w_tmo(HZ*PAUSE_TIME); /* exit on keypress */ - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) + btn = rb->button_get_w_tmo(HZ*PAUSE_TIME); /* exit on keypress */ + if (btn != BUTTON_NONE && (btn & QUIT)) return; - } + } + + j = 0; + if(k) { + /* on loop, the new credit line might shorten */ + rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + rb->lcd_fillrect(0, 0, LCD_WIDTH, font_h); + } + } while(k); /* repeat in-out animation forever if scrolling occured */ btn = rb->button_get_w_tmo(HZ*2.5); /* exit on keypress */ - if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) + if (btn != BUTTON_NONE && (btn & QUIT)) return; offset_dummy = 1; -- cgit v1.2.3