summaryrefslogtreecommitdiff
path: root/apps/tree.c
diff options
context:
space:
mode:
authorTeruaki Kawashima <teru@rockbox.org>2010-12-14 13:37:58 +0000
committerTeruaki Kawashima <teru@rockbox.org>2010-12-14 13:37:58 +0000
commit08af5d84044a7f18a619e1cb38cd183819be41b9 (patch)
treee441cf84b0268e5b008d044902641f063f218152 /apps/tree.c
parentfbd75fcc86304ccf44ad8174c91684b687a877ec (diff)
downloadrockbox-08af5d84044a7f18a619e1cb38cd183819be41b9.tar.gz
rockbox-08af5d84044a7f18a619e1cb38cd183819be41b9.zip
FS#11777: enhancement for rockbox_browse()
* Add struct browse_context to be passed to rockbox_browse. * Show proper title when selecting e.g. .wps file or .sbs file from the settings menu. * Add select only mode to rockbox_browse(). when a file is selected, it's path is stored to buffer and the browser exits without 'playing' the file. this will allow to use the browser in more places to select file including plugins. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28831 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/tree.c')
-rw-r--r--apps/tree.c148
1 files changed, 62 insertions, 86 deletions
diff --git a/apps/tree.c b/apps/tree.c
index 98880f001a..b0e94bf936 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -417,18 +417,12 @@ static int update_dir(void)
417#endif 417#endif
418 { 418 {
419#ifdef HAVE_LCD_BITMAP 419#ifdef HAVE_LCD_BITMAP
420 if (global_settings.show_path_in_browser && 420 if (tc.browse && tc.browse->title)
421 *(tc.dirfilter) == SHOW_PLUGINS)
422 { 421 {
423 char *title; 422 int icon = tc.browse->icon;
424 if (!strcmp(tc.currdir, PLUGIN_GAMES_DIR)) 423 if (icon == NOICON)
425 title = str(LANG_PLUGIN_GAMES); 424 icon = filetype_get_icon(ATTR_DIRECTORY);
426 else if (!strcmp(tc.currdir, PLUGIN_APPS_DIR)) 425 gui_synclist_set_title(&tree_lists, tc.browse->title, icon);
427 title = str(LANG_PLUGIN_APPS);
428 else if (!strcmp(tc.currdir, PLUGIN_DEMOS_DIR))
429 title = str(LANG_PLUGIN_DEMOS);
430 else title = str(LANG_PLUGINS);
431 gui_synclist_set_title(&tree_lists, title, Icon_Plugin);
432 } 426 }
433 else if (global_settings.show_path_in_browser == SHOW_PATH_FULL) 427 else if (global_settings.show_path_in_browser == SHOW_PATH_FULL)
434 { 428 {
@@ -616,7 +610,7 @@ void set_current_file(const char *path)
616 610
617 611
618/* main loop, handles key events */ 612/* main loop, handles key events */
619static int dirbrowse() 613static int dirbrowse(void)
620{ 614{
621 int numentries=0; 615 int numentries=0;
622 char buf[MAX_PATH]; 616 char buf[MAX_PATH];
@@ -653,7 +647,7 @@ static int dirbrowse()
653 if (*tc.dirfilter > NUM_FILTER_MODES && numentries==0) 647 if (*tc.dirfilter > NUM_FILTER_MODES && numentries==0)
654 { 648 {
655 splash(HZ*2, ID2P(LANG_NO_FILES)); 649 splash(HZ*2, ID2P(LANG_NO_FILES));
656 return GO_TO_PREVIOUS; /* No files found for rockbox_browser() */ 650 return GO_TO_PREVIOUS; /* No files found for rockbox_browse() */
657 } 651 }
658 652
659 gui_synclist_draw(&tree_lists); 653 gui_synclist_draw(&tree_lists);
@@ -683,6 +677,14 @@ static int dirbrowse()
683 if ( numentries == 0 ) 677 if ( numentries == 0 )
684 break; 678 break;
685 679
680 if ((tc.browse->flags & BROWSE_SELECTONLY) &&
681 !(dircache[tc.selected_item].attr & ATTR_DIRECTORY))
682 {
683 tc.browse->flags |= BROWSE_SELECTED;
684 get_current_file(tc.browse->buf, tc.browse->bufsize);
685 return GO_TO_PREVIOUS;
686 }
687
686#ifdef HAVE_TAGCACHE 688#ifdef HAVE_TAGCACHE
687 switch (id3db?tagtree_enter(&tc):ft_enter(&tc)) 689 switch (id3db?tagtree_enter(&tc):ft_enter(&tc))
688#else 690#else
@@ -781,6 +783,11 @@ static int dirbrowse()
781 int onplay_result; 783 int onplay_result;
782 int attr = 0; 784 int attr = 0;
783 785
786 /* no context menu while in select only mode
787 to prevent recursive call */
788 if ((tc.browse->flags & BROWSE_SELECTONLY))
789 break;
790
784 if(!numentries) 791 if(!numentries)
785 onplay_result = onplay(NULL, 0, curr_context, hotkey); 792 onplay_result = onplay(NULL, 0, curr_context, hotkey);
786 else { 793 else {
@@ -924,108 +931,77 @@ bool create_playlist(void)
924 return true; 931 return true;
925} 932}
926 933
927int rockbox_browse(const char *root, int dirfilter) 934void browse_context_init(struct browse_context *browse,
935 int dirfilter, unsigned flags,
936 char *title, enum themable_icons icon,
937 const char *root, const char *selected)
938{
939 browse->dirfilter = dirfilter;
940 browse->flags = flags;
941 browse->callback_show_item = NULL;
942 browse->title = title;
943 browse->icon = icon;
944 browse->root = root;
945 browse->selected = selected;
946 browse->buf = NULL;
947 browse->bufsize = 0;
948}
949
950#define NUM_TC_BACKUP 3
951static struct tree_context backups[NUM_TC_BACKUP];
952/* do not make backup if it is not recursive call */
953static int backup_count = -1;
954int rockbox_browse(struct browse_context *browse)
928{ 955{
929 static char current[MAX_PATH]; 956 static char current[MAX_PATH];
930 int ret_val = 0; 957 int ret_val = 0;
931 int *last_filter = tc.dirfilter; 958 int dirfilter = browse->dirfilter;
959
960 if (backup_count >= NUM_TC_BACKUP)
961 return GO_TO_PREVIOUS;
962 if (backup_count >= 0)
963 backups[backup_count] = tc;
964 backup_count++;
965
932 tc.dirfilter = &dirfilter; 966 tc.dirfilter = &dirfilter;
933 tc.sort_dir = global_settings.sort_dir; 967 tc.sort_dir = global_settings.sort_dir;
934 968
935 reload_dir = true; 969 reload_dir = true;
936 if (dirfilter >= NUM_FILTER_MODES) 970 if (*tc.dirfilter >= NUM_FILTER_MODES)
937 { 971 {
938 static struct tree_context backup;
939 int last_context; 972 int last_context;
940 const char *ext, *setting; 973
941 974 tc.browse = browse;
942 backup = tc;
943 tc.selected_item = 0; 975 tc.selected_item = 0;
944 tc.dirlevel = 0; 976 tc.dirlevel = 0;
945 memcpy(tc.currdir, root, sizeof(tc.currdir)); 977 strlcpy(tc.currdir, browse->root, sizeof(tc.currdir));
946 start_wps = false; 978 start_wps = false;
947 last_context = curr_context; 979 last_context = curr_context;
948 980
949 /* if we are in a special settings folder, center the current setting */ 981 if (browse->selected)
950 switch(dirfilter)
951 {
952 case SHOW_LNG:
953 ext = "lng";
954 if (global_settings.lang_file[0])
955 setting = global_settings.lang_file;
956 else
957 setting = "english";
958 break;
959 case SHOW_WPS:
960 ext = "wps";
961 setting = global_settings.wps_file;
962 break;
963#ifdef HAVE_REMOTE_LCD
964 case SHOW_RWPS:
965 ext = "rwps";
966 setting = global_settings.rwps_file;
967 break;
968 case SHOW_RSBS:
969 ext = "rsbs";
970 setting = global_settings.rsbs_file;
971 break;
972#if CONFIG_TUNER
973 case SHOW_RFMS:
974 ext = "rfms";
975 setting = global_settings.rfms_file;
976 break;
977#endif /* CONFIG_TUNER */
978#endif
979#ifdef HAVE_LCD_BITMAP
980 case SHOW_FONT:
981 ext = "fnt";
982 setting = global_settings.font_file;
983 break;
984 case SHOW_SBS:
985 ext = "sbs";
986 setting = global_settings.sbs_file;
987 break;
988#if CONFIG_TUNER
989 case SHOW_FMS:
990 ext = "fms";
991 setting = global_settings.fms_file;
992 break;
993#endif /* CONFIG_TUNER */
994#endif
995#if CONFIG_TUNER
996 case SHOW_FMR:
997 ext = "fmr";
998 setting = global_settings.fmr_file;
999 break;
1000#endif
1001 default:
1002 ext = setting = NULL;
1003 break;
1004 }
1005
1006 /* If we've found a file to center on, do it */
1007 if (setting)
1008 { 982 {
1009 /* if setting != NULL, ext is initialized */ 983 snprintf(current, sizeof(current), "%s/%s",
1010 snprintf(current, sizeof(current), "%s/%s.%s", root, setting, ext); 984 browse->root, browse->selected);
1011 set_current_file(current); 985 set_current_file(current);
1012 /* set_current_file changes dirlevel, change it back */ 986 /* set_current_file changes dirlevel, change it back */
1013 tc.dirlevel = 0; 987 tc.dirlevel = 0;
1014 } 988 }
1015 989
1016 ret_val = dirbrowse(); 990 ret_val = dirbrowse();
1017 tc = backup;
1018 curr_context = last_context; 991 curr_context = last_context;
1019 } 992 }
1020 else 993 else
1021 { 994 {
1022 if (dirfilter != SHOW_ID3DB) 995 if (dirfilter != SHOW_ID3DB)
1023 tc.dirfilter = &global_settings.dirfilter; 996 tc.dirfilter = &global_settings.dirfilter;
1024 strcpy(current,root); 997 tc.browse = browse;
998 strcpy(current, browse->root);
1025 set_current_file(current); 999 set_current_file(current);
1026 ret_val = dirbrowse(); 1000 ret_val = dirbrowse();
1027 } 1001 }
1028 tc.dirfilter = last_filter; 1002 backup_count--;
1003 if (backup_count >= 0)
1004 tc = backups[backup_count];
1029 return ret_val; 1005 return ret_val;
1030} 1006}
1031 1007