Added ON+PLAY in dir browser for file actions: Rename, Delete and Queue.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3096 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 3e303bc..aa47808 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -1247,3 +1247,42 @@
eng: "OK"
new:
+id: LANG_PLAYER_ONPLAY_1
+desc: Line #1 of player ON+PLAY screen
+eng: "\x81 Queue"
+new:
+
+id: LANG_PLAYER_ONPLAY_2
+desc: Line #2 of player ON+PLAY screen
+eng: "- Ren + Del"
+new:
+
+id: LANG_QUEUE
+desc: The verb/action Queue
+eng: "Queue"
+new:
+
+id: LANG_DELETE
+desc: The verb/action Delete
+eng: "Delete"
+new:
+
+id: LANG_REALLY_DELETE
+desc: Really Delete?
+eng: "Delete?"
+new:
+
+id: LANG_DELETED
+desc: A file has beed deleted
+eng: "Deleted"
+new:
+
+id: LANG_RENAME
+desc: The verb/action Rename
+eng: "Rename"
+new:
+
+id: LANG_FAILED
+desc: Something failed. To be appended after above actions
+eng: "failed"
+new:
diff --git a/apps/tree.c b/apps/tree.c
index dcaa955..24ac1f5 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -49,6 +49,7 @@
#include "viewer.h"
#include "language.h"
#include "screens.h"
+#include "keyboard.h"
#ifdef HAVE_LCD_BITMAP
#include "widgets.h"
@@ -73,6 +74,7 @@
static char lastdir[MAX_PATH];
static char lastfile[MAX_PATH];
static char currdir[MAX_PATH];
+static bool reload_dir = false;
void browse_root(void)
{
@@ -203,7 +205,7 @@
#endif
/* new dir? cache it */
- if (strncmp(path,lastdir,sizeof(lastdir))) {
+ if (strncmp(path,lastdir,sizeof(lastdir)) || reload_dir) {
DIR *dir = opendir(path);
if(!dir)
return -1; /* not a directory */
@@ -455,36 +457,6 @@
return filesindir;
}
-static void show_queue_display(int queue_count, char *filename)
-{
-#ifdef HAVE_LCD_CHARCELLS
- lcd_double_height(false);
-#endif
-
-#ifdef HAVE_LCD_BITMAP
- lcd_setmargins(0,0);
-#endif
-
- lcd_clear_display();
- if (queue_count > 0)
- {
- char s[32];
-
- snprintf(s, sizeof(s), str(LANG_QUEUE_QUEUED), filename);
- lcd_puts(0,0,s);
-
- snprintf(s, sizeof(s), str(LANG_QUEUE_TOTAL), queue_count);
- lcd_puts(0,1,s);
- }
- else
- {
- lcd_puts(0,0,str(LANG_QUEUE_FULL));
- }
- lcd_update();
- sleep(HZ);
- lcd_clear_display();
-}
-
bool ask_resume(void)
{
#ifdef HAVE_LCD_CHARCELLS
@@ -649,20 +621,156 @@
}
}
-#ifdef HAVE_RECORDER_KEYPAD
-bool pageupdown(int* ds, int* dc, int numentries, int tree_max_on_screen )
+static int onplay_screen(char* dir, char* file)
{
bool exit = false;
bool used = false;
+ bool playing = mpeg_status() & MPEG_STATUS_PLAY;
+ char buf[MAX_PATH];
+
+ if ((dir[0]=='/') && (dir[1]==0))
+ snprintf(buf, sizeof buf, "%s%s", dir, file);
+ else
+ snprintf(buf, sizeof buf, "%s/%s", dir, file);
+
+ lcd_stop_scroll();
+ lcd_clear_display();
+#ifdef HAVE_LCD_BITMAP
+ {
+ int w,h;
+ char* ptr;
+
+ lcd_setfont(FONT_SYSFIXED);
+
+ if (playing) {
+ ptr = str(LANG_QUEUE);
+ lcd_getstringsize(ptr,&w,&h);
+ lcd_putsxy((LCD_WIDTH-w)/2, h*2, ptr);
+ lcd_bitmap(bitmap_icons_7x8[Icon_Play],
+ LCD_WIDTH/2 - 3, LCD_HEIGHT/2 - 4, 7, 8, true);
+ }
+
+ ptr = str(LANG_DELETE);
+ lcd_getstringsize(ptr,&w,&h);
+ lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h/2, ptr);
+ lcd_bitmap(bitmap_icons_7x8[Icon_FastForward],
+ LCD_WIDTH/2 + 8, LCD_HEIGHT/2 - 4, 7, 8, true);
+
+ lcd_putsxy(0, LCD_HEIGHT/2 - h/2, str(LANG_RENAME));
+ lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward],
+ LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true);
+ }
+#else
+ lcd_puts(0,0,str(LANG_PLAYER_ONPLAY_1));
+ lcd_puts(0,1,str(LANG_PLAYER_ONPLAY_2));
+#endif
+ lcd_update();
+
+ while (!exit) {
+ switch (button_get(true)) {
+ case BUTTON_LEFT:
+ case BUTTON_ON | BUTTON_LEFT: {
+ char newname[MAX_PATH];
+ char* ptr = strrchr(buf, '/') + 1;
+ int pathlen = (ptr - buf);
+ strncpy(newname, buf, sizeof newname);
+ if (!kbd_input(newname + pathlen, (sizeof newname)-pathlen)) {
+ if (rename(buf, newname) < 0) {
+ lcd_clear_display();
+ lcd_puts(0,0,str(LANG_RENAME));
+ lcd_puts(0,1,str(LANG_FAILED));
+ lcd_update();
+ sleep(HZ*2);
+ }
+ else
+ reload_dir = true;
+ }
+ exit = true;
+ break;
+ }
+
+ case BUTTON_RIGHT:
+ case BUTTON_ON | BUTTON_RIGHT:
+ lcd_clear_display();
+#ifdef HAVE_LCD_CHARCELLS
+ lcd_puts(0,0,file);
+ lcd_puts(0,1,str(LANG_REALLY_DELETE));
+#else
+ lcd_puts(0,0,str(LANG_REALLY_DELETE));
+ lcd_puts(0,1,file);
+ lcd_puts(0,3,str(LANG_RESUME_CONFIRM_RECORDER));
+ lcd_puts(0,4,str(LANG_RESUME_CANCEL_RECORDER));
+#endif
+ lcd_update();
+ while (!exit) {
+ int btn = button_get(true);
+ switch (btn) {
+ case BUTTON_PLAY:
+ case BUTTON_PLAY | BUTTON_REL:
+ if (!remove(buf)) {
+ reload_dir = true;
+ lcd_clear_display();
+ lcd_puts(0,0,file);
+ lcd_puts(0,1,str(LANG_DELETED));
+ lcd_update();
+ sleep(HZ);
+ exit = true;
+ break;
+ }
+
+ default:
+ /* ignore button releases */
+ if (!(btn & BUTTON_REL))
+ exit = true;
+ break;
+ }
+ }
+ break;
+
+ case BUTTON_PLAY:
+ case BUTTON_ON | BUTTON_PLAY: {
+ if (playing)
+ queue_add(buf);
+ exit = true;
+ break;
+ }
+
+ case BUTTON_ON | BUTTON_REL:
+ used = true;
+ break;
+
+ case BUTTON_ON:
+ if (used)
+ exit = true;
+ break;
+
+ case BUTTON_OFF:
+ exit = true;
+ break;
+ }
+ }
+
+#ifdef HAVE_LCD_BITMAP
+ lcd_setfont(FONT_UI);
+#endif
+
+ return false;
+}
+
+static bool handle_on(int* ds, int* dc, int numentries, int tree_max_on_screen)
+{
+ bool exit = false;
+ bool used = false;
+
int dirstart = *ds;
int dircursor = *dc;
while (!exit) {
switch (button_get(true)) {
- case BUTTON_UP:
- case BUTTON_ON | BUTTON_UP:
- case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:
+ case TREE_PREV:
+ case BUTTON_ON | TREE_PREV:
+ case BUTTON_ON | TREE_PREV | BUTTON_REPEAT:
used = true;
if ( dirstart ) {
dirstart -= tree_max_on_screen;
@@ -673,9 +781,9 @@
dircursor = 0;
break;
- case BUTTON_DOWN:
- case BUTTON_ON | BUTTON_DOWN:
- case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT:
+ case TREE_NEXT:
+ case BUTTON_ON | TREE_NEXT:
+ case BUTTON_ON | TREE_NEXT | BUTTON_REPEAT:
used = true;
if ( dirstart < numentries - tree_max_on_screen ) {
dirstart += tree_max_on_screen;
@@ -686,18 +794,22 @@
else
dircursor = numentries - dirstart - 1;
break;
+
+
+ case BUTTON_PLAY:
+ case BUTTON_ON | BUTTON_PLAY:
+ onplay_screen(currdir, dircache[dircursor+dirstart].name);
+ exit = true;
+ used = true;
+ break;
-#ifdef SIMULATOR
- case BUTTON_ON:
-#else
case BUTTON_ON | BUTTON_REL:
- case BUTTON_ON | BUTTON_UP | BUTTON_REL:
- case BUTTON_ON | BUTTON_DOWN | BUTTON_REL:
-#endif
+ case BUTTON_ON | TREE_PREV | BUTTON_REL:
+ case BUTTON_ON | TREE_NEXT | BUTTON_REL:
exit = true;
break;
}
- if ( used ) {
+ if ( used && !exit ) {
showdir(currdir, dirstart);
put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
lcd_update();
@@ -708,7 +820,6 @@
return used;
}
-#endif
static void storefile(char* filename, char* setting, int maxlen)
{
@@ -814,10 +925,10 @@
break;
- case TREE_ENTER | BUTTON_REL:
+ case TREE_ENTER:
case TREE_ENTER | BUTTON_REPEAT:
#ifdef HAVE_RECORDER_KEYPAD
- case BUTTON_PLAY | BUTTON_REL:
+ case BUTTON_PLAY:
case BUTTON_PLAY | BUTTON_REPEAT:
#endif
if ( !numentries )
@@ -838,7 +949,6 @@
dircursor=0;
dirstart=0;
} else {
- static int repeat_count = 0;
int seed = current_tick;
bool play = false;
int start_index=0;
@@ -857,34 +967,18 @@
break;
case TREE_ATTR_MPA:
- if (button & BUTTON_REPEAT &&
- mpeg_status() & MPEG_STATUS_PLAY)
- {
- int queue_count = queue_add(buf);
- show_queue_display(queue_count,
- file->name);
-
- while( !(button_get(true) & BUTTON_REL) ) ;
-
- repeat_count = 0;
- restore = true;
- }
- else
- {
- repeat_count = 0;
- if ( global_settings.resume )
- strncpy(global_settings.resume_file,
- currdir, MAX_PATH);
- start_index =
- build_playlist(dircursor+dirstart);
-
+ if ( global_settings.resume )
+ strncpy(global_settings.resume_file,
+ currdir, MAX_PATH);
+ start_index =
+ build_playlist(dircursor+dirstart);
+
/* it is important that we get back the index
in the (shuffled) list and store that */
- start_index = play_list(currdir, NULL,
- start_index, false,
- 0, seed, 0, 0, -1);
- play = true;
- }
+ start_index = play_list(currdir, NULL,
+ start_index, false,
+ 0, seed, 0, 0, -1);
+ play = true;
break;
/* wps config file */
@@ -1073,15 +1167,13 @@
break;
case BUTTON_ON:
-#ifdef HAVE_RECORDER_KEYPAD
- if (pageupdown(&dirstart, &dircursor, numentries,
- tree_max_on_screen))
+ if (handle_on(&dirstart, &dircursor, numentries,
+ tree_max_on_screen))
{
/* start scroll */
restore = true;
}
else
-#endif
{
if (mpeg_status() & MPEG_STATUS_PLAY)
{
@@ -1146,7 +1238,7 @@
restore = true;
}
- if ( restore ) {
+ if (restore || reload_dir) {
/* restore display */
/* We need to adjust if the number of lines on screen have
changed because of a status bar change */
@@ -1163,6 +1255,7 @@
put_cursorxy(CURSOR_X, CURSOR_Y + dircursor, true);
need_update = true;
+ reload_dir = false;
}
if ( numentries ) {