blob: 03de011255677152e87e13745db318ff3fc9cf62 [file] [log] [blame]
Björn Stenberg82182852002-05-16 12:53:40 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 Daniel Stenberg
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
Björn Stenberg244688e2002-05-16 14:48:40 +000020#include <stdio.h>
Björn Stenberg82182852002-05-16 12:53:40 +000021#include <string.h>
22#include <stdlib.h>
23#include <stdbool.h>
24
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +000025#include "applimits.h"
Björn Stenberg82182852002-05-16 12:53:40 +000026#include "dir.h"
27#include "file.h"
28#include "lcd.h"
Daniel Stenberg93b231c2002-09-12 13:33:59 +000029#include "font.h"
Justin Heinerb5025a82002-08-31 04:58:35 +000030#include "backlight.h"
Björn Stenberg82182852002-05-16 12:53:40 +000031#include "button.h"
32#include "kernel.h"
Linus Nielsen Feltzinge0b23fe2002-06-30 13:23:58 +000033#include "usb.h"
Björn Stenberg82182852002-05-16 12:53:40 +000034#include "tree.h"
Björn Stenberg3ed28742002-05-24 15:51:39 +000035#include "main_menu.h"
Felix Arendsebbbe4b2002-05-29 16:38:19 +000036#include "sprintf.h"
Björn Stenbergf88f9112002-05-30 13:23:03 +000037#include "mpeg.h"
Daniel Stenberg7bd65ab2002-06-07 14:23:32 +000038#include "playlist.h"
Daniel Stenberg91f743f2002-06-14 10:39:11 +000039#include "menu.h"
Björn Stenbergbb9aaf52002-06-25 13:26:04 +000040#include "wps.h"
Björn Stenberg1a682be2002-09-02 12:46:32 +000041#include "wps-display.h"
Björn Stenberg24fdde02002-06-27 09:12:29 +000042#include "settings.h"
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +000043#include "status.h"
Linus Nielsen Feltzinge0b23fe2002-06-30 13:23:58 +000044#include "debug.h"
Björn Stenberg457b8a02002-08-26 13:21:14 +000045#include "ata.h"
Björn Stenbergc521ed12002-09-03 09:44:08 +000046#include "rolo.h"
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +000047#include "icons.h"
Björn Stenberg505eca72002-09-18 14:08:05 +000048#include "lang.h"
Daniel Stenberg773e7a72002-09-30 19:05:03 +000049#include "viewer.h"
Daniel Stenberga007ebf2002-09-24 12:40:52 +000050#include "language.h"
Björn Stenbergb1b8bd42002-09-24 17:22:12 +000051#include "screens.h"
Björn Stenberg82182852002-05-16 12:53:40 +000052
53#ifdef HAVE_LCD_BITMAP
Markus Braun000c2db2002-08-30 13:49:32 +000054#include "widgets.h"
Björn Stenberg82182852002-05-16 12:53:40 +000055#endif
56
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +000057#define NAME_BUFFER_SIZE (AVERAGE_FILENAME_LENGTH * MAX_FILES_IN_DIR)
Björn Stenberg82182852002-05-16 12:53:40 +000058
Björn Stenbergc3fd67c2002-12-18 14:57:45 +000059static char name_buffer[NAME_BUFFER_SIZE];
60static int name_buffer_length;
Björn Stenberg82182852002-05-16 12:53:40 +000061struct entry {
Björn Stenbergc521ed12002-09-03 09:44:08 +000062 short attr; /* FAT attributes + file type flags */
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +000063 char *name;
Björn Stenberg82182852002-05-16 12:53:40 +000064};
65
Björn Stenberg1fc4fee2002-05-30 14:01:36 +000066static struct entry dircache[MAX_FILES_IN_DIR];
Eric Linenbergecca1232002-09-09 14:25:39 +000067static int dircursor;
68static int dirstart;
69static int dirlevel;
Björn Stenberg361aaf62002-05-28 16:26:12 +000070static int filesindir;
Eric Linenbergecca1232002-09-09 14:25:39 +000071static int dirpos[MAX_DIR_LEVELS];
72static int cursorpos[MAX_DIR_LEVELS];
73static char lastdir[MAX_PATH];
74static char lastfile[MAX_PATH];
75static char currdir[MAX_PATH];
Björn Stenberg361aaf62002-05-28 16:26:12 +000076
Björn Stenberg82182852002-05-16 12:53:40 +000077void browse_root(void)
78{
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +000079 dirbrowse("/");
Björn Stenberg82182852002-05-16 12:53:40 +000080}
81
82
83#ifdef HAVE_LCD_BITMAP
84
Björn Stenberg8fb73122002-09-24 19:41:23 +000085/* pixel margins */
86#define MARGIN_X (global_settings.scrollbar && \
87 filesindir > tree_max_on_screen ? SCROLLBAR_WIDTH : 0) + \
88 CURSOR_WIDTH + ICON_WIDTH
89#define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0)
Markus Braun000c2db2002-08-30 13:49:32 +000090
Björn Stenberg8fb73122002-09-24 19:41:23 +000091/* position the entry-list starts at */
92#define LINE_X 0
93#define LINE_Y (global_settings.statusbar ? 1 : 0)
Daniel Stenbergbf603f92002-06-14 08:47:44 +000094
Björn Stenberg8fb73122002-09-24 19:41:23 +000095#define CURSOR_X (global_settings.scrollbar && \
96 filesindir > tree_max_on_screen ? 1 : 0)
97#define CURSOR_Y 0 /* the cursor is not positioned in regard to
98 the margins, so this is the amount of lines
99 we add to the cursor Y position to position
100 it on a line */
Markus Braun000c2db2002-08-30 13:49:32 +0000101#define CURSOR_WIDTH 4
102
103#define ICON_WIDTH 6
104
105#define SCROLLBAR_X 0
106#define SCROLLBAR_Y lcd_getymargin()
107#define SCROLLBAR_WIDTH 6
Björn Stenberg82182852002-05-16 12:53:40 +0000108
109extern unsigned char bitmap_icons_6x8[LastIcon][6];
Björn Stenberg82182852002-05-16 12:53:40 +0000110
111#else /* HAVE_LCD_BITMAP */
112
113#define TREE_MAX_ON_SCREEN 2
114#define TREE_MAX_LEN_DISPLAY 11 /* max length that fits on screen */
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000115#define LINE_X 2 /* X position the entry-list starts at */
Markus Braun000c2db2002-08-30 13:49:32 +0000116#define LINE_Y 0 /* Y position the entry-list starts at */
Björn Stenberg82182852002-05-16 12:53:40 +0000117
Markus Braun000c2db2002-08-30 13:49:32 +0000118#define CURSOR_X 0
Daniel Stenbergbf603f92002-06-14 08:47:44 +0000119#define CURSOR_Y 0 /* not really used for players */
Björn Stenberg9314a682002-05-31 09:04:51 +0000120
Björn Stenberg82182852002-05-16 12:53:40 +0000121#endif /* HAVE_LCD_BITMAP */
122
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000123#ifdef HAVE_RECORDER_KEYPAD
124#define TREE_NEXT BUTTON_DOWN
125#define TREE_PREV BUTTON_UP
126#define TREE_EXIT BUTTON_LEFT
127#define TREE_ENTER BUTTON_RIGHT
128#define TREE_MENU BUTTON_F1
129#else
130#define TREE_NEXT BUTTON_RIGHT
131#define TREE_PREV BUTTON_LEFT
132#define TREE_EXIT BUTTON_STOP
133#define TREE_ENTER BUTTON_PLAY
134#define TREE_MENU BUTTON_MENU
135#endif /* HAVE_RECORDER_KEYPAD */
136
Björn Stenbergc521ed12002-09-03 09:44:08 +0000137/* using attribute not used by FAT */
138#define TREE_ATTR_MPA 0x40 /* mpeg audio file */
139#define TREE_ATTR_M3U 0x80 /* playlist */
140#define TREE_ATTR_WPS 0x100 /* wps config file */
141#define TREE_ATTR_MOD 0x200 /* firmware file */
Björn Stenberg08181c72002-10-08 09:40:05 +0000142#define TREE_ATTR_CFG 0x400 /* config file */
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000143#define TREE_ATTR_TXT 0x500 /* text file */
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000144#define TREE_ATTR_FONT 0x800 /* font file */
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000145#define TREE_ATTR_LNG 0x1000 /* binary lang file */
Björn Stenbergc521ed12002-09-03 09:44:08 +0000146#define TREE_ATTR_MASK 0xffd0 /* which bits tree.c uses (above + DIR) */
Björn Stenberg761d6842002-07-16 14:40:27 +0000147
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000148static int build_playlist(int start_index)
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000149{
150 int i;
Björn Stenbergc9603302002-08-08 19:03:14 +0000151 int start=start_index;
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000152
153 playlist_clear();
Linus Nielsen Feltzing8abcf1b2002-08-07 06:04:24 +0000154
155 for(i = 0;i < filesindir;i++)
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000156 {
Dave Chapman8d129462002-08-28 13:58:19 +0000157 if(dircache[i].attr & TREE_ATTR_MPA)
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000158 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000159 DEBUGF("Adding %s\n", dircache[i].name);
160 playlist_add(dircache[i].name);
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000161 }
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000162 else
163 {
164 /* Adjust the start index when se skip non-MP3 entries */
Björn Stenbergc9603302002-08-08 19:03:14 +0000165 if(i < start)
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000166 start_index--;
167 }
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000168 }
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000169
170 return start_index;
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000171}
172
Björn Stenbergbd44e602002-07-17 11:25:04 +0000173static int compare(const void* p1, const void* p2)
Björn Stenberg1fc4fee2002-05-30 14:01:36 +0000174{
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000175 struct entry* e1 = (struct entry*)p1;
176 struct entry* e2 = (struct entry*)p2;
Björn Stenbergbd44e602002-07-17 11:25:04 +0000177
178 if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY ))
Linus Nielsen Feltzingc132c482002-07-22 16:39:17 +0000179 if (global_settings.sort_case)
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000180 return strncmp(e1->name, e2->name, MAX_PATH);
Linus Nielsen Feltzingc132c482002-07-22 16:39:17 +0000181 else
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000182 return strncasecmp(e1->name, e2->name, MAX_PATH);
Björn Stenbergbd44e602002-07-17 11:25:04 +0000183 else
184 return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY );
Björn Stenberg1fc4fee2002-05-30 14:01:36 +0000185}
186
Björn Stenberg361aaf62002-05-28 16:26:12 +0000187static int showdir(char *path, int start)
Björn Stenberg82182852002-05-16 12:53:40 +0000188{
Björn Stenberg82182852002-05-16 12:53:40 +0000189 int icon_type = 0;
Björn Stenberg82182852002-05-16 12:53:40 +0000190 int i;
Björn Stenbergcd225732002-08-11 09:17:47 +0000191 int tree_max_on_screen;
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000192 bool dir_buffer_full;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000193
194#ifdef HAVE_LCD_BITMAP
Björn Stenberg8fb73122002-09-24 19:41:23 +0000195 int line_height;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000196 int fw, fh;
Björn Stenberga4c3b032002-09-24 18:04:15 +0000197 lcd_setfont(FONT_UI);
198 lcd_getstringsize("A", &fw, &fh);
Markus Braunc41dcb92002-08-20 19:39:55 +0000199 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergcd225732002-08-11 09:17:47 +0000200 line_height = fh;
201#else
202 tree_max_on_screen = TREE_MAX_ON_SCREEN;
203#endif
204
Björn Stenberg361aaf62002-05-28 16:26:12 +0000205 /* new dir? cache it */
206 if (strncmp(path,lastdir,sizeof(lastdir))) {
Björn Stenberg361aaf62002-05-28 16:26:12 +0000207 DIR *dir = opendir(path);
208 if(!dir)
209 return -1; /* not a directory */
Björn Stenbergad7de312002-07-16 15:30:23 +0000210
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000211 name_buffer_length = 0;
212 dir_buffer_full = false;
213
Björn Stenberg361aaf62002-05-28 16:26:12 +0000214 for ( i=0; i<MAX_FILES_IN_DIR; i++ ) {
Björn Stenberg24fdde02002-06-27 09:12:29 +0000215 int len;
Björn Stenberg361aaf62002-05-28 16:26:12 +0000216 struct dirent *entry = readdir(dir);
Björn Stenbergad7de312002-07-16 15:30:23 +0000217 struct entry* dptr = &dircache[i];
Björn Stenberg361aaf62002-05-28 16:26:12 +0000218 if (!entry)
219 break;
Björn Stenberg761d6842002-07-16 14:40:27 +0000220
Daniel Stenberg053d9042002-08-22 15:47:30 +0000221 len = strlen(entry->d_name);
222
Björn Stenberg761d6842002-07-16 14:40:27 +0000223 /* skip directories . and .. */
Björn Stenbergad7de312002-07-16 15:30:23 +0000224 if ((entry->attribute & ATTR_DIRECTORY) &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000225 (((len == 1) &&
226 (!strncmp(entry->d_name, ".", 1))) ||
227 ((len == 2) &&
228 (!strncmp(entry->d_name, "..", 2))))) {
Björn Stenberg361aaf62002-05-28 16:26:12 +0000229 i--;
230 continue;
231 }
Daniel Stenberg053d9042002-08-22 15:47:30 +0000232
Robert Hak91e26942002-09-06 04:59:23 +0000233 /* Skip FAT volume ID */
234 if (entry->attribute & ATTR_VOLUME_ID) {
235 i--;
236 continue;
237 }
238
Björn Stenberga7dcf912002-09-24 19:12:09 +0000239 /* filter out dotfiles and hidden files */
240 if (global_settings.dirfilter != SHOW_ALL &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000241 ((entry->d_name[0]=='.') ||
242 (entry->attribute & ATTR_HIDDEN))) {
243 i--;
244 continue;
245 }
246
Björn Stenbergad7de312002-07-16 15:30:23 +0000247 dptr->attr = entry->attribute;
Björn Stenberg761d6842002-07-16 14:40:27 +0000248
Dave Chapman8d129462002-08-28 13:58:19 +0000249 /* mark mp? and m3u files as such */
Björn Stenbergad7de312002-07-16 15:30:23 +0000250 if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) ) {
Dave Chapman8d129462002-08-28 13:58:19 +0000251 if (!strcasecmp(&entry->d_name[len-4], ".mp3") ||
Robert Hak657a2f32002-12-02 04:46:19 +0000252 (!strcasecmp(&entry->d_name[len-4], ".mp2")) ||
253 (!strcasecmp(&entry->d_name[len-4], ".mpa")))
Dave Chapman8d129462002-08-28 13:58:19 +0000254 dptr->attr |= TREE_ATTR_MPA;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000255 else if (!strcasecmp(&entry->d_name[len-4], ".m3u"))
256 dptr->attr |= TREE_ATTR_M3U;
Björn Stenbergb7638222002-10-08 10:10:16 +0000257 else if (!strcasecmp(&entry->d_name[len-4], ".cfg"))
Björn Stenberg08181c72002-10-08 09:40:05 +0000258 dptr->attr |= TREE_ATTR_CFG;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000259 else if (!strcasecmp(&entry->d_name[len-4], ".wps"))
260 dptr->attr |= TREE_ATTR_WPS;
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000261 else if (!strcasecmp(&entry->d_name[len-4], ".txt"))
262 dptr->attr |= TREE_ATTR_TXT;
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000263 else if (!strcasecmp(&entry->d_name[len-4], ".lng"))
264 dptr->attr |= TREE_ATTR_LNG;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000265#ifdef HAVE_RECORDER_KEYPAD
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000266 else if (!strcasecmp(&entry->d_name[len-4], ".fnt"))
267 dptr->attr |= TREE_ATTR_FONT;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000268 else if (!strcasecmp(&entry->d_name[len-4], ".ajz"))
269#else
270 else if (!strcasecmp(&entry->d_name[len-4], ".mod"))
271#endif
272 dptr->attr |= TREE_ATTR_MOD;
Björn Stenberg24fdde02002-06-27 09:12:29 +0000273 }
274
Robert Hak0789d422002-11-30 09:42:13 +0000275 /* filter out all non-playlist files */
276 if ( global_settings.dirfilter == SHOW_PLAYLIST &&
277 (!(dptr->attr &
278 (ATTR_DIRECTORY|TREE_ATTR_M3U))) ) {
279 i--;
280 continue;
281 }
282
Björn Stenberga7dcf912002-09-24 19:12:09 +0000283 /* filter out non-music files */
284 if ( global_settings.dirfilter == SHOW_MUSIC &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000285 (!(dptr->attr &
Dave Chapman8d129462002-08-28 13:58:19 +0000286 (ATTR_DIRECTORY|TREE_ATTR_MPA|TREE_ATTR_M3U))) ) {
Björn Stenbergad7de312002-07-16 15:30:23 +0000287 i--;
288 continue;
289 }
290
Björn Stenberga7dcf912002-09-24 19:12:09 +0000291 /* filter out non-supported files */
292 if ( global_settings.dirfilter == SHOW_SUPPORTED &&
293 (!(dptr->attr & TREE_ATTR_MASK)) ) {
294 i--;
295 continue;
296 }
297
298 if (len > NAME_BUFFER_SIZE - name_buffer_length - 1) {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000299 /* Tell the world that we ran out of buffer space */
300 dir_buffer_full = true;
301 break;
302 }
303 dptr->name = &name_buffer[name_buffer_length];
304 strcpy(dptr->name,entry->d_name);
305 name_buffer_length += len + 1;
Björn Stenberg361aaf62002-05-28 16:26:12 +0000306 }
307 filesindir = i;
308 closedir(dir);
309 strncpy(lastdir,path,sizeof(lastdir));
310 lastdir[sizeof(lastdir)-1] = 0;
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000311 qsort(dircache,filesindir,sizeof(struct entry),compare);
Björn Stenberge33d66a2002-08-12 22:52:19 +0000312
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000313 if ( dir_buffer_full || filesindir == MAX_FILES_IN_DIR ) {
Linus Nielsen Feltzing0a4b2472002-10-15 12:25:57 +0000314#ifdef HAVE_LCD_CHARCELLS
Björn Stenberge33d66a2002-08-12 22:52:19 +0000315 lcd_double_height(false);
316#endif
317 lcd_clear_display();
Björn Stenberg505eca72002-09-18 14:08:05 +0000318 lcd_puts(0,0,str(LANG_SHOWDIR_ERROR_BUFFER));
319 lcd_puts(0,1,str(LANG_SHOWDIR_ERROR_FULL));
Björn Stenberge33d66a2002-08-12 22:52:19 +0000320 lcd_update();
321 sleep(HZ*2);
322 lcd_clear_display();
323 }
Björn Stenberg361aaf62002-05-28 16:26:12 +0000324 }
Björn Stenberg1d322652002-05-31 12:11:22 +0000325
Eric Linenbergecca1232002-09-09 14:25:39 +0000326 if (start == -1)
327 {
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000328 int diff_files;
329
Eric Linenbergecca1232002-09-09 14:25:39 +0000330 /* use lastfile to determine start (default=0) */
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000331 start = 0;
332
Eric Linenbergecca1232002-09-09 14:25:39 +0000333 for (i=0; i<filesindir; i++)
334 {
335 if (!strcasecmp(dircache[i].name, lastfile))
336 {
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000337 start = i;
Eric Linenbergecca1232002-09-09 14:25:39 +0000338 break;
339 }
340 }
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000341
342 diff_files = filesindir - start;
343 if (diff_files < tree_max_on_screen)
344 {
345 int oldstart = start;
346
347 start -= (tree_max_on_screen - diff_files);
348 if (start < 0)
349 start = 0;
350
351 dircursor = oldstart - start;
352 }
353
354 dirstart = start;
Eric Linenbergecca1232002-09-09 14:25:39 +0000355 }
356
Björn Stenberg3d762e92002-06-12 08:06:13 +0000357 lcd_stop_scroll();
Linus Nielsen Feltzing0a4b2472002-10-15 12:25:57 +0000358#ifdef HAVE_LCD_CHARCELLS
Björn Stenberg39526922002-05-31 11:16:25 +0000359 lcd_double_height(false);
360#endif
Björn Stenberg361aaf62002-05-28 16:26:12 +0000361 lcd_clear_display();
Björn Stenberg82182852002-05-16 12:53:40 +0000362#ifdef HAVE_LCD_BITMAP
Björn Stenbergf385e362002-08-13 20:55:08 +0000363 lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and icon */
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000364 lcd_setfont(FONT_UI);
Björn Stenberg82182852002-05-16 12:53:40 +0000365#endif
366
Björn Stenbergcd225732002-08-11 09:17:47 +0000367 for ( i=start; i < start+tree_max_on_screen; i++ ) {
Björn Stenbergf03d6912002-05-29 08:18:46 +0000368 int len;
369
370 if ( i >= filesindir )
371 break;
372
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000373 len = strlen(dircache[i].name);
Björn Stenberg361aaf62002-05-28 16:26:12 +0000374
Björn Stenbergc521ed12002-09-03 09:44:08 +0000375 switch ( dircache[i].attr & TREE_ATTR_MASK ) {
376 case ATTR_DIRECTORY:
377 icon_type = Folder;
378 break;
Björn Stenbergf1bf9e72002-08-23 22:15:51 +0000379
Björn Stenbergc521ed12002-09-03 09:44:08 +0000380 case TREE_ATTR_M3U:
381 icon_type = Playlist;
382 break;
383
384 case TREE_ATTR_MPA:
385 icon_type = File;
386 break;
387
388 case TREE_ATTR_WPS:
389 icon_type = Wps;
390 break;
391
Björn Stenberg08181c72002-10-08 09:40:05 +0000392 case TREE_ATTR_CFG:
Björn Stenbergb7638222002-10-08 10:10:16 +0000393 icon_type = Config;
Justin Heinere4a27612002-09-05 01:20:10 +0000394 break;
Justin Heinere4a27612002-09-05 01:20:10 +0000395
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000396 case TREE_ATTR_TXT:
Björn Stenbergb7638222002-10-08 10:10:16 +0000397 icon_type = Text;
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000398 break;
399
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000400 case TREE_ATTR_LNG:
Björn Stenberg1715b272002-09-24 14:42:14 +0000401 icon_type = Language;
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000402 break;
403
Björn Stenbergc521ed12002-09-03 09:44:08 +0000404 case TREE_ATTR_MOD:
405 icon_type = Mod_Ajz;
406 break;
407
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000408#ifdef HAVE_LCD_BITMAP
409 case TREE_ATTR_FONT:
410 icon_type = Font;
411 break;
412#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +0000413 default:
414 icon_type = 0;
415 }
Björn Stenberg0ad20102002-09-03 20:47:23 +0000416
417 if (icon_type) {
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000418#ifdef HAVE_LCD_BITMAP
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000419 int offset=0;
420 if ( line_height > 8 )
421 offset = (line_height - 8) / 2;
Björn Stenbergf1bf9e72002-08-23 22:15:51 +0000422 lcd_bitmap(bitmap_icons_6x8[icon_type],
Björn Stenberg1a682be2002-09-02 12:46:32 +0000423 CURSOR_X * 6 + CURSOR_WIDTH,
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000424 MARGIN_Y+(i-start)*line_height + offset,
425 6, 8, true);
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000426#else
Justin Heiner4498b5e2002-09-03 16:37:12 +0000427 lcd_define_pattern((i-start)*8,tree_icons_5x7[icon_type],8);
428 lcd_putc(LINE_X-1, i-start, i-start);
Björn Stenberg361aaf62002-05-28 16:26:12 +0000429#endif
Björn Stenberg0ad20102002-09-03 20:47:23 +0000430 }
Björn Stenberg361aaf62002-05-28 16:26:12 +0000431
Björn Stenberga7dcf912002-09-24 19:12:09 +0000432 /* if music filter is on, cut off the extension */
433 if (global_settings.dirfilter == SHOW_MUSIC &&
Dave Chapman8d129462002-08-28 13:58:19 +0000434 (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
Björn Stenbergad7de312002-07-16 15:30:23 +0000435 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000436 char temp = dircache[i].name[len-4];
437 dircache[i].name[len-4] = 0;
Markus Braunc41dcb92002-08-20 19:39:55 +0000438 lcd_puts(LINE_X, i-start, dircache[i].name);
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000439 dircache[i].name[len-4] = temp;
Björn Stenbergad7de312002-07-16 15:30:23 +0000440 }
441 else
Markus Braunc41dcb92002-08-20 19:39:55 +0000442 lcd_puts(LINE_X, i-start, dircache[i].name);
Björn Stenberg82182852002-05-16 12:53:40 +0000443 }
444
Markus Braun000c2db2002-08-30 13:49:32 +0000445#ifdef HAVE_LCD_BITMAP
Björn Stenberg8fb73122002-09-24 19:41:23 +0000446 if (global_settings.scrollbar && filesindir > tree_max_on_screen)
Markus Braun000c2db2002-08-30 13:49:32 +0000447 scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1,
448 LCD_HEIGHT - SCROLLBAR_Y, filesindir, start,
449 start + tree_max_on_screen, VERTICAL);
450#endif
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000451 status_draw();
Björn Stenberg361aaf62002-05-28 16:26:12 +0000452 return filesindir;
Björn Stenberg82182852002-05-16 12:53:40 +0000453}
454
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000455bool ask_resume(void)
456{
Linus Nielsen Feltzing0a4b2472002-10-15 12:25:57 +0000457#ifdef HAVE_LCD_CHARCELLS
Björn Stenberg1b057522002-08-20 20:27:36 +0000458 lcd_double_height(false);
459#endif
460
Björn Stenbergf2106062002-08-19 10:57:55 +0000461 /* always resume? */
462 if ( global_settings.resume == RESUME_ON )
463 return true;
464
Robert Hakc88751f2002-10-16 07:25:33 +0000465 if ( global_settings.resume == RESUME_ASK_ONCE) {
466 global_settings.resume_index = -1;
467 settings_save();
468 }
469
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000470 lcd_clear_display();
Björn Stenberg505eca72002-09-18 14:08:05 +0000471 lcd_puts(0,0,str(LANG_RESUME_ASK));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000472#ifdef HAVE_LCD_CHARCELLS
Björn Stenberg505eca72002-09-18 14:08:05 +0000473 lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000474#else
Björn Stenberg505eca72002-09-18 14:08:05 +0000475 lcd_puts(0,1,str(LANG_RESUME_CONFIRM_RECORDER));
476 lcd_puts(0,2,str(LANG_RESUME_CANCEL_RECORDER));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000477#endif
478 lcd_update();
Robert Hakc88751f2002-10-16 07:25:33 +0000479
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000480 if (button_get(true) == BUTTON_PLAY)
481 return true;
482 return false;
483}
484
485void start_resume(void)
486{
487 if ( global_settings.resume &&
488 global_settings.resume_index != -1 ) {
489 int len = strlen(global_settings.resume_file);
490
491 DEBUGF("Resume file %s\n",global_settings.resume_file);
492 DEBUGF("Resume index %X offset %X\n",
493 global_settings.resume_index,
494 global_settings.resume_offset);
495 DEBUGF("Resume shuffle %s seed %X\n",
496 global_settings.playlist_shuffle?"on":"off",
497 global_settings.resume_seed);
498
499 /* playlist? */
500 if (!strcasecmp(&global_settings.resume_file[len-4], ".m3u")) {
501 char* slash;
502
503 /* check that the file exists */
504 int fd = open(global_settings.resume_file, O_RDONLY);
505 if(fd<0)
506 return;
507 close(fd);
508
509 if (!ask_resume())
510 return;
511
512 slash = strrchr(global_settings.resume_file,'/');
513 if (slash) {
514 *slash=0;
515 play_list(global_settings.resume_file,
516 slash+1,
517 global_settings.resume_index,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000518 true, /* the index is AFTER shuffle */
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000519 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000520 global_settings.resume_seed,
521 global_settings.resume_first_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000522 *slash='/';
523 }
524 else {
525 /* check that the dir exists */
526 DIR* dir = opendir(global_settings.resume_file);
527 if(!dir)
528 return;
529 closedir(dir);
530
531 if (!ask_resume())
532 return;
533
534 play_list("/",
535 global_settings.resume_file,
536 global_settings.resume_index,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000537 true,
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000538 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000539 global_settings.resume_seed,
540 global_settings.resume_first_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000541 }
542 }
543 else {
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000544 if (!ask_resume())
545 return;
546
547 if (showdir(global_settings.resume_file, 0) < 0 )
548 return;
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000549
550 lastdir[0] = '\0';
551
Björn Stenberg7113ec02002-08-16 15:23:57 +0000552 build_playlist(global_settings.resume_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000553 play_list(global_settings.resume_file,
554 NULL,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000555 global_settings.resume_index,
556 true,
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000557 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000558 global_settings.resume_seed,
559 global_settings.resume_first_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000560 }
561
562 status_set_playmode(STATUS_PLAY);
563 status_draw();
564 wps_show();
565 }
566}
567
Eric Linenbergecca1232002-09-09 14:25:39 +0000568void set_current_file(char *path)
569{
570 char *name;
571 unsigned int i;
572
573 /* separate directory from filename */
Hardeep Sidhuc2c8d1c2002-09-17 07:42:21 +0000574 name = strrchr(path+1,'/');
Eric Linenbergecca1232002-09-09 14:25:39 +0000575 if (name)
576 {
577 *name = 0;
578 strcpy(currdir, path);
579 *name = '/';
580 name++;
581 }
582 else
583 {
584 strcpy(currdir, "/");
585 name = path+1;
586 }
587
588 strcpy(lastfile, name);
589
590 dircursor = 0;
591 dirstart = -1;
592
593 if (strncmp(currdir,lastdir,sizeof(lastdir)))
594 {
595 dirlevel = 0;
596 dirpos[dirlevel] = -1;
597 cursorpos[dirlevel] = 0;
598
599 /* use '/' to calculate dirlevel */
600 for (i=1; i<strlen(path)+1; i++)
601 {
602 if (path[i] == '/')
603 {
604 dirlevel++;
605 dirpos[dirlevel] = -1;
606 cursorpos[dirlevel] = 0;
607 }
608 }
609 }
610}
611
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000612#ifdef HAVE_RECORDER_KEYPAD
613bool pageupdown(int* ds, int* dc, int numentries, int tree_max_on_screen )
614{
615 bool exit = false;
616 bool used = false;
617
618 int dirstart = *ds;
619 int dircursor = *dc;
620
621 while (!exit) {
622 switch (button_get(true)) {
623 case BUTTON_UP:
624 case BUTTON_ON | BUTTON_UP:
625 case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:
626 used = true;
627 if ( dirstart ) {
628 dirstart -= tree_max_on_screen;
629 if ( dirstart < 0 )
630 dirstart = 0;
631 }
632 else
633 dircursor = 0;
634 break;
635
636 case BUTTON_DOWN:
637 case BUTTON_ON | BUTTON_DOWN:
638 case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT:
639 used = true;
640 if ( dirstart < numentries - tree_max_on_screen ) {
641 dirstart += tree_max_on_screen;
642 if ( dirstart >
643 numentries - tree_max_on_screen )
644 dirstart = numentries - tree_max_on_screen;
645 }
646 else
647 dircursor = numentries - dirstart - 1;
648 break;
649
650#ifdef SIMULATOR
651 case BUTTON_ON:
652#else
653 case BUTTON_ON | BUTTON_REL:
654 case BUTTON_ON | BUTTON_UP | BUTTON_REL:
655 case BUTTON_ON | BUTTON_DOWN | BUTTON_REL:
656#endif
657 exit = true;
658 break;
659 }
660 if ( used ) {
661 showdir(currdir, dirstart);
662 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
663 lcd_update();
664 }
665 }
666 *ds = dirstart;
667 *dc = dircursor;
668
669 return used;
670}
671#endif
672
Björn Stenbergdea31222002-10-08 15:42:40 +0000673static void storefile(char* filename, char* setting, int maxlen)
674{
675 int len = strlen(filename);
676 int extlen = 0;
677 char* ptr = filename + len;
678
679 while (*ptr != '.') {
680 extlen++;
681 ptr--;
682 }
683
Björn Stenberg5be4d342002-10-08 15:45:50 +0000684 if (strcmp(ROCKBOX_DIR, currdir) || (len-extlen > maxlen))
Björn Stenbergdea31222002-10-08 15:42:40 +0000685 return;
686
687 strncpy(setting, filename, len-extlen);
688 setting[len-extlen]=0;
689
690 settings_save();
691}
692
Björn Stenberg82182852002-05-16 12:53:40 +0000693bool dirbrowse(char *root)
694{
Björn Stenberg079b2d12002-08-08 12:06:38 +0000695 int numentries=0;
Linus Nielsen Feltzing8c57ad92002-07-15 22:46:38 +0000696 char buf[MAX_PATH];
Björn Stenberg82182852002-05-16 12:53:40 +0000697 int i;
Markus Braunde8fbf02002-08-07 10:35:26 +0000698 int lasti=-1;
Linus Nielsen Feltzingb3d0b6e2002-07-27 19:41:58 +0000699 int button;
Björn Stenbergcd225732002-08-11 09:17:47 +0000700 int tree_max_on_screen;
Björn Stenberg0ad20102002-09-03 20:47:23 +0000701 bool reload_root = false;
Björn Stenberga7dcf912002-09-24 19:12:09 +0000702 int lastfilter = global_settings.dirfilter;
Björn Stenberg0ad20102002-09-03 20:47:23 +0000703 bool lastsortcase = global_settings.sort_case;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000704#ifdef HAVE_LCD_BITMAP
705 int fw, fh;
Björn Stenberga4c3b032002-09-24 18:04:15 +0000706 lcd_getstringsize("A", &fw, &fh);
Markus Braunc41dcb92002-08-20 19:39:55 +0000707 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergcd225732002-08-11 09:17:47 +0000708#else
709 tree_max_on_screen = TREE_MAX_ON_SCREEN;
710#endif
Björn Stenberg82182852002-05-16 12:53:40 +0000711
Eric Linenbergecca1232002-09-09 14:25:39 +0000712 dircursor=0;
713 dirstart=0;
714 dirlevel=0;
715
Björn Stenberg82182852002-05-16 12:53:40 +0000716 memcpy(currdir,root,sizeof(currdir));
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000717
718 start_resume();
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000719
720 numentries = showdir(currdir, dirstart);
Björn Stenberg82182852002-05-16 12:53:40 +0000721 if (numentries == -1)
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000722 return -1; /* currdir is not a directory */
Björn Stenberg82182852002-05-16 12:53:40 +0000723
Markus Braun000c2db2002-08-30 13:49:32 +0000724 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Björn Stenberg82182852002-05-16 12:53:40 +0000725
726 while(1) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000727 struct entry* file = &dircache[dircursor+dirstart];
Björn Stenberg1a682be2002-09-02 12:46:32 +0000728
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000729 bool restore = false;
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +0000730 bool need_update = false;
Daniel Stenberg1a17d352002-06-18 11:22:48 +0000731
Markus Braunde8fbf02002-08-07 10:35:26 +0000732 button = button_get_w_tmo(HZ/5);
Linus Nielsen Feltzingf140b202002-07-27 20:55:39 +0000733 switch ( button ) {
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000734 case TREE_EXIT:
Björn Stenberg407bfb02002-09-01 14:49:56 +0000735 case TREE_EXIT | BUTTON_REPEAT:
Björn Stenberg82182852002-05-16 12:53:40 +0000736 i=strlen(currdir);
Björn Stenberge493efd2002-05-21 14:30:54 +0000737 if (i>1) {
Björn Stenberg82182852002-05-16 12:53:40 +0000738 while (currdir[i-1]!='/')
739 i--;
740 strcpy(buf,&currdir[i]);
741 if (i==1)
742 currdir[i]=0;
743 else
744 currdir[i-1]=0;
745
Björn Stenberg82182852002-05-16 12:53:40 +0000746 dirlevel--;
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000747 if ( dirlevel < MAX_DIR_LEVELS ) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000748 dirstart = dirpos[dirlevel];
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000749 dircursor = cursorpos[dirlevel];
750 }
Björn Stenberg82182852002-05-16 12:53:40 +0000751 else
Eric Linenbergecca1232002-09-09 14:25:39 +0000752 dirstart = dircursor = 0;
753
754 if (dirstart == -1)
755 strcpy(lastfile, buf);
756
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000757 restore = true;
Björn Stenberga10d9fa2002-05-27 14:55:40 +0000758 }
Björn Stenberg82182852002-05-16 12:53:40 +0000759 break;
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000760
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000761#ifdef HAVE_RECORDER_KEYPAD
762 case BUTTON_OFF:
763 mpeg_stop();
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000764 status_set_playmode(STATUS_STOP);
Markus Braunde8fbf02002-08-07 10:35:26 +0000765 status_draw();
766 restore = true;
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000767 break;
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000768
769 case BUTTON_OFF | BUTTON_REL:
770#else
771 case BUTTON_STOP | BUTTON_REL:
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000772#endif
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000773 settings_save();
774 break;
775
Björn Stenberg82182852002-05-16 12:53:40 +0000776
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000777 case TREE_ENTER:
Björn Stenberg407bfb02002-09-01 14:49:56 +0000778 case TREE_ENTER | BUTTON_REPEAT:
Björn Stenbergc00557a2002-06-25 11:10:24 +0000779#ifdef HAVE_RECORDER_KEYPAD
780 case BUTTON_PLAY:
Björn Stenberg1a682be2002-09-02 12:46:32 +0000781 case BUTTON_PLAY | BUTTON_REPEAT:
Björn Stenbergc00557a2002-06-25 11:10:24 +0000782#endif
Björn Stenberg8b1aba82002-06-19 20:10:58 +0000783 if ( !numentries )
784 break;
Björn Stenberg82182852002-05-16 12:53:40 +0000785 if ((currdir[0]=='/') && (currdir[1]==0)) {
Björn Stenberg1a682be2002-09-02 12:46:32 +0000786 snprintf(buf,sizeof(buf),"%s%s",currdir, file->name);
Björn Stenberg82182852002-05-16 12:53:40 +0000787 } else {
Björn Stenberg1a682be2002-09-02 12:46:32 +0000788 snprintf(buf,sizeof(buf),"%s/%s",currdir, file->name);
Björn Stenberg82182852002-05-16 12:53:40 +0000789 }
790
Björn Stenberg1a682be2002-09-02 12:46:32 +0000791 if (file->attr & ATTR_DIRECTORY) {
Björn Stenberg82182852002-05-16 12:53:40 +0000792 memcpy(currdir,buf,sizeof(currdir));
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000793 if ( dirlevel < MAX_DIR_LEVELS ) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000794 dirpos[dirlevel] = dirstart;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000795 cursorpos[dirlevel] = dircursor;
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000796 }
Björn Stenberg82182852002-05-16 12:53:40 +0000797 dirlevel++;
798 dircursor=0;
Eric Linenbergecca1232002-09-09 14:25:39 +0000799 dirstart=0;
Björn Stenberg82182852002-05-16 12:53:40 +0000800 } else {
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000801 int seed = current_tick;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000802 bool play = false;
803 int start_index=0;
Björn Stenbergdea31222002-10-08 15:42:40 +0000804
Björn Stenberg42770ea2002-06-10 13:24:27 +0000805 lcd_stop_scroll();
Björn Stenbergc521ed12002-09-03 09:44:08 +0000806 switch ( file->attr & TREE_ATTR_MASK ) {
807 case TREE_ATTR_M3U:
808 if ( global_settings.resume )
809 snprintf(global_settings.resume_file,
810 MAX_PATH, "%s/%s",
811 currdir, file->name);
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000812 play_list(currdir, file->name, 0, false, 0,
813 seed, 0);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000814 start_index = 0;
815 play = true;
816 break;
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000817
Björn Stenbergc521ed12002-09-03 09:44:08 +0000818 case TREE_ATTR_MPA:
819 if ( global_settings.resume )
820 strncpy(global_settings.resume_file,
821 currdir, MAX_PATH);
Eric Linenbergecca1232002-09-09 14:25:39 +0000822 start_index = build_playlist(dircursor+dirstart);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000823
824 /* it is important that we get back the index in
825 the (shuffled) list and stor that */
826 start_index = play_list(currdir, NULL,
827 start_index, false,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000828 0, seed, 0);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000829 play = true;
830 break;
831
832 /* wps config file */
833 case TREE_ATTR_WPS:
Björn Stenberg1a682be2002-09-02 12:46:32 +0000834 snprintf(buf, sizeof buf, "%s/%s",
835 currdir, file->name);
Björn Stenbergdea31222002-10-08 15:42:40 +0000836 wps_load(buf,true);
837 storefile(file->name, global_settings.wps_file,
838 MAX_FILENAME);
Björn Stenberg1a682be2002-09-02 12:46:32 +0000839 restore = true;
840 break;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000841
Björn Stenberg08181c72002-10-08 09:40:05 +0000842 case TREE_ATTR_CFG:
Justin Heinere4a27612002-09-05 01:20:10 +0000843 snprintf(buf, sizeof buf, "%s/%s",
844 currdir, file->name);
Björn Stenberg08181c72002-10-08 09:40:05 +0000845 settings_load_config(buf);
Justin Heinere4a27612002-09-05 01:20:10 +0000846 restore = true;
847 break;
Justin Heinere4a27612002-09-05 01:20:10 +0000848
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000849 case TREE_ATTR_TXT:
850 snprintf(buf, sizeof buf, "%s/%s",
851 currdir, file->name);
852 viewer_run(buf);
853 restore = true;
854 break;
855
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000856 case TREE_ATTR_LNG:
857 snprintf(buf, sizeof buf, "%s/%s",
858 currdir, file->name);
Daniel Stenberg85305da2002-09-24 13:37:38 +0000859 if(!lang_load(buf)) {
Björn Stenbergdea31222002-10-08 15:42:40 +0000860 storefile(file->name,
861 global_settings.lang_file,
862 MAX_FILENAME);
863
Daniel Stenberg85305da2002-09-24 13:37:38 +0000864 lcd_clear_display();
865#ifdef HAVE_LCD_CHARCELLS
866 lcd_puts(0, 0, str(LANG_LANGUAGE_LOADED));
867#else
868 lcd_getstringsize(str(LANG_LANGUAGE_LOADED),
Björn Stenberga4c3b032002-09-24 18:04:15 +0000869 &fw, &fh);
Daniel Stenberg85305da2002-09-24 13:37:38 +0000870 if(fw>LCD_WIDTH)
871 fw=0;
872 else
873 fw=LCD_WIDTH/2 - fw/2;
874
Björn Stenberga4c3b032002-09-24 18:04:15 +0000875 lcd_putsxy(fw, LCD_HEIGHT/2 - fh/2,
876 str(LANG_LANGUAGE_LOADED));
Daniel Stenberg85305da2002-09-24 13:37:38 +0000877#endif
878 lcd_update();
879 sleep(HZ);
880 restore = true;
881 }
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000882 break;
883
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000884#ifdef HAVE_LCD_BITMAP
885 case TREE_ATTR_FONT:
886 snprintf(buf, sizeof buf, "%s/%s",
887 currdir, file->name);
888 font_load(buf);
Björn Stenbergdea31222002-10-08 15:42:40 +0000889 storefile(file->name, global_settings.font_file,
890 MAX_FILENAME);
891
Björn Stenberga4c3b032002-09-24 18:04:15 +0000892 lcd_getstringsize("A", &fw, &fh);
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000893 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
894 /* make sure cursor is on screen */
895 while ( dircursor > tree_max_on_screen ) {
896 dircursor--;
897 dirstart++;
898 }
899 restore = true;
900 break;
901#endif
902
Björn Stenbergc521ed12002-09-03 09:44:08 +0000903#ifndef SIMULATOR
904 /* firmware file */
905 case TREE_ATTR_MOD:
906 snprintf(buf, sizeof buf, "%s/%s",
907 currdir, file->name);
908 rolo_load(buf);
Björn Stenberg1a682be2002-09-02 12:46:32 +0000909 break;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000910#endif
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000911 }
912
Björn Stenbergc521ed12002-09-03 09:44:08 +0000913 if ( play ) {
914 if ( global_settings.resume ) {
915 /* the resume_index must always be the index in the
916 shuffled list in case shuffle is enabled */
917 global_settings.resume_index = start_index;
918 global_settings.resume_offset = 0;
Hardeep Sidhu3735a152002-10-11 09:14:30 +0000919 global_settings.resume_first_index =
920 playlist_first_index();
Björn Stenbergc521ed12002-09-03 09:44:08 +0000921 global_settings.resume_seed = seed;
922 settings_save();
923 }
924
925 status_set_playmode(STATUS_PLAY);
926 status_draw();
927 lcd_stop_scroll();
Björn Stenberg0ad20102002-09-03 20:47:23 +0000928 if ( wps_show() == SYS_USB_CONNECTED ) {
929 reload_root = true;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000930 }
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000931#ifdef HAVE_LCD_BITMAP
Björn Stenbergc521ed12002-09-03 09:44:08 +0000932 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Markus Braun000c2db2002-08-30 13:49:32 +0000933#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +0000934 }
Björn Stenberg82182852002-05-16 12:53:40 +0000935 }
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000936 restore = true;
Björn Stenberg82182852002-05-16 12:53:40 +0000937 break;
Eric Linenberg9e91b952002-08-06 18:11:00 +0000938
Eric Linenberg9e91b952002-08-06 18:11:00 +0000939 case TREE_PREV:
Björn Stenbergc1d9b152002-08-07 20:51:37 +0000940 case TREE_PREV | BUTTON_REPEAT:
Björn Stenberg6752ee42002-08-12 18:28:51 +0000941 case BUTTON_VOL_UP:
Eric Linenberg9e91b952002-08-06 18:11:00 +0000942 if(filesindir) {
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000943 if(dircursor) {
Markus Braun000c2db2002-08-30 13:49:32 +0000944 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, false);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000945 dircursor--;
Markus Braun000c2db2002-08-30 13:49:32 +0000946 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000947 }
948 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000949 if (dirstart) {
950 dirstart--;
951 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000952 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000953 }
954 else {
Björn Stenbergcd225732002-08-11 09:17:47 +0000955 if (numentries < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +0000956 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000957 false);
958 dircursor = numentries - 1;
Markus Braun000c2db2002-08-30 13:49:32 +0000959 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000960 true);
961 }
962 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000963 dirstart = numentries - tree_max_on_screen;
Björn Stenbergcd225732002-08-11 09:17:47 +0000964 dircursor = tree_max_on_screen - 1;
Eric Linenbergecca1232002-09-09 14:25:39 +0000965 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000966 put_cursorxy(CURSOR_X, CURSOR_Y +
Björn Stenbergcd225732002-08-11 09:17:47 +0000967 tree_max_on_screen - 1, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000968 }
969 }
970 }
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +0000971 need_update = true;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000972 }
Björn Stenberg82182852002-05-16 12:53:40 +0000973 break;
Björn Stenberg244688e2002-05-16 14:48:40 +0000974
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000975 case TREE_NEXT:
Björn Stenbergc1d9b152002-08-07 20:51:37 +0000976 case TREE_NEXT | BUTTON_REPEAT:
Björn Stenberg6752ee42002-08-12 18:28:51 +0000977 case BUTTON_VOL_DOWN:
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000978 if(filesindir)
979 {
Eric Linenbergecca1232002-09-09 14:25:39 +0000980 if (dircursor + dirstart + 1 < numentries ) {
Björn Stenbergcd225732002-08-11 09:17:47 +0000981 if(dircursor+1 < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +0000982 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000983 false);
984 dircursor++;
Markus Braun000c2db2002-08-30 13:49:32 +0000985 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000986 }
987 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000988 dirstart++;
989 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000990 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000991 }
992 }
993 else {
Björn Stenbergcd225732002-08-11 09:17:47 +0000994 if(numentries < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +0000995 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000996 false);
Eric Linenbergecca1232002-09-09 14:25:39 +0000997 dirstart = dircursor = 0;
Markus Braun000c2db2002-08-30 13:49:32 +0000998 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000999 }
1000 else {
Eric Linenbergecca1232002-09-09 14:25:39 +00001001 dirstart = dircursor = 0;
1002 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001003 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001004 }
1005 }
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001006 need_update = true;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001007 }
Björn Stenberg82182852002-05-16 12:53:40 +00001008 break;
Björn Stenberge493efd2002-05-21 14:30:54 +00001009
Björn Stenberg0ad20102002-09-03 20:47:23 +00001010 case TREE_MENU:
Björn Stenberg42770ea2002-06-10 13:24:27 +00001011 lcd_stop_scroll();
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001012 if (main_menu())
1013 reload_root = true;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001014 restore = true;
Björn Stenberge493efd2002-05-21 14:30:54 +00001015 break;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001016
1017 case BUTTON_ON:
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001018#ifdef HAVE_RECORDER_KEYPAD
1019 if (pageupdown(&dirstart, &dircursor, numentries,
1020 tree_max_on_screen))
Linus Nielsen Feltzing8abcf1b2002-08-07 06:04:24 +00001021 {
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001022 /* start scroll */
Björn Stenberg34d1e1b2002-06-27 01:20:08 +00001023 restore = true;
1024 }
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001025 else
1026#endif
1027 {
1028 if (mpeg_status() & MPEG_STATUS_PLAY)
1029 {
1030 lcd_stop_scroll();
1031 if (wps_show() == SYS_USB_CONNECTED)
1032 reload_root = true;
1033#ifdef HAVE_LCD_BITMAP
1034 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
1035#endif
1036 restore = true;
1037 }
1038 }
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001039 break;
Linus Nielsen Feltzingda501ee2002-06-30 16:27:39 +00001040
Markus Braunde8fbf02002-08-07 10:35:26 +00001041#ifdef HAVE_RECORDER_KEYPAD
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001042 case BUTTON_F2:
Björn Stenberg0ad20102002-09-03 20:47:23 +00001043 if (f2_screen())
1044 reload_root = true;
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001045 restore = true;
1046 break;
1047
1048 case BUTTON_F3:
Björn Stenberg0ad20102002-09-03 20:47:23 +00001049 if (f3_screen())
1050 reload_root = true;
Daniel Stenberg93b231c2002-09-12 13:33:59 +00001051
1052#ifdef HAVE_LCD_BITMAP
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001053 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001054#endif
1055 restore = true;
Markus Braunde8fbf02002-08-07 10:35:26 +00001056 break;
Markus Braunc41dcb92002-08-20 19:39:55 +00001057#endif
Markus Braunde8fbf02002-08-07 10:35:26 +00001058
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001059 case SYS_USB_CONNECTED:
Markus Braun88098be2002-10-11 08:56:23 +00001060 status_set_playmode(STATUS_STOP);
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001061 usb_screen();
Björn Stenberg0ad20102002-09-03 20:47:23 +00001062 reload_root = true;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001063 break;
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001064
1065 case BUTTON_NONE:
1066 status_draw();
1067 break;
Björn Stenberg82182852002-05-16 12:53:40 +00001068 }
Björn Stenberg42770ea2002-06-10 13:24:27 +00001069
Björn Stenberg457b8a02002-08-26 13:21:14 +00001070 if ( button )
1071 ata_spin();
1072
Björn Stenberg0ad20102002-09-03 20:47:23 +00001073 /* do we need to rescan dir? */
1074 if (reload_root ||
Björn Stenberga7dcf912002-09-24 19:12:09 +00001075 lastfilter != global_settings.dirfilter ||
1076 lastsortcase != global_settings.sort_case)
Björn Stenberg0ad20102002-09-03 20:47:23 +00001077 {
1078 if ( reload_root ) {
1079 strcpy(currdir, "/");
1080 dirlevel = 0;
1081 reload_root = false;
1082 }
1083 dircursor = 0;
Eric Linenbergecca1232002-09-09 14:25:39 +00001084 dirstart = 0;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001085 lastdir[0] = 0;
Björn Stenberga7dcf912002-09-24 19:12:09 +00001086 lastfilter = global_settings.dirfilter;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001087 lastsortcase = global_settings.sort_case;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001088 restore = true;
1089 }
1090
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001091 if ( restore ) {
1092 /* restore display */
Linus Nielsen Feltzinge10fc4c2002-08-08 10:46:10 +00001093 /* We need to adjust if the number of lines on screen have
1094 changed because of a status bar change */
Björn Stenbergcd225732002-08-11 09:17:47 +00001095 if(CURSOR_Y+LINE_Y+dircursor>tree_max_on_screen) {
Eric Linenbergecca1232002-09-09 14:25:39 +00001096 dirstart++;
Linus Nielsen Feltzinge10fc4c2002-08-08 10:46:10 +00001097 dircursor--;
1098 }
Daniel Stenberg773e7a72002-09-30 19:05:03 +00001099#ifdef HAVE_LCD_BITMAP
1100 /* the sub-screen might've ruined the margins */
1101 lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and
1102 icon */
1103#endif
Eric Linenbergecca1232002-09-09 14:25:39 +00001104 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001105 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001106
1107 need_update = true;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001108 }
Björn Stenberg42770ea2002-06-10 13:24:27 +00001109
Markus Braunde8fbf02002-08-07 10:35:26 +00001110 if ( numentries ) {
Eric Linenbergecca1232002-09-09 14:25:39 +00001111 i = dirstart+dircursor;
Markus Braunde8fbf02002-08-07 10:35:26 +00001112
1113 /* if MP3 filter is on, cut off the extension */
1114 if(lasti!=i || restore) {
1115 lasti=i;
1116 lcd_stop_scroll();
Björn Stenberga7dcf912002-09-24 19:12:09 +00001117 if (global_settings.dirfilter == SHOW_MUSIC &&
1118 (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
Markus Braunde8fbf02002-08-07 10:35:26 +00001119 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +00001120 int len = strlen(dircache[i].name);
1121 char temp = dircache[i].name[len-4];
1122 dircache[i].name[len-4] = 0;
Björn Stenberga7dcf912002-09-24 19:12:09 +00001123 lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +00001124 dircache[i].name[len-4] = temp;
Markus Braunde8fbf02002-08-07 10:35:26 +00001125 }
1126 else
Björn Stenberga7dcf912002-09-24 19:12:09 +00001127 lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001128
1129 need_update = true;
Markus Braunde8fbf02002-08-07 10:35:26 +00001130 }
1131 }
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001132
1133 if(need_update) {
1134 lcd_update();
1135
1136 need_update = false;
1137 }
Björn Stenberg82182852002-05-16 12:53:40 +00001138 }
1139
1140 return false;
1141}
Daniel Stenberga007ebf2002-09-24 12:40:52 +00001142
1143/* -----------------------------------------------------------------
1144 * local variables:
1145 * eval: (load-file "../firmware/rockbox-mode.el")
1146 * end:
1147 */