diff options
Diffstat (limited to 'apps/plugins/pictureflow.c')
-rw-r--r-- | apps/plugins/pictureflow.c | 215 |
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 | ||
41 | const 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 | |||
51 | const 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]) | 94 | const 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 | }; | ||
145 | const 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; | |||
77 | typedef fb_data pix_t; | 182 | typedef 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 | ||
646 | static 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 */ |
562 | void init_reflect_table(void) | 652 | void 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 | */ | ||
1721 | static 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 | */ |
1632 | void render_all_slides(void) | 1731 | void 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: |