blob: 6e52942b45b8b7a034c03291b42d44d3d1cb7728 [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
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +000059char name_buffer[NAME_BUFFER_SIZE];
60int 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
Björn Stenberg46d2d382002-09-29 22:05:21 +0000129#define RELEASE_MASK (BUTTON_OFF | BUTTON_ON | BUTTON_F2 | BUTTON_F3)
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000130#else
131#define TREE_NEXT BUTTON_RIGHT
132#define TREE_PREV BUTTON_LEFT
133#define TREE_EXIT BUTTON_STOP
134#define TREE_ENTER BUTTON_PLAY
135#define TREE_MENU BUTTON_MENU
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000136#define RELEASE_MASK (BUTTON_STOP)
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000137#endif /* HAVE_RECORDER_KEYPAD */
138
Björn Stenbergc521ed12002-09-03 09:44:08 +0000139/* using attribute not used by FAT */
140#define TREE_ATTR_MPA 0x40 /* mpeg audio file */
141#define TREE_ATTR_M3U 0x80 /* playlist */
142#define TREE_ATTR_WPS 0x100 /* wps config file */
143#define TREE_ATTR_MOD 0x200 /* firmware file */
Björn Stenberg08181c72002-10-08 09:40:05 +0000144#define TREE_ATTR_CFG 0x400 /* config file */
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000145#define TREE_ATTR_TXT 0x500 /* text file */
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000146#define TREE_ATTR_FONT 0x800 /* font file */
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000147#define TREE_ATTR_LNG 0x1000 /* binary lang file */
Björn Stenbergc521ed12002-09-03 09:44:08 +0000148#define TREE_ATTR_MASK 0xffd0 /* which bits tree.c uses (above + DIR) */
Björn Stenberg761d6842002-07-16 14:40:27 +0000149
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000150static int build_playlist(int start_index)
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000151{
152 int i;
Björn Stenbergc9603302002-08-08 19:03:14 +0000153 int start=start_index;
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000154
155 playlist_clear();
Linus Nielsen Feltzing8abcf1b2002-08-07 06:04:24 +0000156
157 for(i = 0;i < filesindir;i++)
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000158 {
Dave Chapman8d129462002-08-28 13:58:19 +0000159 if(dircache[i].attr & TREE_ATTR_MPA)
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000160 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000161 DEBUGF("Adding %s\n", dircache[i].name);
162 playlist_add(dircache[i].name);
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000163 }
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000164 else
165 {
166 /* Adjust the start index when se skip non-MP3 entries */
Björn Stenbergc9603302002-08-08 19:03:14 +0000167 if(i < start)
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000168 start_index--;
169 }
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000170 }
Linus Nielsen Feltzing1e02e982002-08-08 06:42:02 +0000171
172 return start_index;
Linus Nielsen Feltzing4a4f17f2002-08-06 13:10:51 +0000173}
174
Björn Stenbergbd44e602002-07-17 11:25:04 +0000175static int compare(const void* p1, const void* p2)
Björn Stenberg1fc4fee2002-05-30 14:01:36 +0000176{
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000177 struct entry* e1 = (struct entry*)p1;
178 struct entry* e2 = (struct entry*)p2;
Björn Stenbergbd44e602002-07-17 11:25:04 +0000179
180 if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY ))
Linus Nielsen Feltzingc132c482002-07-22 16:39:17 +0000181 if (global_settings.sort_case)
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000182 return strncmp(e1->name, e2->name, MAX_PATH);
Linus Nielsen Feltzingc132c482002-07-22 16:39:17 +0000183 else
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000184 return strncasecmp(e1->name, e2->name, MAX_PATH);
Björn Stenbergbd44e602002-07-17 11:25:04 +0000185 else
186 return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY );
Björn Stenberg1fc4fee2002-05-30 14:01:36 +0000187}
188
Björn Stenberg361aaf62002-05-28 16:26:12 +0000189static int showdir(char *path, int start)
Björn Stenberg82182852002-05-16 12:53:40 +0000190{
Björn Stenberg82182852002-05-16 12:53:40 +0000191 int icon_type = 0;
Björn Stenberg82182852002-05-16 12:53:40 +0000192 int i;
Björn Stenbergcd225732002-08-11 09:17:47 +0000193 int tree_max_on_screen;
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000194 bool dir_buffer_full;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000195
196#ifdef HAVE_LCD_BITMAP
Björn Stenberg8fb73122002-09-24 19:41:23 +0000197 int line_height;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000198 int fw, fh;
Björn Stenberga4c3b032002-09-24 18:04:15 +0000199 lcd_setfont(FONT_UI);
200 lcd_getstringsize("A", &fw, &fh);
Markus Braunc41dcb92002-08-20 19:39:55 +0000201 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergcd225732002-08-11 09:17:47 +0000202 line_height = fh;
203#else
204 tree_max_on_screen = TREE_MAX_ON_SCREEN;
205#endif
206
Björn Stenberg361aaf62002-05-28 16:26:12 +0000207 /* new dir? cache it */
208 if (strncmp(path,lastdir,sizeof(lastdir))) {
Björn Stenberg361aaf62002-05-28 16:26:12 +0000209 DIR *dir = opendir(path);
210 if(!dir)
211 return -1; /* not a directory */
Björn Stenbergad7de312002-07-16 15:30:23 +0000212
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000213 name_buffer_length = 0;
214 dir_buffer_full = false;
215
Björn Stenberg361aaf62002-05-28 16:26:12 +0000216 for ( i=0; i<MAX_FILES_IN_DIR; i++ ) {
Björn Stenberg24fdde02002-06-27 09:12:29 +0000217 int len;
Björn Stenberg361aaf62002-05-28 16:26:12 +0000218 struct dirent *entry = readdir(dir);
Björn Stenbergad7de312002-07-16 15:30:23 +0000219 struct entry* dptr = &dircache[i];
Björn Stenberg361aaf62002-05-28 16:26:12 +0000220 if (!entry)
221 break;
Björn Stenberg761d6842002-07-16 14:40:27 +0000222
Daniel Stenberg053d9042002-08-22 15:47:30 +0000223 len = strlen(entry->d_name);
224
Björn Stenberg761d6842002-07-16 14:40:27 +0000225 /* skip directories . and .. */
Björn Stenbergad7de312002-07-16 15:30:23 +0000226 if ((entry->attribute & ATTR_DIRECTORY) &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000227 (((len == 1) &&
228 (!strncmp(entry->d_name, ".", 1))) ||
229 ((len == 2) &&
230 (!strncmp(entry->d_name, "..", 2))))) {
Björn Stenberg361aaf62002-05-28 16:26:12 +0000231 i--;
232 continue;
233 }
Daniel Stenberg053d9042002-08-22 15:47:30 +0000234
Robert Hak91e26942002-09-06 04:59:23 +0000235 /* Skip FAT volume ID */
236 if (entry->attribute & ATTR_VOLUME_ID) {
237 i--;
238 continue;
239 }
240
Björn Stenberga7dcf912002-09-24 19:12:09 +0000241 /* filter out dotfiles and hidden files */
242 if (global_settings.dirfilter != SHOW_ALL &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000243 ((entry->d_name[0]=='.') ||
244 (entry->attribute & ATTR_HIDDEN))) {
245 i--;
246 continue;
247 }
248
Björn Stenbergad7de312002-07-16 15:30:23 +0000249 dptr->attr = entry->attribute;
Björn Stenberg761d6842002-07-16 14:40:27 +0000250
Dave Chapman8d129462002-08-28 13:58:19 +0000251 /* mark mp? and m3u files as such */
Björn Stenbergad7de312002-07-16 15:30:23 +0000252 if ( !(dptr->attr & ATTR_DIRECTORY) && (len > 4) ) {
Dave Chapman8d129462002-08-28 13:58:19 +0000253 if (!strcasecmp(&entry->d_name[len-4], ".mp3") ||
Dave Chapman4368a732002-08-28 14:03:55 +0000254 (!strcasecmp(&entry->d_name[len-4], ".mp2")) ||
255 (!strcasecmp(&entry->d_name[len-4], ".mpa")))
Dave Chapman8d129462002-08-28 13:58:19 +0000256 dptr->attr |= TREE_ATTR_MPA;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000257 else if (!strcasecmp(&entry->d_name[len-4], ".m3u"))
258 dptr->attr |= TREE_ATTR_M3U;
Björn Stenbergb7638222002-10-08 10:10:16 +0000259 else if (!strcasecmp(&entry->d_name[len-4], ".cfg"))
Björn Stenberg08181c72002-10-08 09:40:05 +0000260 dptr->attr |= TREE_ATTR_CFG;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000261 else if (!strcasecmp(&entry->d_name[len-4], ".wps"))
262 dptr->attr |= TREE_ATTR_WPS;
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000263 else if (!strcasecmp(&entry->d_name[len-4], ".txt"))
264 dptr->attr |= TREE_ATTR_TXT;
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000265 else if (!strcasecmp(&entry->d_name[len-4], ".lng"))
266 dptr->attr |= TREE_ATTR_LNG;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000267#ifdef HAVE_RECORDER_KEYPAD
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000268 else if (!strcasecmp(&entry->d_name[len-4], ".fnt"))
269 dptr->attr |= TREE_ATTR_FONT;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000270 else if (!strcasecmp(&entry->d_name[len-4], ".ajz"))
271#else
272 else if (!strcasecmp(&entry->d_name[len-4], ".mod"))
273#endif
274 dptr->attr |= TREE_ATTR_MOD;
Björn Stenberg24fdde02002-06-27 09:12:29 +0000275 }
276
Björn Stenberga7dcf912002-09-24 19:12:09 +0000277 /* filter out non-music files */
278 if ( global_settings.dirfilter == SHOW_MUSIC &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000279 (!(dptr->attr &
Dave Chapman8d129462002-08-28 13:58:19 +0000280 (ATTR_DIRECTORY|TREE_ATTR_MPA|TREE_ATTR_M3U))) ) {
Björn Stenbergad7de312002-07-16 15:30:23 +0000281 i--;
282 continue;
283 }
284
Björn Stenberga7dcf912002-09-24 19:12:09 +0000285 /* filter out non-supported files */
286 if ( global_settings.dirfilter == SHOW_SUPPORTED &&
287 (!(dptr->attr & TREE_ATTR_MASK)) ) {
288 i--;
289 continue;
290 }
291
292 if (len > NAME_BUFFER_SIZE - name_buffer_length - 1) {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000293 /* Tell the world that we ran out of buffer space */
294 dir_buffer_full = true;
295 break;
296 }
297 dptr->name = &name_buffer[name_buffer_length];
298 strcpy(dptr->name,entry->d_name);
299 name_buffer_length += len + 1;
Björn Stenberg361aaf62002-05-28 16:26:12 +0000300 }
301 filesindir = i;
302 closedir(dir);
303 strncpy(lastdir,path,sizeof(lastdir));
304 lastdir[sizeof(lastdir)-1] = 0;
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000305 qsort(dircache,filesindir,sizeof(struct entry),compare);
Björn Stenberge33d66a2002-08-12 22:52:19 +0000306
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000307 if ( dir_buffer_full || filesindir == MAX_FILES_IN_DIR ) {
Björn Stenberge33d66a2002-08-12 22:52:19 +0000308#ifdef HAVE_NEW_CHARCELL_LCD
309 lcd_double_height(false);
310#endif
311 lcd_clear_display();
Björn Stenberg505eca72002-09-18 14:08:05 +0000312 lcd_puts(0,0,str(LANG_SHOWDIR_ERROR_BUFFER));
313 lcd_puts(0,1,str(LANG_SHOWDIR_ERROR_FULL));
Björn Stenberge33d66a2002-08-12 22:52:19 +0000314 lcd_update();
315 sleep(HZ*2);
316 lcd_clear_display();
317 }
Björn Stenberg361aaf62002-05-28 16:26:12 +0000318 }
Björn Stenberg1d322652002-05-31 12:11:22 +0000319
Eric Linenbergecca1232002-09-09 14:25:39 +0000320 if (start == -1)
321 {
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000322 int diff_files;
323
Eric Linenbergecca1232002-09-09 14:25:39 +0000324 /* use lastfile to determine start (default=0) */
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000325 start = 0;
326
Eric Linenbergecca1232002-09-09 14:25:39 +0000327 for (i=0; i<filesindir; i++)
328 {
329 if (!strcasecmp(dircache[i].name, lastfile))
330 {
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000331 start = i;
Eric Linenbergecca1232002-09-09 14:25:39 +0000332 break;
333 }
334 }
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000335
336 diff_files = filesindir - start;
337 if (diff_files < tree_max_on_screen)
338 {
339 int oldstart = start;
340
341 start -= (tree_max_on_screen - diff_files);
342 if (start < 0)
343 start = 0;
344
345 dircursor = oldstart - start;
346 }
347
348 dirstart = start;
Eric Linenbergecca1232002-09-09 14:25:39 +0000349 }
350
Björn Stenberg3d762e92002-06-12 08:06:13 +0000351 lcd_stop_scroll();
Björn Stenberg39526922002-05-31 11:16:25 +0000352#ifdef HAVE_NEW_CHARCELL_LCD
353 lcd_double_height(false);
354#endif
Björn Stenberg361aaf62002-05-28 16:26:12 +0000355 lcd_clear_display();
Björn Stenberg82182852002-05-16 12:53:40 +0000356#ifdef HAVE_LCD_BITMAP
Björn Stenbergf385e362002-08-13 20:55:08 +0000357 lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and icon */
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000358 lcd_setfont(FONT_UI);
Björn Stenberg82182852002-05-16 12:53:40 +0000359#endif
360
Björn Stenbergcd225732002-08-11 09:17:47 +0000361 for ( i=start; i < start+tree_max_on_screen; i++ ) {
Björn Stenbergf03d6912002-05-29 08:18:46 +0000362 int len;
363
364 if ( i >= filesindir )
365 break;
366
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000367 len = strlen(dircache[i].name);
Björn Stenberg361aaf62002-05-28 16:26:12 +0000368
Björn Stenbergc521ed12002-09-03 09:44:08 +0000369 switch ( dircache[i].attr & TREE_ATTR_MASK ) {
370 case ATTR_DIRECTORY:
371 icon_type = Folder;
372 break;
Björn Stenbergf1bf9e72002-08-23 22:15:51 +0000373
Björn Stenbergc521ed12002-09-03 09:44:08 +0000374 case TREE_ATTR_M3U:
375 icon_type = Playlist;
376 break;
377
378 case TREE_ATTR_MPA:
379 icon_type = File;
380 break;
381
382 case TREE_ATTR_WPS:
383 icon_type = Wps;
384 break;
385
Björn Stenberg08181c72002-10-08 09:40:05 +0000386 case TREE_ATTR_CFG:
Björn Stenbergb7638222002-10-08 10:10:16 +0000387 icon_type = Config;
Justin Heinere4a27612002-09-05 01:20:10 +0000388 break;
Justin Heinere4a27612002-09-05 01:20:10 +0000389
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000390 case TREE_ATTR_TXT:
Björn Stenbergb7638222002-10-08 10:10:16 +0000391 icon_type = Text;
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000392 break;
393
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000394 case TREE_ATTR_LNG:
Björn Stenberg1715b272002-09-24 14:42:14 +0000395 icon_type = Language;
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000396 break;
397
Björn Stenbergc521ed12002-09-03 09:44:08 +0000398 case TREE_ATTR_MOD:
399 icon_type = Mod_Ajz;
400 break;
401
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000402#ifdef HAVE_LCD_BITMAP
403 case TREE_ATTR_FONT:
404 icon_type = Font;
405 break;
406#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +0000407 default:
408 icon_type = 0;
409 }
Björn Stenberg0ad20102002-09-03 20:47:23 +0000410
411 if (icon_type) {
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000412#ifdef HAVE_LCD_BITMAP
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000413 int offset=0;
414 if ( line_height > 8 )
415 offset = (line_height - 8) / 2;
Björn Stenbergf1bf9e72002-08-23 22:15:51 +0000416 lcd_bitmap(bitmap_icons_6x8[icon_type],
Björn Stenberg1a682be2002-09-02 12:46:32 +0000417 CURSOR_X * 6 + CURSOR_WIDTH,
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000418 MARGIN_Y+(i-start)*line_height + offset,
419 6, 8, true);
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000420#else
Justin Heiner4498b5e2002-09-03 16:37:12 +0000421 lcd_define_pattern((i-start)*8,tree_icons_5x7[icon_type],8);
422 lcd_putc(LINE_X-1, i-start, i-start);
Björn Stenberg361aaf62002-05-28 16:26:12 +0000423#endif
Björn Stenberg0ad20102002-09-03 20:47:23 +0000424 }
Björn Stenberg361aaf62002-05-28 16:26:12 +0000425
Björn Stenberga7dcf912002-09-24 19:12:09 +0000426 /* if music filter is on, cut off the extension */
427 if (global_settings.dirfilter == SHOW_MUSIC &&
Dave Chapman8d129462002-08-28 13:58:19 +0000428 (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
Björn Stenbergad7de312002-07-16 15:30:23 +0000429 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000430 char temp = dircache[i].name[len-4];
431 dircache[i].name[len-4] = 0;
Markus Braunc41dcb92002-08-20 19:39:55 +0000432 lcd_puts(LINE_X, i-start, dircache[i].name);
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000433 dircache[i].name[len-4] = temp;
Björn Stenbergad7de312002-07-16 15:30:23 +0000434 }
435 else
Markus Braunc41dcb92002-08-20 19:39:55 +0000436 lcd_puts(LINE_X, i-start, dircache[i].name);
Björn Stenberg82182852002-05-16 12:53:40 +0000437 }
438
Markus Braun000c2db2002-08-30 13:49:32 +0000439#ifdef HAVE_LCD_BITMAP
Björn Stenberg8fb73122002-09-24 19:41:23 +0000440 if (global_settings.scrollbar && filesindir > tree_max_on_screen)
Markus Braun000c2db2002-08-30 13:49:32 +0000441 scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1,
442 LCD_HEIGHT - SCROLLBAR_Y, filesindir, start,
443 start + tree_max_on_screen, VERTICAL);
444#endif
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000445 status_draw();
Björn Stenberg361aaf62002-05-28 16:26:12 +0000446 return filesindir;
Björn Stenberg82182852002-05-16 12:53:40 +0000447}
448
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000449bool ask_resume(void)
450{
Björn Stenberg1b057522002-08-20 20:27:36 +0000451#ifdef HAVE_NEW_CHARCELL_LCD
452 lcd_double_height(false);
453#endif
454
Björn Stenbergf2106062002-08-19 10:57:55 +0000455 /* always resume? */
456 if ( global_settings.resume == RESUME_ON )
457 return true;
458
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000459 lcd_clear_display();
Björn Stenberg505eca72002-09-18 14:08:05 +0000460 lcd_puts(0,0,str(LANG_RESUME_ASK));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000461#ifdef HAVE_LCD_CHARCELLS
Björn Stenberg505eca72002-09-18 14:08:05 +0000462 lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000463#else
Björn Stenberg505eca72002-09-18 14:08:05 +0000464 lcd_puts(0,1,str(LANG_RESUME_CONFIRM_RECORDER));
465 lcd_puts(0,2,str(LANG_RESUME_CANCEL_RECORDER));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000466#endif
467 lcd_update();
468 if (button_get(true) == BUTTON_PLAY)
469 return true;
470 return false;
471}
472
473void start_resume(void)
474{
475 if ( global_settings.resume &&
476 global_settings.resume_index != -1 ) {
477 int len = strlen(global_settings.resume_file);
478
479 DEBUGF("Resume file %s\n",global_settings.resume_file);
480 DEBUGF("Resume index %X offset %X\n",
481 global_settings.resume_index,
482 global_settings.resume_offset);
483 DEBUGF("Resume shuffle %s seed %X\n",
484 global_settings.playlist_shuffle?"on":"off",
485 global_settings.resume_seed);
486
487 /* playlist? */
488 if (!strcasecmp(&global_settings.resume_file[len-4], ".m3u")) {
489 char* slash;
490
491 /* check that the file exists */
492 int fd = open(global_settings.resume_file, O_RDONLY);
493 if(fd<0)
494 return;
495 close(fd);
496
497 if (!ask_resume())
498 return;
499
500 slash = strrchr(global_settings.resume_file,'/');
501 if (slash) {
502 *slash=0;
503 play_list(global_settings.resume_file,
504 slash+1,
505 global_settings.resume_index,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000506 true, /* the index is AFTER shuffle */
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000507 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000508 global_settings.resume_seed,
509 global_settings.resume_first_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000510 *slash='/';
511 }
512 else {
513 /* check that the dir exists */
514 DIR* dir = opendir(global_settings.resume_file);
515 if(!dir)
516 return;
517 closedir(dir);
518
519 if (!ask_resume())
520 return;
521
522 play_list("/",
523 global_settings.resume_file,
524 global_settings.resume_index,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000525 true,
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000526 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000527 global_settings.resume_seed,
528 global_settings.resume_first_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000529 }
530 }
531 else {
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000532 if (!ask_resume())
533 return;
534
535 if (showdir(global_settings.resume_file, 0) < 0 )
536 return;
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000537
538 lastdir[0] = '\0';
539
Björn Stenberg7113ec02002-08-16 15:23:57 +0000540 build_playlist(global_settings.resume_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000541 play_list(global_settings.resume_file,
542 NULL,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000543 global_settings.resume_index,
544 true,
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000545 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000546 global_settings.resume_seed,
547 global_settings.resume_first_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000548 }
549
550 status_set_playmode(STATUS_PLAY);
551 status_draw();
552 wps_show();
553 }
554}
555
Eric Linenbergecca1232002-09-09 14:25:39 +0000556void set_current_file(char *path)
557{
558 char *name;
559 unsigned int i;
560
561 /* separate directory from filename */
Hardeep Sidhuc2c8d1c2002-09-17 07:42:21 +0000562 name = strrchr(path+1,'/');
Eric Linenbergecca1232002-09-09 14:25:39 +0000563 if (name)
564 {
565 *name = 0;
566 strcpy(currdir, path);
567 *name = '/';
568 name++;
569 }
570 else
571 {
572 strcpy(currdir, "/");
573 name = path+1;
574 }
575
576 strcpy(lastfile, name);
577
578 dircursor = 0;
579 dirstart = -1;
580
581 if (strncmp(currdir,lastdir,sizeof(lastdir)))
582 {
583 dirlevel = 0;
584 dirpos[dirlevel] = -1;
585 cursorpos[dirlevel] = 0;
586
587 /* use '/' to calculate dirlevel */
588 for (i=1; i<strlen(path)+1; i++)
589 {
590 if (path[i] == '/')
591 {
592 dirlevel++;
593 dirpos[dirlevel] = -1;
594 cursorpos[dirlevel] = 0;
595 }
596 }
597 }
598}
599
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000600#ifdef HAVE_RECORDER_KEYPAD
601bool pageupdown(int* ds, int* dc, int numentries, int tree_max_on_screen )
602{
603 bool exit = false;
604 bool used = false;
605
606 int dirstart = *ds;
607 int dircursor = *dc;
608
609 while (!exit) {
610 switch (button_get(true)) {
611 case BUTTON_UP:
612 case BUTTON_ON | BUTTON_UP:
613 case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:
614 used = true;
615 if ( dirstart ) {
616 dirstart -= tree_max_on_screen;
617 if ( dirstart < 0 )
618 dirstart = 0;
619 }
620 else
621 dircursor = 0;
622 break;
623
624 case BUTTON_DOWN:
625 case BUTTON_ON | BUTTON_DOWN:
626 case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT:
627 used = true;
628 if ( dirstart < numentries - tree_max_on_screen ) {
629 dirstart += tree_max_on_screen;
630 if ( dirstart >
631 numentries - tree_max_on_screen )
632 dirstart = numentries - tree_max_on_screen;
633 }
634 else
635 dircursor = numentries - dirstart - 1;
636 break;
637
638#ifdef SIMULATOR
639 case BUTTON_ON:
640#else
641 case BUTTON_ON | BUTTON_REL:
642 case BUTTON_ON | BUTTON_UP | BUTTON_REL:
643 case BUTTON_ON | BUTTON_DOWN | BUTTON_REL:
644#endif
645 exit = true;
646 break;
647 }
648 if ( used ) {
649 showdir(currdir, dirstart);
650 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
651 lcd_update();
652 }
653 }
654 *ds = dirstart;
655 *dc = dircursor;
656
657 return used;
658}
659#endif
660
Björn Stenbergdea31222002-10-08 15:42:40 +0000661static void storefile(char* filename, char* setting, int maxlen)
662{
663 int len = strlen(filename);
664 int extlen = 0;
665 char* ptr = filename + len;
666
667 while (*ptr != '.') {
668 extlen++;
669 ptr--;
670 }
671
672 if (strcmp(ROCKBOX_DIR, currdir) || (len > maxlen-extlen))
673 return;
674
675 strncpy(setting, filename, len-extlen);
676 setting[len-extlen]=0;
677
678 settings_save();
679}
680
Björn Stenberg82182852002-05-16 12:53:40 +0000681bool dirbrowse(char *root)
682{
Björn Stenberg079b2d12002-08-08 12:06:38 +0000683 int numentries=0;
Linus Nielsen Feltzing8c57ad92002-07-15 22:46:38 +0000684 char buf[MAX_PATH];
Björn Stenberg82182852002-05-16 12:53:40 +0000685 int i;
Markus Braunde8fbf02002-08-07 10:35:26 +0000686 int lasti=-1;
Linus Nielsen Feltzingb3d0b6e2002-07-27 19:41:58 +0000687 int button;
Björn Stenbergcd225732002-08-11 09:17:47 +0000688 int tree_max_on_screen;
Björn Stenberg0ad20102002-09-03 20:47:23 +0000689 bool reload_root = false;
Björn Stenberga7dcf912002-09-24 19:12:09 +0000690 int lastfilter = global_settings.dirfilter;
Björn Stenberg0ad20102002-09-03 20:47:23 +0000691 bool lastsortcase = global_settings.sort_case;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000692#ifdef HAVE_LCD_BITMAP
693 int fw, fh;
Björn Stenberga4c3b032002-09-24 18:04:15 +0000694 lcd_getstringsize("A", &fw, &fh);
Markus Braunc41dcb92002-08-20 19:39:55 +0000695 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergcd225732002-08-11 09:17:47 +0000696#else
697 tree_max_on_screen = TREE_MAX_ON_SCREEN;
698#endif
Björn Stenberg82182852002-05-16 12:53:40 +0000699
Eric Linenbergecca1232002-09-09 14:25:39 +0000700 dircursor=0;
701 dirstart=0;
702 dirlevel=0;
703
Björn Stenberg82182852002-05-16 12:53:40 +0000704 memcpy(currdir,root,sizeof(currdir));
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000705
706 start_resume();
707 button_set_release(RELEASE_MASK);
Björn Stenberg46d2d382002-09-29 22:05:21 +0000708 button_set_repeat(~0);
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000709
710 numentries = showdir(currdir, dirstart);
Björn Stenberg82182852002-05-16 12:53:40 +0000711 if (numentries == -1)
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000712 return -1; /* currdir is not a directory */
Björn Stenberg82182852002-05-16 12:53:40 +0000713
Markus Braun000c2db2002-08-30 13:49:32 +0000714 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Björn Stenberg82182852002-05-16 12:53:40 +0000715
716 while(1) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000717 struct entry* file = &dircache[dircursor+dirstart];
Björn Stenberg1a682be2002-09-02 12:46:32 +0000718
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000719 bool restore = false;
Daniel Stenberg1a17d352002-06-18 11:22:48 +0000720
Markus Braunde8fbf02002-08-07 10:35:26 +0000721 button = button_get_w_tmo(HZ/5);
Linus Nielsen Feltzingf140b202002-07-27 20:55:39 +0000722 switch ( button ) {
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000723 case TREE_EXIT:
Björn Stenberg407bfb02002-09-01 14:49:56 +0000724 case TREE_EXIT | BUTTON_REPEAT:
Björn Stenberg82182852002-05-16 12:53:40 +0000725 i=strlen(currdir);
Björn Stenberge493efd2002-05-21 14:30:54 +0000726 if (i>1) {
Björn Stenberg82182852002-05-16 12:53:40 +0000727 while (currdir[i-1]!='/')
728 i--;
729 strcpy(buf,&currdir[i]);
730 if (i==1)
731 currdir[i]=0;
732 else
733 currdir[i-1]=0;
734
Björn Stenberg82182852002-05-16 12:53:40 +0000735 dirlevel--;
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000736 if ( dirlevel < MAX_DIR_LEVELS ) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000737 dirstart = dirpos[dirlevel];
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000738 dircursor = cursorpos[dirlevel];
739 }
Björn Stenberg82182852002-05-16 12:53:40 +0000740 else
Eric Linenbergecca1232002-09-09 14:25:39 +0000741 dirstart = dircursor = 0;
742
743 if (dirstart == -1)
744 strcpy(lastfile, buf);
745
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000746 restore = true;
Björn Stenberga10d9fa2002-05-27 14:55:40 +0000747 }
Björn Stenberg82182852002-05-16 12:53:40 +0000748 break;
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000749
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000750#ifdef HAVE_RECORDER_KEYPAD
751 case BUTTON_OFF:
752 mpeg_stop();
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000753 status_set_playmode(STATUS_STOP);
Markus Braunde8fbf02002-08-07 10:35:26 +0000754 status_draw();
755 restore = true;
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000756 break;
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000757
758 case BUTTON_OFF | BUTTON_REL:
759#else
760 case BUTTON_STOP | BUTTON_REL:
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000761#endif
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000762 global_settings.resume_index = -1;
763 settings_save();
764 break;
765
Björn Stenberg82182852002-05-16 12:53:40 +0000766
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000767 case TREE_ENTER:
Björn Stenberg407bfb02002-09-01 14:49:56 +0000768 case TREE_ENTER | BUTTON_REPEAT:
Björn Stenbergc00557a2002-06-25 11:10:24 +0000769#ifdef HAVE_RECORDER_KEYPAD
770 case BUTTON_PLAY:
Björn Stenberg1a682be2002-09-02 12:46:32 +0000771 case BUTTON_PLAY | BUTTON_REPEAT:
Björn Stenbergc00557a2002-06-25 11:10:24 +0000772#endif
Björn Stenberg8b1aba82002-06-19 20:10:58 +0000773 if ( !numentries )
774 break;
Björn Stenberg82182852002-05-16 12:53:40 +0000775 if ((currdir[0]=='/') && (currdir[1]==0)) {
Björn Stenberg1a682be2002-09-02 12:46:32 +0000776 snprintf(buf,sizeof(buf),"%s%s",currdir, file->name);
Björn Stenberg82182852002-05-16 12:53:40 +0000777 } else {
Björn Stenberg1a682be2002-09-02 12:46:32 +0000778 snprintf(buf,sizeof(buf),"%s/%s",currdir, file->name);
Björn Stenberg82182852002-05-16 12:53:40 +0000779 }
780
Björn Stenberg1a682be2002-09-02 12:46:32 +0000781 if (file->attr & ATTR_DIRECTORY) {
Björn Stenberg82182852002-05-16 12:53:40 +0000782 memcpy(currdir,buf,sizeof(currdir));
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000783 if ( dirlevel < MAX_DIR_LEVELS ) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000784 dirpos[dirlevel] = dirstart;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000785 cursorpos[dirlevel] = dircursor;
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000786 }
Björn Stenberg82182852002-05-16 12:53:40 +0000787 dirlevel++;
788 dircursor=0;
Eric Linenbergecca1232002-09-09 14:25:39 +0000789 dirstart=0;
Björn Stenberg82182852002-05-16 12:53:40 +0000790 } else {
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000791 int seed = current_tick;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000792 bool play = false;
793 int start_index=0;
Björn Stenbergdea31222002-10-08 15:42:40 +0000794
Björn Stenberg42770ea2002-06-10 13:24:27 +0000795 lcd_stop_scroll();
Björn Stenbergc521ed12002-09-03 09:44:08 +0000796 switch ( file->attr & TREE_ATTR_MASK ) {
797 case TREE_ATTR_M3U:
798 if ( global_settings.resume )
799 snprintf(global_settings.resume_file,
800 MAX_PATH, "%s/%s",
801 currdir, file->name);
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000802 play_list(currdir, file->name, 0, false, 0,
803 seed, 0);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000804 start_index = 0;
805 play = true;
806 break;
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000807
Björn Stenbergc521ed12002-09-03 09:44:08 +0000808 case TREE_ATTR_MPA:
809 if ( global_settings.resume )
810 strncpy(global_settings.resume_file,
811 currdir, MAX_PATH);
Eric Linenbergecca1232002-09-09 14:25:39 +0000812 start_index = build_playlist(dircursor+dirstart);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000813
814 /* it is important that we get back the index in
815 the (shuffled) list and stor that */
816 start_index = play_list(currdir, NULL,
817 start_index, false,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000818 0, seed, 0);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000819 play = true;
820 break;
821
822 /* wps config file */
823 case TREE_ATTR_WPS:
Björn Stenberg1a682be2002-09-02 12:46:32 +0000824 snprintf(buf, sizeof buf, "%s/%s",
825 currdir, file->name);
Björn Stenbergdea31222002-10-08 15:42:40 +0000826 wps_load(buf,true);
827 storefile(file->name, global_settings.wps_file,
828 MAX_FILENAME);
Björn Stenberg1a682be2002-09-02 12:46:32 +0000829 restore = true;
830 break;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000831
Björn Stenberg08181c72002-10-08 09:40:05 +0000832 case TREE_ATTR_CFG:
Justin Heinere4a27612002-09-05 01:20:10 +0000833 snprintf(buf, sizeof buf, "%s/%s",
834 currdir, file->name);
Björn Stenberg08181c72002-10-08 09:40:05 +0000835 settings_load_config(buf);
Justin Heinere4a27612002-09-05 01:20:10 +0000836 restore = true;
837 break;
Justin Heinere4a27612002-09-05 01:20:10 +0000838
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000839 case TREE_ATTR_TXT:
840 snprintf(buf, sizeof buf, "%s/%s",
841 currdir, file->name);
842 viewer_run(buf);
843 restore = true;
844 break;
845
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000846 case TREE_ATTR_LNG:
847 snprintf(buf, sizeof buf, "%s/%s",
848 currdir, file->name);
Daniel Stenberg85305da2002-09-24 13:37:38 +0000849 if(!lang_load(buf)) {
Björn Stenbergdea31222002-10-08 15:42:40 +0000850 storefile(file->name,
851 global_settings.lang_file,
852 MAX_FILENAME);
853
Daniel Stenberg85305da2002-09-24 13:37:38 +0000854 lcd_clear_display();
855#ifdef HAVE_LCD_CHARCELLS
856 lcd_puts(0, 0, str(LANG_LANGUAGE_LOADED));
857#else
858 lcd_getstringsize(str(LANG_LANGUAGE_LOADED),
Björn Stenberga4c3b032002-09-24 18:04:15 +0000859 &fw, &fh);
Daniel Stenberg85305da2002-09-24 13:37:38 +0000860 if(fw>LCD_WIDTH)
861 fw=0;
862 else
863 fw=LCD_WIDTH/2 - fw/2;
864
Björn Stenberga4c3b032002-09-24 18:04:15 +0000865 lcd_putsxy(fw, LCD_HEIGHT/2 - fh/2,
866 str(LANG_LANGUAGE_LOADED));
Daniel Stenberg85305da2002-09-24 13:37:38 +0000867#endif
868 lcd_update();
869 sleep(HZ);
870 restore = true;
871 }
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000872 break;
873
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000874#ifdef HAVE_LCD_BITMAP
875 case TREE_ATTR_FONT:
876 snprintf(buf, sizeof buf, "%s/%s",
877 currdir, file->name);
878 font_load(buf);
Björn Stenbergdea31222002-10-08 15:42:40 +0000879 storefile(file->name, global_settings.font_file,
880 MAX_FILENAME);
881
Björn Stenberga4c3b032002-09-24 18:04:15 +0000882 lcd_getstringsize("A", &fw, &fh);
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000883 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
884 /* make sure cursor is on screen */
885 while ( dircursor > tree_max_on_screen ) {
886 dircursor--;
887 dirstart++;
888 }
889 restore = true;
890 break;
891#endif
892
Björn Stenbergc521ed12002-09-03 09:44:08 +0000893#ifndef SIMULATOR
894 /* firmware file */
895 case TREE_ATTR_MOD:
896 snprintf(buf, sizeof buf, "%s/%s",
897 currdir, file->name);
898 rolo_load(buf);
Björn Stenberg1a682be2002-09-02 12:46:32 +0000899 break;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000900#endif
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000901 }
902
Björn Stenbergc521ed12002-09-03 09:44:08 +0000903 if ( play ) {
904 if ( global_settings.resume ) {
905 /* the resume_index must always be the index in the
906 shuffled list in case shuffle is enabled */
907 global_settings.resume_index = start_index;
908 global_settings.resume_offset = 0;
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000909 global_settings.resume_first_index = start_index;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000910 global_settings.resume_seed = seed;
911 settings_save();
912 }
913
914 status_set_playmode(STATUS_PLAY);
915 status_draw();
916 lcd_stop_scroll();
Björn Stenberg0ad20102002-09-03 20:47:23 +0000917 if ( wps_show() == SYS_USB_CONNECTED ) {
918 reload_root = true;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000919 global_settings.resume_index = -1;
920 }
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000921#ifdef HAVE_LCD_BITMAP
Björn Stenbergc521ed12002-09-03 09:44:08 +0000922 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Markus Braun000c2db2002-08-30 13:49:32 +0000923#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +0000924 }
Björn Stenberg82182852002-05-16 12:53:40 +0000925 }
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000926 restore = true;
Björn Stenberg82182852002-05-16 12:53:40 +0000927 break;
Eric Linenberg9e91b952002-08-06 18:11:00 +0000928
Eric Linenberg9e91b952002-08-06 18:11:00 +0000929 case TREE_PREV:
Björn Stenbergc1d9b152002-08-07 20:51:37 +0000930 case TREE_PREV | BUTTON_REPEAT:
Björn Stenberg6752ee42002-08-12 18:28:51 +0000931 case BUTTON_VOL_UP:
Eric Linenberg9e91b952002-08-06 18:11:00 +0000932 if(filesindir) {
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000933 if(dircursor) {
Markus Braun000c2db2002-08-30 13:49:32 +0000934 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, false);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000935 dircursor--;
Markus Braun000c2db2002-08-30 13:49:32 +0000936 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000937 }
938 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000939 if (dirstart) {
940 dirstart--;
941 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000942 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000943 }
944 else {
Björn Stenbergcd225732002-08-11 09:17:47 +0000945 if (numentries < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +0000946 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000947 false);
948 dircursor = numentries - 1;
Markus Braun000c2db2002-08-30 13:49:32 +0000949 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000950 true);
951 }
952 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000953 dirstart = numentries - tree_max_on_screen;
Björn Stenbergcd225732002-08-11 09:17:47 +0000954 dircursor = tree_max_on_screen - 1;
Eric Linenbergecca1232002-09-09 14:25:39 +0000955 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000956 put_cursorxy(CURSOR_X, CURSOR_Y +
Björn Stenbergcd225732002-08-11 09:17:47 +0000957 tree_max_on_screen - 1, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000958 }
959 }
960 }
961 lcd_update();
962 }
Björn Stenberg82182852002-05-16 12:53:40 +0000963 break;
Björn Stenberg244688e2002-05-16 14:48:40 +0000964
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000965 case TREE_NEXT:
Björn Stenbergc1d9b152002-08-07 20:51:37 +0000966 case TREE_NEXT | BUTTON_REPEAT:
Björn Stenberg6752ee42002-08-12 18:28:51 +0000967 case BUTTON_VOL_DOWN:
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000968 if(filesindir)
969 {
Eric Linenbergecca1232002-09-09 14:25:39 +0000970 if (dircursor + dirstart + 1 < numentries ) {
Björn Stenbergcd225732002-08-11 09:17:47 +0000971 if(dircursor+1 < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +0000972 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000973 false);
974 dircursor++;
Markus Braun000c2db2002-08-30 13:49:32 +0000975 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000976 }
977 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000978 dirstart++;
979 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000980 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000981 }
982 }
983 else {
Björn Stenbergcd225732002-08-11 09:17:47 +0000984 if(numentries < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +0000985 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000986 false);
Eric Linenbergecca1232002-09-09 14:25:39 +0000987 dirstart = dircursor = 0;
Markus Braun000c2db2002-08-30 13:49:32 +0000988 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000989 }
990 else {
Eric Linenbergecca1232002-09-09 14:25:39 +0000991 dirstart = dircursor = 0;
992 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +0000993 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000994 }
995 }
996 lcd_update();
997 }
Björn Stenberg82182852002-05-16 12:53:40 +0000998 break;
Björn Stenberge493efd2002-05-21 14:30:54 +0000999
Björn Stenberg0ad20102002-09-03 20:47:23 +00001000 case TREE_MENU:
Björn Stenberg42770ea2002-06-10 13:24:27 +00001001 lcd_stop_scroll();
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001002 if (main_menu())
1003 reload_root = true;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001004 restore = true;
Björn Stenberge493efd2002-05-21 14:30:54 +00001005 break;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001006
1007 case BUTTON_ON:
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001008#ifdef HAVE_RECORDER_KEYPAD
1009 if (pageupdown(&dirstart, &dircursor, numentries,
1010 tree_max_on_screen))
Linus Nielsen Feltzing8abcf1b2002-08-07 06:04:24 +00001011 {
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001012 /* start scroll */
Björn Stenberg34d1e1b2002-06-27 01:20:08 +00001013 restore = true;
1014 }
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001015 else
1016#endif
1017 {
1018 if (mpeg_status() & MPEG_STATUS_PLAY)
1019 {
1020 lcd_stop_scroll();
1021 if (wps_show() == SYS_USB_CONNECTED)
1022 reload_root = true;
1023#ifdef HAVE_LCD_BITMAP
1024 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
1025#endif
1026 restore = true;
1027 }
1028 }
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001029 break;
Linus Nielsen Feltzingda501ee2002-06-30 16:27:39 +00001030
Markus Braunde8fbf02002-08-07 10:35:26 +00001031#ifdef HAVE_RECORDER_KEYPAD
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001032 case BUTTON_F2:
Björn Stenberg0ad20102002-09-03 20:47:23 +00001033 if (f2_screen())
1034 reload_root = true;
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001035 restore = true;
1036 break;
1037
1038 case BUTTON_F3:
Björn Stenberg0ad20102002-09-03 20:47:23 +00001039 if (f3_screen())
1040 reload_root = true;
Daniel Stenberg93b231c2002-09-12 13:33:59 +00001041
1042#ifdef HAVE_LCD_BITMAP
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001043 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001044#endif
1045 restore = true;
Markus Braunde8fbf02002-08-07 10:35:26 +00001046 break;
Markus Braunc41dcb92002-08-20 19:39:55 +00001047#endif
Markus Braunde8fbf02002-08-07 10:35:26 +00001048
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001049 case SYS_USB_CONNECTED:
1050 usb_screen();
Björn Stenberg0ad20102002-09-03 20:47:23 +00001051 reload_root = true;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001052 break;
Björn Stenberg82182852002-05-16 12:53:40 +00001053 }
Björn Stenberg42770ea2002-06-10 13:24:27 +00001054
Björn Stenberg457b8a02002-08-26 13:21:14 +00001055 if ( button )
1056 ata_spin();
1057
Björn Stenberg0ad20102002-09-03 20:47:23 +00001058 /* do we need to rescan dir? */
1059 if (reload_root ||
Björn Stenberga7dcf912002-09-24 19:12:09 +00001060 lastfilter != global_settings.dirfilter ||
1061 lastsortcase != global_settings.sort_case)
Björn Stenberg0ad20102002-09-03 20:47:23 +00001062 {
1063 if ( reload_root ) {
1064 strcpy(currdir, "/");
1065 dirlevel = 0;
1066 reload_root = false;
1067 }
1068 dircursor = 0;
Eric Linenbergecca1232002-09-09 14:25:39 +00001069 dirstart = 0;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001070 lastdir[0] = 0;
Björn Stenberga7dcf912002-09-24 19:12:09 +00001071 lastfilter = global_settings.dirfilter;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001072 lastsortcase = global_settings.sort_case;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001073 restore = true;
1074 }
1075
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001076 if ( restore ) {
1077 /* restore display */
Linus Nielsen Feltzinge10fc4c2002-08-08 10:46:10 +00001078 /* We need to adjust if the number of lines on screen have
1079 changed because of a status bar change */
Björn Stenbergcd225732002-08-11 09:17:47 +00001080 if(CURSOR_Y+LINE_Y+dircursor>tree_max_on_screen) {
Eric Linenbergecca1232002-09-09 14:25:39 +00001081 dirstart++;
Linus Nielsen Feltzinge10fc4c2002-08-08 10:46:10 +00001082 dircursor--;
1083 }
Daniel Stenberg773e7a72002-09-30 19:05:03 +00001084#ifdef HAVE_LCD_BITMAP
1085 /* the sub-screen might've ruined the margins */
1086 lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and
1087 icon */
1088#endif
Eric Linenbergecca1232002-09-09 14:25:39 +00001089 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001090 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001091 }
Björn Stenberg42770ea2002-06-10 13:24:27 +00001092
Markus Braunde8fbf02002-08-07 10:35:26 +00001093 if ( numentries ) {
Eric Linenbergecca1232002-09-09 14:25:39 +00001094 i = dirstart+dircursor;
Markus Braunde8fbf02002-08-07 10:35:26 +00001095
1096 /* if MP3 filter is on, cut off the extension */
1097 if(lasti!=i || restore) {
1098 lasti=i;
1099 lcd_stop_scroll();
Björn Stenberga7dcf912002-09-24 19:12:09 +00001100 if (global_settings.dirfilter == SHOW_MUSIC &&
1101 (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
Markus Braunde8fbf02002-08-07 10:35:26 +00001102 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +00001103 int len = strlen(dircache[i].name);
1104 char temp = dircache[i].name[len-4];
1105 dircache[i].name[len-4] = 0;
Björn Stenberga7dcf912002-09-24 19:12:09 +00001106 lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +00001107 dircache[i].name[len-4] = temp;
Markus Braunde8fbf02002-08-07 10:35:26 +00001108 }
1109 else
Björn Stenberga7dcf912002-09-24 19:12:09 +00001110 lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
Markus Braunde8fbf02002-08-07 10:35:26 +00001111 }
1112 }
1113 status_draw();
1114 lcd_update();
Björn Stenberg82182852002-05-16 12:53:40 +00001115 }
1116
1117 return false;
1118}
Daniel Stenberga007ebf2002-09-24 12:40:52 +00001119
1120/* -----------------------------------------------------------------
1121 * local variables:
1122 * eval: (load-file "../firmware/rockbox-mode.el")
1123 * end:
1124 */