summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Mahone <andrew.mahone@gmail.com>2009-04-08 03:50:44 +0000
committerAndrew Mahone <andrew.mahone@gmail.com>2009-04-08 03:50:44 +0000
commitc79fb9ce0683b53949f46d34c29c2cc7c70db3ea (patch)
treed5e3f2c663ffc40b7fe1de46fbc22f156053b815
parentae723815fa382e41549f0e0cbcd657f74253cc47 (diff)
downloadrockbox-c79fb9ce0683b53949f46d34c29c2cc7c70db3ea.tar.gz
rockbox-c79fb9ce0683b53949f46d34c29c2cc7c70db3ea.zip
FS#9992: remove PLA use from PictureFlow, replacing it with maps designed for each target, and inheriting the targets' standard actions
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20651 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/pictureflow.c215
1 files changed, 147 insertions, 68 deletions
diff --git a/apps/plugins/pictureflow.c b/apps/plugins/pictureflow.c
index 293be51985..309845b4d7 100644
--- a/apps/plugins/pictureflow.c
+++ b/apps/plugins/pictureflow.c
@@ -38,10 +38,115 @@ PLUGIN_HEADER
38 38
39/******************************* Globals ***********************************/ 39/******************************* Globals ***********************************/
40 40
41const struct button_mapping *plugin_contexts[] 41#define PF_PREV ACTION_STD_PREV
42= {generic_actions, generic_directions}; 42#define PF_PREV_REPEAT ACTION_STD_PREVREPEAT
43#define PF_NEXT ACTION_STD_NEXT
44#define PF_NEXT_REPEAT ACTION_STD_NEXTREPEAT
45#define PF_SELECT ACTION_STD_OK
46#define PF_CONTEXT ACTION_STD_CONTEXT
47#define PF_BACK ACTION_STD_CANCEL
48#define PF_MENU ACTION_STD_MENU
49#define PF_QUIT (LAST_ACTION_PLACEHOLDER + 1)
50
51const struct button_mapping pf_context_album_scroll[] =
52{
53#ifdef HAVE_TOUCHSCREEN
54 {PF_PREV, BUTTON_MIDLEFT, BUTTON_NONE},
55 {PF_PREV_REPEAT, BUTTON_MIDLEFT|BUTTON_REPEAT, BUTTON_NONE},
56 {PF_NEXT, BUTTON_MIDRIGHT, BUTTON_NONE},
57 {PF_NEXT_REPEAT, BUTTON_MIDRIGHT|BUTTON_REPEAT, BUTTON_NONE},
58#endif
59#if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD || \
60 CONFIG_KEYPAD == IAUDIO_X5M5_PAD || CONFIG_KEYPAD == GIGABEAT_PAD || \
61 CONFIG_KEYPAD == GIGABEAT_S_PAD || CONFIG_KEYPAD == RECORDER_PAD || \
62 CONFIG_KEYPAD == ARCHOS_AV300_PAD || CONFIG_KEYPAD == SANSA_C100_PAD || \
63 CONFIG_KEYPAD == SANSA_C200_PAD || CONFIG_KEYPAD == SANSA_CLIP_PAD || \
64 CONFIG_KEYPAD == SANSA_M200_PAD || CONFIG_KEYPAD == IRIVER_IFP7XX_PAD || \
65 CONFIG_KEYPAD == MROBE100_PAD || CONFIG_KEYPAD == PHILIPS_SA9200_PAD || \
66 CONFIG_KEYPAD == IAUDIO67_PAD || CONFIG_KEYPAD == CREATIVEZVM_PAD || \
67 CONFIG_KEYPAD == PHILIPS_HDD1630_PAD || CONFIG_KEYPAD == CREATIVEZV_PAD \
68 || CONFIG_KEYPAD == SANSA_CLIP_PAD || CONFIG_KEYPAD == LOGIK_DAX_PAD || \
69 CONFIG_KEYPAD == MEIZU_M6SL_PAD
70 {PF_PREV, BUTTON_LEFT, BUTTON_NONE},
71 {PF_PREV_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
72 {PF_NEXT, BUTTON_RIGHT, BUTTON_NONE},
73 {PF_NEXT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
74#elif CONFIG_KEYPAD == ONDIO_PAD
75 {PF_PREV, BUTTON_LEFT, BUTTON_NONE},
76 {PF_PREV_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
77 {PF_NEXT, BUTTON_RIGHT, BUTTON_NONE},
78 {PF_NEXT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
79 {PF_SELECT, BUTTON_UP|BUTTON_REL, BUTTON_UP},
80 {PF_CONTEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP},
81 {ACTION_NONE, BUTTON_UP, BUTTON_NONE},
82 {ACTION_NONE, BUTTON_DOWN, BUTTON_NONE},
83 {ACTION_NONE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE},
84 {ACTION_NONE, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT},
85#elif CONFIG_KEYPAD == IAUDIO_M3_PAD || CONFIG_KEYPAD == MROBE500_PAD
86 {PF_PREV, BUTTON_RC_REW, BUTTON_NONE},
87 {PF_PREV_REPEAT, BUTTON_RC_REW|BUTTON_REPEAT,BUTTON_NONE},
88 {PF_NEXT, BUTTON_RC_FF, BUTTON_NONE},
89 {PF_NEXT_REPEAT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE},
90#endif
91 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1)
92};
43 93
44#define NB_ACTION_CONTEXTS sizeof(plugin_contexts)/sizeof(plugin_contexts[0]) 94const struct button_mapping pf_context_buttons[] =
95{
96#ifdef HAVE_TOUCHSCREEN
97 {PF_SELECT, BUTTON_CENTER, BUTTON_NONE},
98 {PF_MENU, BUTTON_TOPLEFT, BUTTON_NONE},
99 {PF_BACK, BUTTON_BOTTOMRIGHT, BUTTON_NONE},
100#endif
101#if CONFIG_KEYPAD == ARCHOS_AV300_PAD
102 {PF_QUIT, BUTTON_OFF, BUTTON_NONE},
103#elif CONFIG_KEYPAD == SANSA_C100_PAD
104 {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU},
105#elif CONFIG_KEYPAD == CREATIVEZV_PAD || CONFIG_KEYPAD == CREATIVEZVM_PAD || \
106 CONFIG_KEYPAD == PHILIPS_HDD1630_PAD || CONFIG_KEYPAD == IAUDIO67_PAD || \
107 CONFIG_KEYPAD == GIGABEAT_PAD || CONFIG_KEYPAD == GIGABEAT_S_PAD || \
108 CONFIG_KEYPAD == MROBE100_PAD || CONFIG_KEYPAD == MROBE500_PAD || \
109 CONFIG_KEYPAD == PHILIPS_SA9200_PAD || CONFIG_KEYPAD == SANSA_CLIP_PAD || \
110 CONFIG_KEYPAD == SANSA_FUZE_PAD
111 {PF_QUIT, BUTTON_POWER, BUTTON_NONE},
112/* These all use short press of BUTTON_POWER for menu, map long POWER to quit
113*/
114#elif CONFIG_KEYPAD == SANSA_C200_PAD || CONFIG_KEYPAD == SANSA_M200_PAD || \
115 CONFIG_KEYPAD == IRIVER_H10_PAD || CONFIG_KEYPAD == COWOND2_PAD
116 {PF_QUIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER},
117#if CONFIG_KEYPAD == COWOND2_PAD
118 {PF_BACK, BUTTON_POWER|BUTTON_REL, BUTTON_POWER},
119 {ACTION_NONE, BUTTON_POWER, BUTTON_NONE},
120#endif
121#elif CONFIG_KEYPAD == SANSA_E200_PAD
122 {PF_QUIT, BUTTON_POWER, BUTTON_NONE},
123#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
124 {PF_QUIT, BUTTON_EQ, BUTTON_NONE},
125#elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) \
126 || (CONFIG_KEYPAD == IPOD_3G_PAD) \
127 || (CONFIG_KEYPAD == IPOD_4G_PAD)
128 {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU},
129#elif CONFIG_KEYPAD == LOGIK_DAX_PAD
130 {PF_QUIT, BUTTON_POWERPLAY|BUTTON_REPEAT, BUTTON_POWERPLAY},
131#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
132 {PF_QUIT, BUTTON_RC_REC, BUTTON_NONE},
133#elif CONFIG_KEYPAD == MEIZU_X6SL_PAD
134 {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU},
135#elif CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD || \
136 CONFIG_KEYPAD == RECORDER_PAD || CONFIG_KEYPAD == ONDIO_PAD
137 {PF_QUIT, BUTTON_OFF, BUTTON_NONE},
138#endif
139#if CONFIG_KEYPAD == IAUDIO_M3_PAD
140 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD|CONTEXT_REMOTE)
141#else
142 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
143#endif
144};
145const struct button_mapping *pf_contexts[] =
146{
147 pf_context_album_scroll,
148 pf_context_buttons
149};
45 150
46#if LCD_DEPTH < 8 151#if LCD_DEPTH < 8
47#if LCD_DEPTH > 1 152#if LCD_DEPTH > 1
@@ -77,26 +182,6 @@ typedef unsigned char pix_t;
77typedef fb_data pix_t; 182typedef fb_data pix_t;
78#endif /* LCD_DEPTH >= 8 */ 183#endif /* LCD_DEPTH >= 8 */
79 184
80#ifdef HAVE_SCROLLWHEEL
81#define PICTUREFLOW_NEXT_ALBUM PLA_DOWN
82#define PICTUREFLOW_NEXT_ALBUM_REPEAT PLA_DOWN_REPEAT
83#define PICTUREFLOW_PREV_ALBUM PLA_UP
84#define PICTUREFLOW_PREV_ALBUM_REPEAT PLA_UP_REPEAT
85#else
86#define PICTUREFLOW_NEXT_ALBUM PLA_RIGHT
87#define PICTUREFLOW_NEXT_ALBUM_REPEAT PLA_RIGHT_REPEAT
88#define PICTUREFLOW_PREV_ALBUM PLA_LEFT
89#define PICTUREFLOW_PREV_ALBUM_REPEAT PLA_LEFT_REPEAT
90#define PICTUREFLOW_NEXT_TRACK PLA_DOWN
91#define PICTUREFLOW_NEXT_TRACK_REPEAT PLA_DOWN_REPEAT
92#define PICTUREFLOW_PREV_TRACK PLA_UP
93#define PICTUREFLOW_PREV_TRACK_REPEAT PLA_UP_REPEAT
94#endif
95#define PICTUREFLOW_MENU PLA_MENU
96#define PICTUREFLOW_QUIT PLA_QUIT
97#define PICTUREFLOW_SELECT_ALBUM PLA_FIRE
98
99
100/* for fixed-point arithmetic, we need minimum 32-bit long 185/* for fixed-point arithmetic, we need minimum 32-bit long
101 long long (64-bit) might be useful for multiplication and division */ 186 long long (64-bit) might be useful for multiplication and division */
102#define PFreal long 187#define PFreal long
@@ -558,6 +643,11 @@ const struct custom_format format_transposed = {
558 .get_size = get_size 643 .get_size = get_size
559}; 644};
560 645
646static const struct button_mapping* get_context_map(int context)
647{
648 return pf_contexts[context & ~CONTEXT_CUSTOM];
649}
650
561/* Create the lookup table with the scaling values for the reflections */ 651/* Create the lookup table with the scaling values for the reflections */
562void init_reflect_table(void) 652void init_reflect_table(void)
563{ 653{
@@ -847,7 +937,6 @@ bool create_albumart_cache(void)
847 rb->splash(HZ, "Could not write bmp"); 937 rb->splash(HZ, "Could not write bmp");
848 } 938 }
849 slides++; 939 slides++;
850 if ( rb->button_get(false) == PICTUREFLOW_MENU ) return false;
851 } 940 }
852 if ( slides == 0 ) { 941 if ( slides == 0 ) {
853 /* Warn the user that we couldn't find any albumart */ 942 /* Warn the user that we couldn't find any albumart */
@@ -1627,6 +1716,16 @@ void show_next_slide(void)
1627 1716
1628 1717
1629/** 1718/**
1719 Return true if the rect has size 0
1720*/
1721static inline bool is_empty_rect(struct rect *r)
1722{
1723 return ((r->left == 0) && (r->right == 0) && (r->top == 0)
1724 && (r->bottom == 0));
1725}
1726
1727
1728/**
1630 Render the slides. Updates only the offscreen buffer. 1729 Render the slides. Updates only the offscreen buffer.
1631*/ 1730*/
1632void render_all_slides(void) 1731void render_all_slides(void)
@@ -1998,12 +2097,8 @@ static inline void draw_gradient(int y, int h)
1998 selected_track_pulse = (selected_track_pulse+1) % 10; 2097 selected_track_pulse = (selected_track_pulse+1) % 10;
1999 int c2 = selected_track_pulse - 5; 2098 int c2 = selected_track_pulse - 5;
2000 for (r=0; r<h; r++) { 2099 for (r=0; r<h; r++) {
2001#ifdef HAVE_LCD_COLOR
2002 MYLCD(set_foreground)(G_PIX(c2+80-(c >> 9), c2+100-(c >> 9), 2100 MYLCD(set_foreground)(G_PIX(c2+80-(c >> 9), c2+100-(c >> 9),
2003 c2+250-(c >> 8))); 2101 c2+250-(c >> 8)));
2004#else
2005 MYLCD(set_foreground)(G_BRIGHT(c2+160-(c >> 8)));
2006#endif
2007 MYLCD(hline)(0, LCD_WIDTH, r+y); 2102 MYLCD(hline)(0, LCD_WIDTH, r+y);
2008 if ( r > h/2 ) 2103 if ( r > h/2 )
2009 c-=inc; 2104 c-=inc;
@@ -2354,71 +2449,55 @@ int main(void)
2354 rb->yield(); 2449 rb->yield();
2355 2450
2356 /*/ Handle buttons */ 2451 /*/ Handle buttons */
2357 button = pluginlib_getaction(instant_update ? 0 : HZ/16, 2452 button = rb->get_custom_action(CONTEXT_CUSTOM|
2358 plugin_contexts, NB_ACTION_CONTEXTS); 2453 (pf_state == pf_show_tracks ? 1 : 0),
2454 instant_update ? 0 : HZ/16,
2455 get_context_map);
2359 2456
2360 switch (button) { 2457 switch (button) {
2361 case PICTUREFLOW_QUIT: 2458 case PF_QUIT:
2362 return PLUGIN_OK; 2459 return PLUGIN_OK;
2363 2460
2364 case PICTUREFLOW_MENU: 2461 case PF_BACK:
2365 if ( pf_state == pf_idle || pf_state == pf_scrolling ) { 2462 if ( pf_state == pf_show_tracks )
2463 pf_state = pf_cover_out;
2464 if (pf_state == pf_idle || pf_state == pf_scrolling)
2465 return PLUGIN_OK;
2466 break;
2467
2468 case PF_MENU:
2366#ifdef USEGSLIB 2469#ifdef USEGSLIB
2367 grey_show(false); 2470 grey_show(false);
2368#endif 2471#endif
2369 ret = main_menu(); 2472 ret = main_menu();
2370 if ( ret == -1 ) return PLUGIN_OK; 2473 if ( ret == -1 ) return PLUGIN_OK;
2371 if ( ret != 0 ) return i; 2474 if ( ret != 0 ) return i;
2372#ifdef USEGSLIB 2475#ifdef USEGSLIB
2373 grey_show(true); 2476 grey_show(true);
2374#endif 2477#endif
2375 MYLCD(set_drawmode)(DRMODE_FG); 2478 MYLCD(set_drawmode)(DRMODE_FG);
2376 }
2377 else {
2378 pf_state = pf_cover_out;
2379 }
2380 break; 2479 break;
2381 2480
2382 case PICTUREFLOW_NEXT_ALBUM: 2481 case PF_NEXT:
2383 case PICTUREFLOW_NEXT_ALBUM_REPEAT: 2482 case PF_NEXT_REPEAT:
2384#ifdef HAVE_SCROLLWHEEL
2385 if ( pf_state == pf_show_tracks ) 2483 if ( pf_state == pf_show_tracks )
2386 select_next_track(); 2484 select_next_track();
2387#endif
2388 if ( pf_state == pf_idle || pf_state == pf_scrolling ) 2485 if ( pf_state == pf_idle || pf_state == pf_scrolling )
2389 show_next_slide(); 2486 show_next_slide();
2390 break; 2487 break;
2391 2488
2392 case PICTUREFLOW_PREV_ALBUM: 2489 case PF_PREV:
2393 case PICTUREFLOW_PREV_ALBUM_REPEAT: 2490 case PF_PREV_REPEAT:
2394#ifdef HAVE_SCROLLWHEEL
2395 if ( pf_state == pf_show_tracks ) 2491 if ( pf_state == pf_show_tracks )
2396 select_prev_track(); 2492 select_prev_track();
2397#endif
2398 if ( pf_state == pf_idle || pf_state == pf_scrolling ) 2493 if ( pf_state == pf_idle || pf_state == pf_scrolling )
2399 show_previous_slide(); 2494 show_previous_slide();
2400 break; 2495 break;
2401 2496
2402#ifndef HAVE_SCROLLWHEEL 2497 case PF_SELECT:
2403 case PICTUREFLOW_NEXT_TRACK:
2404 case PICTUREFLOW_NEXT_TRACK_REPEAT:
2405 if ( pf_state == pf_show_tracks )
2406 select_next_track();
2407 break;
2408
2409 case PICTUREFLOW_PREV_TRACK:
2410 case PICTUREFLOW_PREV_TRACK_REPEAT:
2411 if ( pf_state == pf_show_tracks )
2412 select_prev_track();
2413 break;
2414#endif
2415
2416 case PICTUREFLOW_SELECT_ALBUM:
2417 if ( pf_state == pf_idle ) { 2498 if ( pf_state == pf_idle ) {
2418 pf_state = pf_cover_in; 2499 pf_state = pf_cover_in;
2419 } 2500 }
2420 if ( pf_state == pf_show_tracks )
2421 pf_state = pf_cover_out;
2422 break; 2501 break;
2423 2502
2424 default: 2503 default: