diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-01-13 06:02:38 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-01-13 06:02:38 +0000 |
commit | dc0ba917fa94a554a166b1939548b06c9ee49307 (patch) | |
tree | 872f0b9f57f1ab5d1c28f69f4118fba704f27d85 /apps/gui/skin_engine/skin_display.c | |
parent | 8b926e98f82a8b6ffccc40a65388b6bbcd1c2538 (diff) | |
download | rockbox-dc0ba917fa94a554a166b1939548b06c9ee49307.tar.gz rockbox-dc0ba917fa94a554a166b1939548b06c9ee49307.zip |
FS#10898 - Add a playlist viewer to the WPS. http://www.rockbox.org/wiki/CustomWPS#Playlist_viewer for an exaplanation how to use it.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24220 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index b8cc75e10a..e781d43372 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include "statusbar.h" | 35 | #include "statusbar.h" |
36 | #include "scrollbar.h" | 36 | #include "scrollbar.h" |
37 | #include "screen_access.h" | 37 | #include "screen_access.h" |
38 | #include "playlist.h" | ||
39 | #include "playback.h" | ||
38 | 40 | ||
39 | #ifdef HAVE_LCD_BITMAP | 41 | #ifdef HAVE_LCD_BITMAP |
40 | #include "peakmeter.h" | 42 | #include "peakmeter.h" |
@@ -163,6 +165,94 @@ static void draw_progressbar(struct gui_wps *gwps, | |||
163 | cue_draw_markers(display, state->id3->cuesheet, length, | 165 | cue_draw_markers(display, state->id3->cuesheet, length, |
164 | pb->x, pb->x + pb->width, y+1, pb->height-2); | 166 | pb->x, pb->x + pb->width, y+1, pb->height-2); |
165 | } | 167 | } |
168 | bool audio_peek_track(struct mp3entry* id3, int offset); | ||
169 | static void draw_playlist_viewer_list(struct gui_wps *gwps, | ||
170 | struct playlistviewer *viewer) | ||
171 | { | ||
172 | int lines = viewport_get_nb_lines(viewer->vp); | ||
173 | int line_height = font_get(viewer->vp->font)->height; | ||
174 | int cur_playlist_pos = playlist_get_display_index(); | ||
175 | int start_item = MAX(0, cur_playlist_pos + viewer->start_offset); | ||
176 | int i; | ||
177 | |||
178 | struct mp3entry *pid3, id3; | ||
179 | char buf[MAX_PATH*2], tempbuf[MAX_PATH]; | ||
180 | |||
181 | |||
182 | gwps->display->set_viewport(viewer->vp); | ||
183 | for(i=start_item; (i-start_item)<lines && i<playlist_amount(); i++) | ||
184 | { | ||
185 | if (i == cur_playlist_pos) | ||
186 | { | ||
187 | pid3 = audio_current_track(); | ||
188 | } | ||
189 | else if (i == cur_playlist_pos+1) | ||
190 | { | ||
191 | pid3 = audio_next_track(); | ||
192 | } | ||
193 | else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos)) | ||
194 | { | ||
195 | pid3 = &id3; | ||
196 | } | ||
197 | else | ||
198 | pid3 = NULL; | ||
199 | |||
200 | int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO; | ||
201 | int token = 0, cur_string = 0; | ||
202 | char *filename = playlist_peek(i-cur_playlist_pos); | ||
203 | buf[0] = '\0'; | ||
204 | while (token < viewer->lines[line].count) | ||
205 | { | ||
206 | switch (viewer->lines[line].tokens[token]) | ||
207 | { | ||
208 | case WPS_TOKEN_STRING: | ||
209 | case WPS_TOKEN_CHARACTER: | ||
210 | strcat(buf, viewer->lines[line].strings[cur_string++]); | ||
211 | break; | ||
212 | case WPS_TOKEN_PLAYLIST_POSITION: | ||
213 | snprintf(tempbuf, sizeof(tempbuf), "%d", i); | ||
214 | strcat(buf, tempbuf); | ||
215 | break; | ||
216 | case WPS_TOKEN_FILE_NAME: | ||
217 | get_dir(tempbuf, sizeof(tempbuf), filename, 0); | ||
218 | strcat(buf, tempbuf); | ||
219 | break; | ||
220 | case WPS_TOKEN_FILE_PATH: | ||
221 | strcat(buf, filename); | ||
222 | break; | ||
223 | case WPS_TOKEN_METADATA_ARTIST: | ||
224 | if (pid3) | ||
225 | strcat(buf, pid3->artist ? pid3->artist : ""); | ||
226 | break; | ||
227 | case WPS_TOKEN_METADATA_TRACK_TITLE: | ||
228 | if (pid3) | ||
229 | strcat(buf, pid3->title ? pid3->title : ""); | ||
230 | break; | ||
231 | case WPS_TOKEN_TRACK_LENGTH: | ||
232 | if (pid3) | ||
233 | { | ||
234 | format_time(tempbuf, sizeof(tempbuf), pid3->length); | ||
235 | strcat(buf, tempbuf); | ||
236 | } | ||
237 | break; | ||
238 | |||
239 | default: | ||
240 | break; | ||
241 | } | ||
242 | token++; | ||
243 | } | ||
244 | |||
245 | if (viewer->lines[line].scroll) | ||
246 | { | ||
247 | gwps->display->puts_scroll(0, (i-start_item), buf ); | ||
248 | } | ||
249 | else | ||
250 | { | ||
251 | gwps->display->putsxy(0, (i-start_item)*line_height, buf ); | ||
252 | } | ||
253 | } | ||
254 | } | ||
255 | |||
166 | 256 | ||
167 | /* clears the area where the image was shown */ | 257 | /* clears the area where the image was shown */ |
168 | static void clear_image_pos(struct gui_wps *gwps, struct gui_img *img) | 258 | static void clear_image_pos(struct gui_wps *gwps, struct gui_img *img) |
@@ -595,6 +685,11 @@ static bool get_line(struct gui_wps *gwps, | |||
595 | } | 685 | } |
596 | } | 686 | } |
597 | break; | 687 | break; |
688 | #ifdef HAVE_LCD_BITMAP | ||
689 | case WPS_VIEWPORT_CUSTOMLIST: | ||
690 | draw_playlist_viewer_list(gwps, data->tokens[i].value.data); | ||
691 | break; | ||
692 | #endif | ||
598 | default: | 693 | default: |
599 | { | 694 | { |
600 | /* get the value of the tag and copy it to the buffer */ | 695 | /* get the value of the tag and copy it to the buffer */ |