summaryrefslogtreecommitdiff
path: root/apps/tree.c
diff options
context:
space:
mode:
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