diff options
Diffstat (limited to 'apps/tree.c')
-rw-r--r-- | apps/tree.c | 148 |
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 */ |
619 | static int dirbrowse() | 613 | static 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 | ||
927 | int rockbox_browse(const char *root, int dirfilter) | 934 | void 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 | ||
951 | static struct tree_context backups[NUM_TC_BACKUP]; | ||
952 | /* do not make backup if it is not recursive call */ | ||
953 | static int backup_count = -1; | ||
954 | int 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 | ||