summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r--apps/gui/skin_engine/skin_display.c60
1 files changed, 34 insertions, 26 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index e63b078d37..e90ac4c4ce 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -169,17 +169,20 @@ bool audio_peek_track(struct mp3entry* id3, int offset);
169static void draw_playlist_viewer_list(struct gui_wps *gwps, 169static void draw_playlist_viewer_list(struct gui_wps *gwps,
170 struct playlistviewer *viewer) 170 struct playlistviewer *viewer)
171{ 171{
172 struct wps_state *state = gwps->state;
172 int lines = viewport_get_nb_lines(viewer->vp); 173 int lines = viewport_get_nb_lines(viewer->vp);
173 int line_height = font_get(viewer->vp->font)->height; 174 int line_height = font_get(viewer->vp->font)->height;
174 int cur_playlist_pos = playlist_get_display_index(); 175 int cur_playlist_pos = playlist_get_display_index();
175 int start_item = MAX(0, cur_playlist_pos + viewer->start_offset); 176 int start_item = MAX(0, cur_playlist_pos + viewer->start_offset);
176 int i; 177 int i;
178 struct wps_token token;
177 179
178 struct mp3entry *pid3; 180 struct mp3entry *pid3;
179#if CONFIG_CODEC == SWCODEC 181#if CONFIG_CODEC == SWCODEC
180 struct mp3entry id3; 182 struct mp3entry id3;
181#endif 183#endif
182 char buf[MAX_PATH*2], tempbuf[MAX_PATH]; 184 char buf[MAX_PATH*2], tempbuf[MAX_PATH];
185 unsigned int buf_used = 0;
183 186
184 187
185 gwps->display->set_viewport(viewer->vp); 188 gwps->display->set_viewport(viewer->vp);
@@ -187,11 +190,11 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps,
187 { 190 {
188 if (i == cur_playlist_pos) 191 if (i == cur_playlist_pos)
189 { 192 {
190 pid3 = audio_current_track(); 193 pid3 = state->id3;
191 } 194 }
192 else if (i == cur_playlist_pos+1) 195 else if (i == cur_playlist_pos+1)
193 { 196 {
194 pid3 = audio_next_track(); 197 pid3 = state->nid3;
195 } 198 }
196#if CONFIG_CODEC == SWCODEC 199#if CONFIG_CODEC == SWCODEC
197 else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos)) 200 else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos))
@@ -200,51 +203,56 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps,
200 } 203 }
201#endif 204#endif
202 else 205 else
206 {
203 pid3 = NULL; 207 pid3 = NULL;
208 }
204 209
205 int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO; 210 int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO;
206 int token = 0, cur_string = 0; 211 int j = 0, cur_string = 0;
207 char *filename = playlist_peek(i-cur_playlist_pos); 212 char *filename = playlist_peek(i-cur_playlist_pos);
208 buf[0] = '\0'; 213 buf[0] = '\0';
209 while (token < viewer->lines[line].count) 214 buf_used = 0;
215 while (j < viewer->lines[line].count && (buf_used<sizeof(buf)))
210 { 216 {
211 switch (viewer->lines[line].tokens[token]) 217 const char *out = NULL;
218 token.type = viewer->lines[line].tokens[j];
219 token.value.i = 0;
220 token.next = false;
221 out = get_id3_token(&token, pid3, tempbuf, sizeof(tempbuf), -1, NULL);
222 if (out)
223 {
224 snprintf(&buf[buf_used], sizeof(buf)-buf_used, "%s", out);
225 buf_used += strlen(out);
226 j++;
227 continue;
228 }
229 switch (viewer->lines[line].tokens[j])
212 { 230 {
213 case WPS_TOKEN_STRING: 231 case WPS_TOKEN_STRING:
214 case WPS_TOKEN_CHARACTER: 232 case WPS_TOKEN_CHARACTER:
215 strcat(buf, viewer->lines[line].strings[cur_string++]); 233 snprintf(tempbuf, sizeof(tempbuf), "%s",
234 viewer->lines[line].strings[cur_string]);
235 cur_string++;
216 break; 236 break;
217 case WPS_TOKEN_PLAYLIST_POSITION: 237 case WPS_TOKEN_PLAYLIST_POSITION:
218 snprintf(tempbuf, sizeof(tempbuf), "%d", i); 238 snprintf(tempbuf, sizeof(tempbuf), "%d", i);
219 strcat(buf, tempbuf);
220 break; 239 break;
221 case WPS_TOKEN_FILE_NAME: 240 case WPS_TOKEN_FILE_NAME:
222 get_dir(tempbuf, sizeof(tempbuf), filename, 0); 241 get_dir(tempbuf, sizeof(tempbuf), filename, 0);
223 strcat(buf, tempbuf);
224 break; 242 break;
225 case WPS_TOKEN_FILE_PATH: 243 case WPS_TOKEN_FILE_PATH:
226 strcat(buf, filename); 244 snprintf(tempbuf, sizeof(tempbuf), "%s", filename);
227 break;
228 case WPS_TOKEN_METADATA_ARTIST:
229 if (pid3)
230 strcat(buf, pid3->artist ? pid3->artist : "");
231 break; 245 break;
232 case WPS_TOKEN_METADATA_TRACK_TITLE:
233 if (pid3)
234 strcat(buf, pid3->title ? pid3->title : "");
235 break;
236 case WPS_TOKEN_TRACK_LENGTH:
237 if (pid3)
238 {
239 format_time(tempbuf, sizeof(tempbuf), pid3->length);
240 strcat(buf, tempbuf);
241 }
242 break;
243
244 default: 246 default:
247 tempbuf[0] = '\0';
245 break; 248 break;
246 } 249 }
247 token++; 250 if (tempbuf[0])
251 {
252 snprintf(&buf[buf_used], sizeof(buf)-buf_used, "%s", tempbuf);
253 buf_used += strlen(tempbuf);
254 }
255 j++;
248 } 256 }
249 257
250 if (viewer->lines[line].scroll) 258 if (viewer->lines[line].scroll)