blob: 24ac1f5555723fb9485a90329692e22afbe5feea [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 Stenbergcaebdd42003-01-15 14:52:53 +000052#include "keyboard.h"
Björn Stenberg82182852002-05-16 12:53:40 +000053
54#ifdef HAVE_LCD_BITMAP
Markus Braun000c2db2002-08-30 13:49:32 +000055#include "widgets.h"
Björn Stenberg82182852002-05-16 12:53:40 +000056#endif
57
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +000058#define NAME_BUFFER_SIZE (AVERAGE_FILENAME_LENGTH * MAX_FILES_IN_DIR)
Björn Stenberg82182852002-05-16 12:53:40 +000059
Björn Stenbergc3fd67c2002-12-18 14:57:45 +000060static char name_buffer[NAME_BUFFER_SIZE];
61static int name_buffer_length;
Björn Stenberg82182852002-05-16 12:53:40 +000062struct entry {
Björn Stenbergc521ed12002-09-03 09:44:08 +000063 short attr; /* FAT attributes + file type flags */
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +000064 char *name;
Björn Stenberg82182852002-05-16 12:53:40 +000065};
66
Björn Stenberg1fc4fee2002-05-30 14:01:36 +000067static struct entry dircache[MAX_FILES_IN_DIR];
Eric Linenbergecca1232002-09-09 14:25:39 +000068static int dircursor;
69static int dirstart;
70static int dirlevel;
Björn Stenberg361aaf62002-05-28 16:26:12 +000071static int filesindir;
Eric Linenbergecca1232002-09-09 14:25:39 +000072static int dirpos[MAX_DIR_LEVELS];
73static int cursorpos[MAX_DIR_LEVELS];
74static char lastdir[MAX_PATH];
75static char lastfile[MAX_PATH];
76static char currdir[MAX_PATH];
Björn Stenbergcaebdd42003-01-15 14:52:53 +000077static bool reload_dir = false;
Björn Stenberg361aaf62002-05-28 16:26:12 +000078
Björn Stenberg82182852002-05-16 12:53:40 +000079void browse_root(void)
80{
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +000081 dirbrowse("/");
Björn Stenberg82182852002-05-16 12:53:40 +000082}
83
84
85#ifdef HAVE_LCD_BITMAP
86
Björn Stenberg8fb73122002-09-24 19:41:23 +000087/* pixel margins */
88#define MARGIN_X (global_settings.scrollbar && \
89 filesindir > tree_max_on_screen ? SCROLLBAR_WIDTH : 0) + \
90 CURSOR_WIDTH + ICON_WIDTH
91#define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0)
Markus Braun000c2db2002-08-30 13:49:32 +000092
Björn Stenberg8fb73122002-09-24 19:41:23 +000093/* position the entry-list starts at */
94#define LINE_X 0
95#define LINE_Y (global_settings.statusbar ? 1 : 0)
Daniel Stenbergbf603f92002-06-14 08:47:44 +000096
Björn Stenberg8fb73122002-09-24 19:41:23 +000097#define CURSOR_X (global_settings.scrollbar && \
98 filesindir > tree_max_on_screen ? 1 : 0)
99#define CURSOR_Y 0 /* the cursor is not positioned in regard to
100 the margins, so this is the amount of lines
101 we add to the cursor Y position to position
102 it on a line */
Markus Braun000c2db2002-08-30 13:49:32 +0000103#define CURSOR_WIDTH 4
104
105#define ICON_WIDTH 6
106
107#define SCROLLBAR_X 0
108#define SCROLLBAR_Y lcd_getymargin()
109#define SCROLLBAR_WIDTH 6
Björn Stenberg82182852002-05-16 12:53:40 +0000110
111extern unsigned char bitmap_icons_6x8[LastIcon][6];
Björn Stenberg82182852002-05-16 12:53:40 +0000112
113#else /* HAVE_LCD_BITMAP */
114
115#define TREE_MAX_ON_SCREEN 2
116#define TREE_MAX_LEN_DISPLAY 11 /* max length that fits on screen */
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000117#define LINE_X 2 /* X position the entry-list starts at */
Markus Braun000c2db2002-08-30 13:49:32 +0000118#define LINE_Y 0 /* Y position the entry-list starts at */
Björn Stenberg82182852002-05-16 12:53:40 +0000119
Markus Braun000c2db2002-08-30 13:49:32 +0000120#define CURSOR_X 0
Daniel Stenbergbf603f92002-06-14 08:47:44 +0000121#define CURSOR_Y 0 /* not really used for players */
Björn Stenberg9314a682002-05-31 09:04:51 +0000122
Björn Stenberg82182852002-05-16 12:53:40 +0000123#endif /* HAVE_LCD_BITMAP */
124
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000125#ifdef HAVE_RECORDER_KEYPAD
126#define TREE_NEXT BUTTON_DOWN
127#define TREE_PREV BUTTON_UP
128#define TREE_EXIT BUTTON_LEFT
129#define TREE_ENTER BUTTON_RIGHT
130#define TREE_MENU BUTTON_F1
131#else
132#define TREE_NEXT BUTTON_RIGHT
133#define TREE_PREV BUTTON_LEFT
134#define TREE_EXIT BUTTON_STOP
135#define TREE_ENTER BUTTON_PLAY
136#define TREE_MENU BUTTON_MENU
137#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 */
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000208 if (strncmp(path,lastdir,sizeof(lastdir)) || reload_dir) {
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") ||
Robert Hak657a2f32002-12-02 04:46:19 +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
Robert Hak0789d422002-11-30 09:42:13 +0000277 /* filter out all non-playlist files */
278 if ( global_settings.dirfilter == SHOW_PLAYLIST &&
279 (!(dptr->attr &
280 (ATTR_DIRECTORY|TREE_ATTR_M3U))) ) {
281 i--;
282 continue;
283 }
284
Björn Stenberga7dcf912002-09-24 19:12:09 +0000285 /* filter out non-music files */
286 if ( global_settings.dirfilter == SHOW_MUSIC &&
Daniel Stenberg053d9042002-08-22 15:47:30 +0000287 (!(dptr->attr &
Dave Chapman8d129462002-08-28 13:58:19 +0000288 (ATTR_DIRECTORY|TREE_ATTR_MPA|TREE_ATTR_M3U))) ) {
Björn Stenbergad7de312002-07-16 15:30:23 +0000289 i--;
290 continue;
291 }
292
Björn Stenberga7dcf912002-09-24 19:12:09 +0000293 /* filter out non-supported files */
294 if ( global_settings.dirfilter == SHOW_SUPPORTED &&
295 (!(dptr->attr & TREE_ATTR_MASK)) ) {
296 i--;
297 continue;
298 }
299
300 if (len > NAME_BUFFER_SIZE - name_buffer_length - 1) {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000301 /* Tell the world that we ran out of buffer space */
302 dir_buffer_full = true;
303 break;
304 }
305 dptr->name = &name_buffer[name_buffer_length];
306 strcpy(dptr->name,entry->d_name);
307 name_buffer_length += len + 1;
Björn Stenberg361aaf62002-05-28 16:26:12 +0000308 }
309 filesindir = i;
310 closedir(dir);
311 strncpy(lastdir,path,sizeof(lastdir));
312 lastdir[sizeof(lastdir)-1] = 0;
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000313 qsort(dircache,filesindir,sizeof(struct entry),compare);
Björn Stenberge33d66a2002-08-12 22:52:19 +0000314
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000315 if ( dir_buffer_full || filesindir == MAX_FILES_IN_DIR ) {
Linus Nielsen Feltzing0a4b2472002-10-15 12:25:57 +0000316#ifdef HAVE_LCD_CHARCELLS
Björn Stenberge33d66a2002-08-12 22:52:19 +0000317 lcd_double_height(false);
318#endif
319 lcd_clear_display();
Björn Stenberg505eca72002-09-18 14:08:05 +0000320 lcd_puts(0,0,str(LANG_SHOWDIR_ERROR_BUFFER));
321 lcd_puts(0,1,str(LANG_SHOWDIR_ERROR_FULL));
Björn Stenberge33d66a2002-08-12 22:52:19 +0000322 lcd_update();
323 sleep(HZ*2);
324 lcd_clear_display();
325 }
Björn Stenberg361aaf62002-05-28 16:26:12 +0000326 }
Björn Stenberg1d322652002-05-31 12:11:22 +0000327
Eric Linenbergecca1232002-09-09 14:25:39 +0000328 if (start == -1)
329 {
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000330 int diff_files;
331
Eric Linenbergecca1232002-09-09 14:25:39 +0000332 /* use lastfile to determine start (default=0) */
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000333 start = 0;
334
Eric Linenbergecca1232002-09-09 14:25:39 +0000335 for (i=0; i<filesindir; i++)
336 {
337 if (!strcasecmp(dircache[i].name, lastfile))
338 {
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000339 start = i;
Eric Linenbergecca1232002-09-09 14:25:39 +0000340 break;
341 }
342 }
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000343
344 diff_files = filesindir - start;
345 if (diff_files < tree_max_on_screen)
346 {
347 int oldstart = start;
348
349 start -= (tree_max_on_screen - diff_files);
350 if (start < 0)
351 start = 0;
352
353 dircursor = oldstart - start;
354 }
355
356 dirstart = start;
Eric Linenbergecca1232002-09-09 14:25:39 +0000357 }
358
Björn Stenberg3d762e92002-06-12 08:06:13 +0000359 lcd_stop_scroll();
Linus Nielsen Feltzing0a4b2472002-10-15 12:25:57 +0000360#ifdef HAVE_LCD_CHARCELLS
Björn Stenberg39526922002-05-31 11:16:25 +0000361 lcd_double_height(false);
362#endif
Björn Stenberg361aaf62002-05-28 16:26:12 +0000363 lcd_clear_display();
Björn Stenberg82182852002-05-16 12:53:40 +0000364#ifdef HAVE_LCD_BITMAP
Björn Stenbergf385e362002-08-13 20:55:08 +0000365 lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and icon */
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000366 lcd_setfont(FONT_UI);
Björn Stenberg82182852002-05-16 12:53:40 +0000367#endif
368
Björn Stenbergcd225732002-08-11 09:17:47 +0000369 for ( i=start; i < start+tree_max_on_screen; i++ ) {
Björn Stenbergf03d6912002-05-29 08:18:46 +0000370 int len;
371
372 if ( i >= filesindir )
373 break;
374
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000375 len = strlen(dircache[i].name);
Björn Stenberg361aaf62002-05-28 16:26:12 +0000376
Björn Stenbergc521ed12002-09-03 09:44:08 +0000377 switch ( dircache[i].attr & TREE_ATTR_MASK ) {
378 case ATTR_DIRECTORY:
379 icon_type = Folder;
380 break;
Björn Stenbergf1bf9e72002-08-23 22:15:51 +0000381
Björn Stenbergc521ed12002-09-03 09:44:08 +0000382 case TREE_ATTR_M3U:
383 icon_type = Playlist;
384 break;
385
386 case TREE_ATTR_MPA:
387 icon_type = File;
388 break;
389
390 case TREE_ATTR_WPS:
391 icon_type = Wps;
392 break;
393
Björn Stenberg08181c72002-10-08 09:40:05 +0000394 case TREE_ATTR_CFG:
Björn Stenbergb7638222002-10-08 10:10:16 +0000395 icon_type = Config;
Justin Heinere4a27612002-09-05 01:20:10 +0000396 break;
Justin Heinere4a27612002-09-05 01:20:10 +0000397
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000398 case TREE_ATTR_TXT:
Björn Stenbergb7638222002-10-08 10:10:16 +0000399 icon_type = Text;
Daniel Stenberg773e7a72002-09-30 19:05:03 +0000400 break;
401
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000402 case TREE_ATTR_LNG:
Björn Stenberg1715b272002-09-24 14:42:14 +0000403 icon_type = Language;
Daniel Stenberga007ebf2002-09-24 12:40:52 +0000404 break;
405
Björn Stenbergc521ed12002-09-03 09:44:08 +0000406 case TREE_ATTR_MOD:
407 icon_type = Mod_Ajz;
408 break;
409
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000410#ifdef HAVE_LCD_BITMAP
411 case TREE_ATTR_FONT:
412 icon_type = Font;
413 break;
414#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +0000415 default:
Kjell Ericsonc11b90f2003-01-10 09:55:50 +0000416#ifdef HAVE_LCD_BITMAP
Björn Stenbergc521ed12002-09-03 09:44:08 +0000417 icon_type = 0;
Kjell Ericsonc11b90f2003-01-10 09:55:50 +0000418#else
419 icon_type = Unknown;
420#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +0000421 }
Björn Stenberg0ad20102002-09-03 20:47:23 +0000422
423 if (icon_type) {
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000424#ifdef HAVE_LCD_BITMAP
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000425 int offset=0;
426 if ( line_height > 8 )
427 offset = (line_height - 8) / 2;
Björn Stenbergf1bf9e72002-08-23 22:15:51 +0000428 lcd_bitmap(bitmap_icons_6x8[icon_type],
Björn Stenberg1a682be2002-09-02 12:46:32 +0000429 CURSOR_X * 6 + CURSOR_WIDTH,
Björn Stenbergbed3d3f2002-09-20 08:07:51 +0000430 MARGIN_Y+(i-start)*line_height + offset,
431 6, 8, true);
Linus Nielsen Feltzing10452d22002-09-03 07:53:51 +0000432#else
Kjell Ericsonc11b90f2003-01-10 09:55:50 +0000433 lcd_putc(LINE_X-1, i-start, icon_type);
Björn Stenberg361aaf62002-05-28 16:26:12 +0000434#endif
Björn Stenberg0ad20102002-09-03 20:47:23 +0000435 }
Björn Stenberg361aaf62002-05-28 16:26:12 +0000436
Björn Stenberga7dcf912002-09-24 19:12:09 +0000437 /* if music filter is on, cut off the extension */
438 if (global_settings.dirfilter == SHOW_MUSIC &&
Dave Chapman8d129462002-08-28 13:58:19 +0000439 (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
Björn Stenbergad7de312002-07-16 15:30:23 +0000440 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000441 char temp = dircache[i].name[len-4];
442 dircache[i].name[len-4] = 0;
Markus Braunc41dcb92002-08-20 19:39:55 +0000443 lcd_puts(LINE_X, i-start, dircache[i].name);
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +0000444 dircache[i].name[len-4] = temp;
Björn Stenbergad7de312002-07-16 15:30:23 +0000445 }
446 else
Markus Braunc41dcb92002-08-20 19:39:55 +0000447 lcd_puts(LINE_X, i-start, dircache[i].name);
Björn Stenberg82182852002-05-16 12:53:40 +0000448 }
449
Markus Braun000c2db2002-08-30 13:49:32 +0000450#ifdef HAVE_LCD_BITMAP
Björn Stenberg8fb73122002-09-24 19:41:23 +0000451 if (global_settings.scrollbar && filesindir > tree_max_on_screen)
Markus Braun000c2db2002-08-30 13:49:32 +0000452 scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1,
453 LCD_HEIGHT - SCROLLBAR_Y, filesindir, start,
454 start + tree_max_on_screen, VERTICAL);
455#endif
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000456 status_draw();
Björn Stenberg361aaf62002-05-28 16:26:12 +0000457 return filesindir;
Björn Stenberg82182852002-05-16 12:53:40 +0000458}
459
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000460bool ask_resume(void)
461{
Linus Nielsen Feltzing0a4b2472002-10-15 12:25:57 +0000462#ifdef HAVE_LCD_CHARCELLS
Björn Stenberg1b057522002-08-20 20:27:36 +0000463 lcd_double_height(false);
464#endif
465
Björn Stenbergf2106062002-08-19 10:57:55 +0000466 /* always resume? */
467 if ( global_settings.resume == RESUME_ON )
468 return true;
469
Robert Hakc88751f2002-10-16 07:25:33 +0000470 if ( global_settings.resume == RESUME_ASK_ONCE) {
471 global_settings.resume_index = -1;
472 settings_save();
473 }
474
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000475 lcd_clear_display();
Björn Stenberg505eca72002-09-18 14:08:05 +0000476 lcd_puts(0,0,str(LANG_RESUME_ASK));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000477#ifdef HAVE_LCD_CHARCELLS
Mats Lidellbce50322003-01-10 16:12:50 +0000478 status_draw();
Björn Stenberg505eca72002-09-18 14:08:05 +0000479 lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000480#else
Björn Stenberg505eca72002-09-18 14:08:05 +0000481 lcd_puts(0,1,str(LANG_RESUME_CONFIRM_RECORDER));
482 lcd_puts(0,2,str(LANG_RESUME_CANCEL_RECORDER));
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000483#endif
484 lcd_update();
Robert Hakc88751f2002-10-16 07:25:33 +0000485
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000486 if (button_get(true) == BUTTON_PLAY)
487 return true;
488 return false;
489}
490
491void start_resume(void)
492{
493 if ( global_settings.resume &&
494 global_settings.resume_index != -1 ) {
495 int len = strlen(global_settings.resume_file);
496
497 DEBUGF("Resume file %s\n",global_settings.resume_file);
498 DEBUGF("Resume index %X offset %X\n",
499 global_settings.resume_index,
500 global_settings.resume_offset);
501 DEBUGF("Resume shuffle %s seed %X\n",
502 global_settings.playlist_shuffle?"on":"off",
503 global_settings.resume_seed);
504
505 /* playlist? */
506 if (!strcasecmp(&global_settings.resume_file[len-4], ".m3u")) {
507 char* slash;
508
509 /* check that the file exists */
510 int fd = open(global_settings.resume_file, O_RDONLY);
511 if(fd<0)
512 return;
513 close(fd);
514
515 if (!ask_resume())
516 return;
517
518 slash = strrchr(global_settings.resume_file,'/');
519 if (slash) {
520 *slash=0;
521 play_list(global_settings.resume_file,
522 slash+1,
523 global_settings.resume_index,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000524 true, /* the index is AFTER shuffle */
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000525 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000526 global_settings.resume_seed,
Björn Stenbergc78e1b02003-01-09 00:55:00 +0000527 global_settings.resume_first_index,
528 global_settings.queue_resume,
529 global_settings.queue_resume_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000530 *slash='/';
531 }
532 else {
533 /* check that the dir exists */
534 DIR* dir = opendir(global_settings.resume_file);
535 if(!dir)
536 return;
537 closedir(dir);
538
539 if (!ask_resume())
540 return;
541
542 play_list("/",
543 global_settings.resume_file,
544 global_settings.resume_index,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000545 true,
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000546 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000547 global_settings.resume_seed,
Björn Stenbergc78e1b02003-01-09 00:55:00 +0000548 global_settings.resume_first_index,
549 global_settings.queue_resume,
550 global_settings.queue_resume_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000551 }
552 }
553 else {
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000554 if (!ask_resume())
555 return;
556
557 if (showdir(global_settings.resume_file, 0) < 0 )
558 return;
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000559
560 lastdir[0] = '\0';
561
Björn Stenberg7113ec02002-08-16 15:23:57 +0000562 build_playlist(global_settings.resume_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000563 play_list(global_settings.resume_file,
564 NULL,
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000565 global_settings.resume_index,
566 true,
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000567 global_settings.resume_offset,
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000568 global_settings.resume_seed,
Björn Stenbergc78e1b02003-01-09 00:55:00 +0000569 global_settings.resume_first_index,
570 global_settings.queue_resume,
571 global_settings.queue_resume_index);
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000572 }
573
574 status_set_playmode(STATUS_PLAY);
575 status_draw();
576 wps_show();
577 }
578}
579
Eric Linenbergecca1232002-09-09 14:25:39 +0000580void set_current_file(char *path)
581{
582 char *name;
583 unsigned int i;
584
585 /* separate directory from filename */
Hardeep Sidhuc2c8d1c2002-09-17 07:42:21 +0000586 name = strrchr(path+1,'/');
Eric Linenbergecca1232002-09-09 14:25:39 +0000587 if (name)
588 {
589 *name = 0;
590 strcpy(currdir, path);
591 *name = '/';
592 name++;
593 }
594 else
595 {
596 strcpy(currdir, "/");
597 name = path+1;
598 }
599
600 strcpy(lastfile, name);
601
602 dircursor = 0;
603 dirstart = -1;
604
605 if (strncmp(currdir,lastdir,sizeof(lastdir)))
606 {
607 dirlevel = 0;
608 dirpos[dirlevel] = -1;
609 cursorpos[dirlevel] = 0;
610
611 /* use '/' to calculate dirlevel */
612 for (i=1; i<strlen(path)+1; i++)
613 {
614 if (path[i] == '/')
615 {
616 dirlevel++;
617 dirpos[dirlevel] = -1;
618 cursorpos[dirlevel] = 0;
619 }
620 }
621 }
622}
623
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000624static int onplay_screen(char* dir, char* file)
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000625{
626 bool exit = false;
627 bool used = false;
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000628 bool playing = mpeg_status() & MPEG_STATUS_PLAY;
629 char buf[MAX_PATH];
630
631 if ((dir[0]=='/') && (dir[1]==0))
632 snprintf(buf, sizeof buf, "%s%s", dir, file);
633 else
634 snprintf(buf, sizeof buf, "%s/%s", dir, file);
635
636 lcd_stop_scroll();
637 lcd_clear_display();
638#ifdef HAVE_LCD_BITMAP
639 {
640 int w,h;
641 char* ptr;
642
643 lcd_setfont(FONT_SYSFIXED);
644
645 if (playing) {
646 ptr = str(LANG_QUEUE);
647 lcd_getstringsize(ptr,&w,&h);
648 lcd_putsxy((LCD_WIDTH-w)/2, h*2, ptr);
649 lcd_bitmap(bitmap_icons_7x8[Icon_Play],
650 LCD_WIDTH/2 - 3, LCD_HEIGHT/2 - 4, 7, 8, true);
651 }
652
653 ptr = str(LANG_DELETE);
654 lcd_getstringsize(ptr,&w,&h);
655 lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h/2, ptr);
656 lcd_bitmap(bitmap_icons_7x8[Icon_FastForward],
657 LCD_WIDTH/2 + 8, LCD_HEIGHT/2 - 4, 7, 8, true);
658
659 lcd_putsxy(0, LCD_HEIGHT/2 - h/2, str(LANG_RENAME));
660 lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward],
661 LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true);
662 }
663#else
664 lcd_puts(0,0,str(LANG_PLAYER_ONPLAY_1));
665 lcd_puts(0,1,str(LANG_PLAYER_ONPLAY_2));
666#endif
667 lcd_update();
668
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000669
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000670 while (!exit) {
671 switch (button_get(true)) {
672 case BUTTON_LEFT:
673 case BUTTON_ON | BUTTON_LEFT: {
674 char newname[MAX_PATH];
675 char* ptr = strrchr(buf, '/') + 1;
676 int pathlen = (ptr - buf);
677 strncpy(newname, buf, sizeof newname);
678 if (!kbd_input(newname + pathlen, (sizeof newname)-pathlen)) {
679 if (rename(buf, newname) < 0) {
680 lcd_clear_display();
681 lcd_puts(0,0,str(LANG_RENAME));
682 lcd_puts(0,1,str(LANG_FAILED));
683 lcd_update();
684 sleep(HZ*2);
685 }
686 else
687 reload_dir = true;
688 }
689 exit = true;
690 break;
691 }
692
693 case BUTTON_RIGHT:
694 case BUTTON_ON | BUTTON_RIGHT:
695 lcd_clear_display();
696#ifdef HAVE_LCD_CHARCELLS
697 lcd_puts(0,0,file);
698 lcd_puts(0,1,str(LANG_REALLY_DELETE));
699#else
700 lcd_puts(0,0,str(LANG_REALLY_DELETE));
701 lcd_puts(0,1,file);
702 lcd_puts(0,3,str(LANG_RESUME_CONFIRM_RECORDER));
703 lcd_puts(0,4,str(LANG_RESUME_CANCEL_RECORDER));
704#endif
705 lcd_update();
706 while (!exit) {
707 int btn = button_get(true);
708 switch (btn) {
709 case BUTTON_PLAY:
710 case BUTTON_PLAY | BUTTON_REL:
711 if (!remove(buf)) {
712 reload_dir = true;
713 lcd_clear_display();
714 lcd_puts(0,0,file);
715 lcd_puts(0,1,str(LANG_DELETED));
716 lcd_update();
717 sleep(HZ);
718 exit = true;
719 break;
720 }
721
722 default:
723 /* ignore button releases */
724 if (!(btn & BUTTON_REL))
725 exit = true;
726 break;
727 }
728 }
729 break;
730
731 case BUTTON_PLAY:
732 case BUTTON_ON | BUTTON_PLAY: {
733 if (playing)
734 queue_add(buf);
735 exit = true;
736 break;
737 }
738
739 case BUTTON_ON | BUTTON_REL:
740 used = true;
741 break;
742
743 case BUTTON_ON:
744 if (used)
745 exit = true;
746 break;
747
748 case BUTTON_OFF:
749 exit = true;
750 break;
751 }
752 }
753
754#ifdef HAVE_LCD_BITMAP
755 lcd_setfont(FONT_UI);
756#endif
757
758 return false;
759}
760
761static bool handle_on(int* ds, int* dc, int numentries, int tree_max_on_screen)
762{
763 bool exit = false;
764 bool used = false;
765
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000766 int dirstart = *ds;
767 int dircursor = *dc;
768
769 while (!exit) {
770 switch (button_get(true)) {
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000771 case TREE_PREV:
772 case BUTTON_ON | TREE_PREV:
773 case BUTTON_ON | TREE_PREV | BUTTON_REPEAT:
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000774 used = true;
775 if ( dirstart ) {
776 dirstart -= tree_max_on_screen;
777 if ( dirstart < 0 )
778 dirstart = 0;
779 }
780 else
781 dircursor = 0;
782 break;
783
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000784 case TREE_NEXT:
785 case BUTTON_ON | TREE_NEXT:
786 case BUTTON_ON | TREE_NEXT | BUTTON_REPEAT:
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000787 used = true;
788 if ( dirstart < numentries - tree_max_on_screen ) {
789 dirstart += tree_max_on_screen;
790 if ( dirstart >
791 numentries - tree_max_on_screen )
792 dirstart = numentries - tree_max_on_screen;
793 }
794 else
795 dircursor = numentries - dirstart - 1;
796 break;
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000797
798
799 case BUTTON_PLAY:
800 case BUTTON_ON | BUTTON_PLAY:
801 onplay_screen(currdir, dircache[dircursor+dirstart].name);
802 exit = true;
803 used = true;
804 break;
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000805
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000806 case BUTTON_ON | BUTTON_REL:
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000807 case BUTTON_ON | TREE_PREV | BUTTON_REL:
808 case BUTTON_ON | TREE_NEXT | BUTTON_REL:
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000809 exit = true;
810 break;
811 }
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000812 if ( used && !exit ) {
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000813 showdir(currdir, dirstart);
814 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
815 lcd_update();
816 }
817 }
818 *ds = dirstart;
819 *dc = dircursor;
820
821 return used;
822}
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +0000823
Björn Stenbergdea31222002-10-08 15:42:40 +0000824static void storefile(char* filename, char* setting, int maxlen)
825{
826 int len = strlen(filename);
827 int extlen = 0;
828 char* ptr = filename + len;
829
830 while (*ptr != '.') {
831 extlen++;
832 ptr--;
833 }
834
Björn Stenberg5be4d342002-10-08 15:45:50 +0000835 if (strcmp(ROCKBOX_DIR, currdir) || (len-extlen > maxlen))
Björn Stenbergdea31222002-10-08 15:42:40 +0000836 return;
837
838 strncpy(setting, filename, len-extlen);
839 setting[len-extlen]=0;
840
841 settings_save();
842}
843
Björn Stenberg82182852002-05-16 12:53:40 +0000844bool dirbrowse(char *root)
845{
Björn Stenberg079b2d12002-08-08 12:06:38 +0000846 int numentries=0;
Linus Nielsen Feltzing8c57ad92002-07-15 22:46:38 +0000847 char buf[MAX_PATH];
Björn Stenberg82182852002-05-16 12:53:40 +0000848 int i;
Markus Braunde8fbf02002-08-07 10:35:26 +0000849 int lasti=-1;
Linus Nielsen Feltzingb3d0b6e2002-07-27 19:41:58 +0000850 int button;
Björn Stenbergcd225732002-08-11 09:17:47 +0000851 int tree_max_on_screen;
Björn Stenberg0ad20102002-09-03 20:47:23 +0000852 bool reload_root = false;
Björn Stenberga7dcf912002-09-24 19:12:09 +0000853 int lastfilter = global_settings.dirfilter;
Björn Stenberg0ad20102002-09-03 20:47:23 +0000854 bool lastsortcase = global_settings.sort_case;
Daniel Stenberg93b231c2002-09-12 13:33:59 +0000855#ifdef HAVE_LCD_BITMAP
856 int fw, fh;
Björn Stenberga4c3b032002-09-24 18:04:15 +0000857 lcd_getstringsize("A", &fw, &fh);
Markus Braunc41dcb92002-08-20 19:39:55 +0000858 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergcd225732002-08-11 09:17:47 +0000859#else
860 tree_max_on_screen = TREE_MAX_ON_SCREEN;
861#endif
Björn Stenberg82182852002-05-16 12:53:40 +0000862
Eric Linenbergecca1232002-09-09 14:25:39 +0000863 dircursor=0;
864 dirstart=0;
865 dirlevel=0;
866
Björn Stenberg82182852002-05-16 12:53:40 +0000867 memcpy(currdir,root,sizeof(currdir));
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000868
869 start_resume();
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000870
871 numentries = showdir(currdir, dirstart);
Björn Stenberg82182852002-05-16 12:53:40 +0000872 if (numentries == -1)
Hardeep Sidhuddfa4cb2002-09-09 17:32:15 +0000873 return -1; /* currdir is not a directory */
Björn Stenberg82182852002-05-16 12:53:40 +0000874
Markus Braun000c2db2002-08-30 13:49:32 +0000875 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Björn Stenberg82182852002-05-16 12:53:40 +0000876
877 while(1) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000878 struct entry* file = &dircache[dircursor+dirstart];
Björn Stenberg1a682be2002-09-02 12:46:32 +0000879
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000880 bool restore = false;
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +0000881 bool need_update = false;
Daniel Stenberg1a17d352002-06-18 11:22:48 +0000882
Markus Braunde8fbf02002-08-07 10:35:26 +0000883 button = button_get_w_tmo(HZ/5);
Linus Nielsen Feltzingf140b202002-07-27 20:55:39 +0000884 switch ( button ) {
Björn Stenbergcf55acf2002-06-12 08:59:48 +0000885 case TREE_EXIT:
Björn Stenberg407bfb02002-09-01 14:49:56 +0000886 case TREE_EXIT | BUTTON_REPEAT:
Björn Stenberg82182852002-05-16 12:53:40 +0000887 i=strlen(currdir);
Björn Stenberge493efd2002-05-21 14:30:54 +0000888 if (i>1) {
Björn Stenberg82182852002-05-16 12:53:40 +0000889 while (currdir[i-1]!='/')
890 i--;
891 strcpy(buf,&currdir[i]);
892 if (i==1)
893 currdir[i]=0;
894 else
895 currdir[i-1]=0;
896
Björn Stenberg82182852002-05-16 12:53:40 +0000897 dirlevel--;
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000898 if ( dirlevel < MAX_DIR_LEVELS ) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000899 dirstart = dirpos[dirlevel];
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000900 dircursor = cursorpos[dirlevel];
901 }
Björn Stenberg82182852002-05-16 12:53:40 +0000902 else
Eric Linenbergecca1232002-09-09 14:25:39 +0000903 dirstart = dircursor = 0;
904
905 if (dirstart == -1)
906 strcpy(lastfile, buf);
907
Björn Stenbergbb9aaf52002-06-25 13:26:04 +0000908 restore = true;
Björn Stenberga10d9fa2002-05-27 14:55:40 +0000909 }
Björn Stenberg82182852002-05-16 12:53:40 +0000910 break;
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000911
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000912#ifdef HAVE_RECORDER_KEYPAD
913 case BUTTON_OFF:
914 mpeg_stop();
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000915 status_set_playmode(STATUS_STOP);
Markus Braunde8fbf02002-08-07 10:35:26 +0000916 status_draw();
917 restore = true;
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000918 break;
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000919
920 case BUTTON_OFF | BUTTON_REL:
921#else
922 case BUTTON_STOP | BUTTON_REL:
Daniel Stenberg82a1cad2002-08-06 09:25:45 +0000923#endif
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000924 settings_save();
925 break;
926
Björn Stenberg82182852002-05-16 12:53:40 +0000927
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000928 case TREE_ENTER:
Björn Stenberg407bfb02002-09-01 14:49:56 +0000929 case TREE_ENTER | BUTTON_REPEAT:
Björn Stenbergc00557a2002-06-25 11:10:24 +0000930#ifdef HAVE_RECORDER_KEYPAD
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000931 case BUTTON_PLAY:
Björn Stenberg1a682be2002-09-02 12:46:32 +0000932 case BUTTON_PLAY | BUTTON_REPEAT:
Björn Stenbergc00557a2002-06-25 11:10:24 +0000933#endif
Björn Stenberg8b1aba82002-06-19 20:10:58 +0000934 if ( !numentries )
935 break;
Björn Stenberg82182852002-05-16 12:53:40 +0000936 if ((currdir[0]=='/') && (currdir[1]==0)) {
Björn Stenberg1a682be2002-09-02 12:46:32 +0000937 snprintf(buf,sizeof(buf),"%s%s",currdir, file->name);
Björn Stenberg82182852002-05-16 12:53:40 +0000938 } else {
Björn Stenberg1a682be2002-09-02 12:46:32 +0000939 snprintf(buf,sizeof(buf),"%s/%s",currdir, file->name);
Björn Stenberg82182852002-05-16 12:53:40 +0000940 }
941
Björn Stenberg1a682be2002-09-02 12:46:32 +0000942 if (file->attr & ATTR_DIRECTORY) {
Björn Stenberg82182852002-05-16 12:53:40 +0000943 memcpy(currdir,buf,sizeof(currdir));
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000944 if ( dirlevel < MAX_DIR_LEVELS ) {
Eric Linenbergecca1232002-09-09 14:25:39 +0000945 dirpos[dirlevel] = dirstart;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +0000946 cursorpos[dirlevel] = dircursor;
Björn Stenberg2b203ca2002-05-31 07:19:38 +0000947 }
Björn Stenberg82182852002-05-16 12:53:40 +0000948 dirlevel++;
949 dircursor=0;
Eric Linenbergecca1232002-09-09 14:25:39 +0000950 dirstart=0;
Björn Stenberg82182852002-05-16 12:53:40 +0000951 } else {
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000952 int seed = current_tick;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000953 bool play = false;
954 int start_index=0;
Björn Stenbergdea31222002-10-08 15:42:40 +0000955
Björn Stenberg42770ea2002-06-10 13:24:27 +0000956 lcd_stop_scroll();
Björn Stenbergc521ed12002-09-03 09:44:08 +0000957 switch ( file->attr & TREE_ATTR_MASK ) {
958 case TREE_ATTR_M3U:
959 if ( global_settings.resume )
960 snprintf(global_settings.resume_file,
961 MAX_PATH, "%s/%s",
962 currdir, file->name);
Hardeep Sidhu83611fe2002-10-06 05:50:41 +0000963 play_list(currdir, file->name, 0, false, 0,
Björn Stenbergc78e1b02003-01-09 00:55:00 +0000964 seed, 0, 0, -1);
Björn Stenbergc521ed12002-09-03 09:44:08 +0000965 start_index = 0;
966 play = true;
967 break;
Daniel Stenberg01bc8e62002-08-21 15:08:01 +0000968
Björn Stenbergc521ed12002-09-03 09:44:08 +0000969 case TREE_ATTR_MPA:
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000970 if ( global_settings.resume )
971 strncpy(global_settings.resume_file,
972 currdir, MAX_PATH);
973 start_index =
974 build_playlist(dircursor+dirstart);
975
Björn Stenbergc78e1b02003-01-09 00:55:00 +0000976 /* it is important that we get back the index
977 in the (shuffled) list and store that */
Björn Stenbergcaebdd42003-01-15 14:52:53 +0000978 start_index = play_list(currdir, NULL,
979 start_index, false,
980 0, seed, 0, 0, -1);
981 play = true;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000982 break;
983
984 /* wps config file */
985 case TREE_ATTR_WPS:
Björn Stenberg1a682be2002-09-02 12:46:32 +0000986 snprintf(buf, sizeof buf, "%s/%s",
987 currdir, file->name);
Björn Stenbergdea31222002-10-08 15:42:40 +0000988 wps_load(buf,true);
989 storefile(file->name, global_settings.wps_file,
990 MAX_FILENAME);
Björn Stenberg1a682be2002-09-02 12:46:32 +0000991 restore = true;
992 break;
Björn Stenbergc521ed12002-09-03 09:44:08 +0000993
Björn Stenberg08181c72002-10-08 09:40:05 +0000994 case TREE_ATTR_CFG:
Justin Heinere4a27612002-09-05 01:20:10 +0000995 snprintf(buf, sizeof buf, "%s/%s",
996 currdir, file->name);
Björn Stenberg08181c72002-10-08 09:40:05 +0000997 settings_load_config(buf);
Justin Heinere4a27612002-09-05 01:20:10 +0000998 restore = true;
999 break;
Justin Heinere4a27612002-09-05 01:20:10 +00001000
Daniel Stenberg773e7a72002-09-30 19:05:03 +00001001 case TREE_ATTR_TXT:
1002 snprintf(buf, sizeof buf, "%s/%s",
1003 currdir, file->name);
1004 viewer_run(buf);
1005 restore = true;
1006 break;
1007
Daniel Stenberga007ebf2002-09-24 12:40:52 +00001008 case TREE_ATTR_LNG:
1009 snprintf(buf, sizeof buf, "%s/%s",
1010 currdir, file->name);
Daniel Stenberg85305da2002-09-24 13:37:38 +00001011 if(!lang_load(buf)) {
Björn Stenbergdea31222002-10-08 15:42:40 +00001012 storefile(file->name,
1013 global_settings.lang_file,
1014 MAX_FILENAME);
1015
Daniel Stenberg85305da2002-09-24 13:37:38 +00001016 lcd_clear_display();
1017#ifdef HAVE_LCD_CHARCELLS
1018 lcd_puts(0, 0, str(LANG_LANGUAGE_LOADED));
1019#else
1020 lcd_getstringsize(str(LANG_LANGUAGE_LOADED),
Björn Stenberga4c3b032002-09-24 18:04:15 +00001021 &fw, &fh);
Daniel Stenberg85305da2002-09-24 13:37:38 +00001022 if(fw>LCD_WIDTH)
1023 fw=0;
1024 else
1025 fw=LCD_WIDTH/2 - fw/2;
1026
Björn Stenberga4c3b032002-09-24 18:04:15 +00001027 lcd_putsxy(fw, LCD_HEIGHT/2 - fh/2,
1028 str(LANG_LANGUAGE_LOADED));
Daniel Stenberg85305da2002-09-24 13:37:38 +00001029#endif
1030 lcd_update();
1031 sleep(HZ);
1032 restore = true;
1033 }
Daniel Stenberga007ebf2002-09-24 12:40:52 +00001034 break;
1035
Björn Stenbergbed3d3f2002-09-20 08:07:51 +00001036#ifdef HAVE_LCD_BITMAP
1037 case TREE_ATTR_FONT:
1038 snprintf(buf, sizeof buf, "%s/%s",
1039 currdir, file->name);
1040 font_load(buf);
Björn Stenbergdea31222002-10-08 15:42:40 +00001041 storefile(file->name, global_settings.font_file,
1042 MAX_FILENAME);
1043
Björn Stenberga4c3b032002-09-24 18:04:15 +00001044 lcd_getstringsize("A", &fw, &fh);
Björn Stenbergbed3d3f2002-09-20 08:07:51 +00001045 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
1046 /* make sure cursor is on screen */
1047 while ( dircursor > tree_max_on_screen ) {
1048 dircursor--;
1049 dirstart++;
1050 }
1051 restore = true;
1052 break;
1053#endif
1054
Björn Stenbergc521ed12002-09-03 09:44:08 +00001055#ifndef SIMULATOR
1056 /* firmware file */
1057 case TREE_ATTR_MOD:
1058 snprintf(buf, sizeof buf, "%s/%s",
1059 currdir, file->name);
1060 rolo_load(buf);
Björn Stenberg1a682be2002-09-02 12:46:32 +00001061 break;
Björn Stenbergc521ed12002-09-03 09:44:08 +00001062#endif
Björn Stenberg6224cdb2002-08-16 14:41:47 +00001063 }
1064
Björn Stenbergc521ed12002-09-03 09:44:08 +00001065 if ( play ) {
1066 if ( global_settings.resume ) {
1067 /* the resume_index must always be the index in the
1068 shuffled list in case shuffle is enabled */
1069 global_settings.resume_index = start_index;
1070 global_settings.resume_offset = 0;
Hardeep Sidhu3735a152002-10-11 09:14:30 +00001071 global_settings.resume_first_index =
1072 playlist_first_index();
Björn Stenbergc521ed12002-09-03 09:44:08 +00001073 global_settings.resume_seed = seed;
1074 settings_save();
1075 }
1076
1077 status_set_playmode(STATUS_PLAY);
1078 status_draw();
1079 lcd_stop_scroll();
Björn Stenberg0ad20102002-09-03 20:47:23 +00001080 if ( wps_show() == SYS_USB_CONNECTED ) {
1081 reload_root = true;
Björn Stenbergc521ed12002-09-03 09:44:08 +00001082 }
Daniel Stenberg93b231c2002-09-12 13:33:59 +00001083#ifdef HAVE_LCD_BITMAP
Björn Stenbergc521ed12002-09-03 09:44:08 +00001084 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Markus Braun000c2db2002-08-30 13:49:32 +00001085#endif
Björn Stenbergc521ed12002-09-03 09:44:08 +00001086 }
Björn Stenberg82182852002-05-16 12:53:40 +00001087 }
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001088 restore = true;
Björn Stenberg82182852002-05-16 12:53:40 +00001089 break;
Eric Linenberg9e91b952002-08-06 18:11:00 +00001090
Eric Linenberg9e91b952002-08-06 18:11:00 +00001091 case TREE_PREV:
Björn Stenbergc1d9b152002-08-07 20:51:37 +00001092 case TREE_PREV | BUTTON_REPEAT:
Björn Stenberg6752ee42002-08-12 18:28:51 +00001093 case BUTTON_VOL_UP:
Eric Linenberg9e91b952002-08-06 18:11:00 +00001094 if(filesindir) {
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001095 if(dircursor) {
Markus Braun000c2db2002-08-30 13:49:32 +00001096 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, false);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001097 dircursor--;
Markus Braun000c2db2002-08-30 13:49:32 +00001098 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001099 }
1100 else {
Eric Linenbergecca1232002-09-09 14:25:39 +00001101 if (dirstart) {
1102 dirstart--;
1103 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001104 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001105 }
1106 else {
Björn Stenbergcd225732002-08-11 09:17:47 +00001107 if (numentries < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +00001108 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001109 false);
1110 dircursor = numentries - 1;
Markus Braun000c2db2002-08-30 13:49:32 +00001111 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001112 true);
1113 }
1114 else {
Eric Linenbergecca1232002-09-09 14:25:39 +00001115 dirstart = numentries - tree_max_on_screen;
Björn Stenbergcd225732002-08-11 09:17:47 +00001116 dircursor = tree_max_on_screen - 1;
Eric Linenbergecca1232002-09-09 14:25:39 +00001117 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001118 put_cursorxy(CURSOR_X, CURSOR_Y +
Björn Stenbergcd225732002-08-11 09:17:47 +00001119 tree_max_on_screen - 1, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001120 }
1121 }
1122 }
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001123 need_update = true;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001124 }
Björn Stenberg82182852002-05-16 12:53:40 +00001125 break;
Björn Stenberg244688e2002-05-16 14:48:40 +00001126
Björn Stenbergcf55acf2002-06-12 08:59:48 +00001127 case TREE_NEXT:
Björn Stenbergc1d9b152002-08-07 20:51:37 +00001128 case TREE_NEXT | BUTTON_REPEAT:
Björn Stenberg6752ee42002-08-12 18:28:51 +00001129 case BUTTON_VOL_DOWN:
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001130 if(filesindir)
1131 {
Eric Linenbergecca1232002-09-09 14:25:39 +00001132 if (dircursor + dirstart + 1 < numentries ) {
Björn Stenbergcd225732002-08-11 09:17:47 +00001133 if(dircursor+1 < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +00001134 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001135 false);
1136 dircursor++;
Markus Braun000c2db2002-08-30 13:49:32 +00001137 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001138 }
1139 else {
Eric Linenbergecca1232002-09-09 14:25:39 +00001140 dirstart++;
1141 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001142 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001143 }
1144 }
1145 else {
Björn Stenbergcd225732002-08-11 09:17:47 +00001146 if(numentries < tree_max_on_screen) {
Markus Braun000c2db2002-08-30 13:49:32 +00001147 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor,
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001148 false);
Eric Linenbergecca1232002-09-09 14:25:39 +00001149 dirstart = dircursor = 0;
Markus Braun000c2db2002-08-30 13:49:32 +00001150 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001151 }
1152 else {
Eric Linenbergecca1232002-09-09 14:25:39 +00001153 dirstart = dircursor = 0;
1154 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001155 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001156 }
1157 }
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001158 need_update = true;
Linus Nielsen Feltzingfe689a82002-07-22 22:45:20 +00001159 }
Björn Stenberg82182852002-05-16 12:53:40 +00001160 break;
Björn Stenberge493efd2002-05-21 14:30:54 +00001161
Björn Stenberg0ad20102002-09-03 20:47:23 +00001162 case TREE_MENU:
Björn Stenberg42770ea2002-06-10 13:24:27 +00001163 lcd_stop_scroll();
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001164 if (main_menu())
1165 reload_root = true;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001166 restore = true;
Björn Stenberge493efd2002-05-21 14:30:54 +00001167 break;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001168
1169 case BUTTON_ON:
Björn Stenbergcaebdd42003-01-15 14:52:53 +00001170 if (handle_on(&dirstart, &dircursor, numentries,
1171 tree_max_on_screen))
Linus Nielsen Feltzing8abcf1b2002-08-07 06:04:24 +00001172 {
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001173 /* start scroll */
Björn Stenberg34d1e1b2002-06-27 01:20:08 +00001174 restore = true;
1175 }
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001176 else
Björn Stenberg5f8ac6d2002-09-29 22:24:00 +00001177 {
1178 if (mpeg_status() & MPEG_STATUS_PLAY)
1179 {
1180 lcd_stop_scroll();
1181 if (wps_show() == SYS_USB_CONNECTED)
1182 reload_root = true;
1183#ifdef HAVE_LCD_BITMAP
1184 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
1185#endif
1186 restore = true;
1187 }
1188 }
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001189 break;
Linus Nielsen Feltzingda501ee2002-06-30 16:27:39 +00001190
Markus Braunde8fbf02002-08-07 10:35:26 +00001191#ifdef HAVE_RECORDER_KEYPAD
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001192 case BUTTON_F2:
Björn Stenberg0ad20102002-09-03 20:47:23 +00001193 if (f2_screen())
1194 reload_root = true;
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001195 restore = true;
1196 break;
1197
1198 case BUTTON_F3:
Björn Stenberg0ad20102002-09-03 20:47:23 +00001199 if (f3_screen())
1200 reload_root = true;
Daniel Stenberg93b231c2002-09-12 13:33:59 +00001201
1202#ifdef HAVE_LCD_BITMAP
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001203 tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
Björn Stenbergabe11fd2002-09-03 15:58:47 +00001204#endif
1205 restore = true;
Markus Braunde8fbf02002-08-07 10:35:26 +00001206 break;
Markus Braunc41dcb92002-08-20 19:39:55 +00001207#endif
Markus Braunde8fbf02002-08-07 10:35:26 +00001208
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001209 case SYS_USB_CONNECTED:
Markus Braun88098be2002-10-11 08:56:23 +00001210 status_set_playmode(STATUS_STOP);
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001211 usb_screen();
Björn Stenberg0ad20102002-09-03 20:47:23 +00001212 reload_root = true;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001213 break;
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001214
1215 case BUTTON_NONE:
1216 status_draw();
1217 break;
Björn Stenberg82182852002-05-16 12:53:40 +00001218 }
Björn Stenberg42770ea2002-06-10 13:24:27 +00001219
Björn Stenberg457b8a02002-08-26 13:21:14 +00001220 if ( button )
1221 ata_spin();
1222
Björn Stenberg0ad20102002-09-03 20:47:23 +00001223 /* do we need to rescan dir? */
1224 if (reload_root ||
Björn Stenberga7dcf912002-09-24 19:12:09 +00001225 lastfilter != global_settings.dirfilter ||
1226 lastsortcase != global_settings.sort_case)
Björn Stenberg0ad20102002-09-03 20:47:23 +00001227 {
1228 if ( reload_root ) {
1229 strcpy(currdir, "/");
1230 dirlevel = 0;
1231 reload_root = false;
1232 }
1233 dircursor = 0;
Eric Linenbergecca1232002-09-09 14:25:39 +00001234 dirstart = 0;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001235 lastdir[0] = 0;
Björn Stenberga7dcf912002-09-24 19:12:09 +00001236 lastfilter = global_settings.dirfilter;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001237 lastsortcase = global_settings.sort_case;
Björn Stenberg0ad20102002-09-03 20:47:23 +00001238 restore = true;
1239 }
1240
Björn Stenbergcaebdd42003-01-15 14:52:53 +00001241 if (restore || reload_dir) {
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001242 /* restore display */
Linus Nielsen Feltzinge10fc4c2002-08-08 10:46:10 +00001243 /* We need to adjust if the number of lines on screen have
1244 changed because of a status bar change */
Björn Stenbergcd225732002-08-11 09:17:47 +00001245 if(CURSOR_Y+LINE_Y+dircursor>tree_max_on_screen) {
Eric Linenbergecca1232002-09-09 14:25:39 +00001246 dirstart++;
Linus Nielsen Feltzinge10fc4c2002-08-08 10:46:10 +00001247 dircursor--;
1248 }
Daniel Stenberg773e7a72002-09-30 19:05:03 +00001249#ifdef HAVE_LCD_BITMAP
1250 /* the sub-screen might've ruined the margins */
1251 lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and
1252 icon */
1253#endif
Eric Linenbergecca1232002-09-09 14:25:39 +00001254 numentries = showdir(currdir, dirstart);
Markus Braun000c2db2002-08-30 13:49:32 +00001255 put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001256
1257 need_update = true;
Björn Stenbergcaebdd42003-01-15 14:52:53 +00001258 reload_dir = false;
Björn Stenbergbb9aaf52002-06-25 13:26:04 +00001259 }
Björn Stenberg42770ea2002-06-10 13:24:27 +00001260
Markus Braunde8fbf02002-08-07 10:35:26 +00001261 if ( numentries ) {
Eric Linenbergecca1232002-09-09 14:25:39 +00001262 i = dirstart+dircursor;
Markus Braunde8fbf02002-08-07 10:35:26 +00001263
1264 /* if MP3 filter is on, cut off the extension */
1265 if(lasti!=i || restore) {
1266 lasti=i;
1267 lcd_stop_scroll();
Björn Stenberga7dcf912002-09-24 19:12:09 +00001268 if (global_settings.dirfilter == SHOW_MUSIC &&
1269 (dircache[i].attr & (TREE_ATTR_M3U|TREE_ATTR_MPA)))
Markus Braunde8fbf02002-08-07 10:35:26 +00001270 {
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +00001271 int len = strlen(dircache[i].name);
1272 char temp = dircache[i].name[len-4];
1273 dircache[i].name[len-4] = 0;
Björn Stenberga7dcf912002-09-24 19:12:09 +00001274 lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
Linus Nielsen Feltzing5917e812002-08-15 12:28:52 +00001275 dircache[i].name[len-4] = temp;
Markus Braunde8fbf02002-08-07 10:35:26 +00001276 }
1277 else
Björn Stenberga7dcf912002-09-24 19:12:09 +00001278 lcd_puts_scroll(LINE_X, dircursor, dircache[i].name);
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001279
1280 need_update = true;
Markus Braunde8fbf02002-08-07 10:35:26 +00001281 }
1282 }
Linus Nielsen Feltzing1a271202002-10-28 09:11:42 +00001283
1284 if(need_update) {
1285 lcd_update();
1286
1287 need_update = false;
1288 }
Björn Stenberg82182852002-05-16 12:53:40 +00001289 }
1290
1291 return false;
1292}
Daniel Stenberga007ebf2002-09-24 12:40:52 +00001293
1294/* -----------------------------------------------------------------
1295 * local variables:
1296 * eval: (load-file "../firmware/rockbox-mode.el")
1297 * end:
1298 */