int file_choose(const char *start_path, char *chosen_file, const char *title, const char *supported_ext[]) { SceCtrlData pad, old_pad; unsigned int keys_down; int i; int selected = 0; char cur_path[PATH_MAX]; pad.buttons = old_pad.buttons = 0; strcpy(cur_path, start_path); file_list list; file_list_entry *entry; file_list_build(cur_path, &list, supported_ext); while (1) { sceCtrlPeekBufferPositive(0, &pad, 1); if (pad.buttons & PSP2_CTRL_SELECT) break; keys_down = pad.buttons & ~old_pad.buttons; if (keys_down & PSP2_CTRL_UP) { selected--; if (selected < 0) { selected = list.length - 1; } } else if (keys_down & PSP2_CTRL_DOWN) { selected++; if (selected == list.length) { selected = 0; } } if (keys_down & (PSP2_CTRL_CROSS | PSP2_CTRL_START)) { file_list_entry *entry = file_list_get_nth_entry(&list, selected); if (entry->is_dir) { if (strcmp(entry->name, "..") == 0) { dir_up(cur_path); } else { char new_path[PATH_MAX]; sprintf(new_path, "%s/%s", cur_path, entry->name); strcpy(cur_path, new_path); } file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } else if (entry->supported) { sprintf(chosen_file, "%s/%s", cur_path, entry->name); file_list_empty(&list); return 1; } } else if (keys_down & PSP2_CTRL_CIRCLE) { dir_up(cur_path); file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } vita2d_start_drawing(); vita2d_clear_screen(); font_draw_stringf(10, 10, WHITE, title); entry = list.head; for (i = 0; i < list.length; i++) { font_draw_stringf( 10, 40 + i*20, (!entry->is_dir && entry->supported) ? GREEN : WHITE, "%s %s", (selected == i) ? ">" : "", entry->name); entry = entry->next; } old_pad = pad; vita2d_end_drawing(); vita2d_swap_buffers(); } return 0; }
int file_choose(const char *start_path, char *chosen_file, const char *title, const char *supported_ext[]) { SceCtrlData pad, old_pad; unsigned int keys_down; int i; int selected = 0; char cur_path[PATH_MAX]; pad.buttons = old_pad.buttons = 0; strcpy(cur_path, start_path); file_list list; file_list_entry *entry; file_list_build(cur_path, &list, supported_ext); while (1) { sceCtrlPeekBufferPositive(0, &pad, 1); if (pad.buttons & SCE_CTRL_SELECT) break; keys_down = pad.buttons & ~old_pad.buttons; if (keys_down & SCE_CTRL_UP) { selected--; if (selected < list.scroll) { list.scroll--; } if (selected < 0) { selected = list.length - 1; list.scroll = max(0, list.length - LIST_MAX_ONSCREEN); } } else if (keys_down & SCE_CTRL_DOWN) { selected++; if (selected == list.scroll + LIST_MAX_ONSCREEN) { list.scroll++; } if (selected == list.length) { selected = 0; list.scroll = 0; } } if (keys_down & (SCE_CTRL_CROSS | SCE_CTRL_START)) { file_list_entry *entry = file_list_get_nth_entry(&list, selected); if (entry->is_dir) { if (strcmp(entry->name, "..") == 0) { dir_up(cur_path); } else { char new_path[PATH_MAX]; // no valid elf with new toolchain with sprintf(new_path, "%s/%s", cur_path, entry->name); sceClibSnprintf(new_path, PATH_MAX, "%s/%s", cur_path, entry->name); strcpy(cur_path, new_path); } file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } else if (entry->supported) { // no valid elf with new toolchain with sprintfsprintf(chosen_file, "%s/%s", cur_path, entry->name); sceClibSnprintf(chosen_file,PATH_MAX, "%s/%s", cur_path, entry->name); file_list_empty(&list); return 1; } } else if (keys_down & SCE_CTRL_CIRCLE) { dir_up(cur_path); file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } vita2d_start_drawing(); vita2d_clear_screen(); font_draw_stringf(10, 10, WHITE, title); entry = file_list_get_nth_entry(&list, list.scroll); for (i = list.scroll; i < min(list.length, list.scroll + LIST_MAX_ONSCREEN); i++) { font_draw_stringf( 10, 40 + (i - list.scroll)*20, (!entry->is_dir && entry->supported) ? GREEN : WHITE, "%s %s", (selected == i) ? ">" : "", entry->name); entry = entry->next; } old_pad = pad; vita2d_end_drawing(); vita2d_swap_buffers(); } return 0; }