static void menu_list_flush_stack(menu_list_t *list, size_t idx, const char *needle, unsigned final_type) { bool refresh = false; const char *path = NULL; const char *label = NULL; unsigned type = 0; size_t entry_idx = 0; file_list_t *menu_list = menu_list_get(list, (unsigned)idx); if (!list) return; menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); file_list_get_last(menu_list, &path, &label, &type, &entry_idx); while (menu_list_flush_stack_type( needle, label, type, final_type) != 0) { size_t new_selection_ptr = menu_navigation_get_selection(); if (!menu_list_pop_stack(list, idx, &new_selection_ptr, 1)) break; menu_navigation_set_selection(new_selection_ptr); menu_list = menu_list_get(list, (unsigned)idx); file_list_get_last(menu_list, &path, &label, &type, &entry_idx); } }
static int action_right_scroll(unsigned type, const char *label, bool wraparound) { size_t scroll_accel = 0; unsigned scroll_speed = 0, fast_scroll_speed = 0; size_t selection = menu_navigation_get_selection(); if (!menu_driver_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, &scroll_accel)) return false; scroll_speed = (unsigned)((MAX(scroll_accel, 2) - 2) / 4 + 1); fast_scroll_speed = 4 + 4 * scroll_speed; if (selection + fast_scroll_speed < (menu_entries_get_size())) { size_t idx = selection + fast_scroll_speed; menu_navigation_set_selection(idx); menu_driver_navigation_set(true); } else { if ((menu_entries_get_size() > 0)) menu_driver_ctl(MENU_NAVIGATION_CTL_SET_LAST, NULL); } return 0; }
static int action_left_scroll(unsigned type, const char *label, bool wraparound) { size_t scroll_accel = 0; unsigned scroll_speed = 0, fast_scroll_speed = 0; size_t selection = menu_navigation_get_selection(); if (!menu_driver_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, &scroll_accel)) return false; scroll_speed = (unsigned)((MAX(scroll_accel, 2) - 2) / 4 + 1); fast_scroll_speed = 4 + 4 * scroll_speed; if (selection > fast_scroll_speed) { size_t idx = selection - fast_scroll_speed; menu_navigation_set_selection(idx); menu_driver_navigation_set(true); } else { bool pending_push = false; menu_driver_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); } return 0; }
/* Performs whatever actions are associated with menu entry 'i'. * * This is the most important function because it does all the work * associated with clicking on things in the UI. * * This includes loading cores and updating the * currently displayed menu. */ int menu_entry_select(uint32_t i) { menu_entry_t entry; menu_navigation_set_selection(i); menu_entry_init(&entry); menu_entry_get(&entry, 0, i, NULL, false); return menu_entry_action(&entry, i, MENU_ACTION_SELECT); }
static void menu_input_search_cb(void *userdata, const char *str) { size_t idx = 0; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); if (!selection_buf) return; if (str && *str && file_list_search(selection_buf, str, &idx)) { menu_navigation_set_selection(idx); menu_driver_navigation_set(true); } menu_input_dialog_end(); }
/** * Before a refresh, we could have deleted a * file on disk, causing selection_ptr to * suddendly be out of range. * * Ensure it doesn't overflow. **/ static bool menu_entries_refresh(void *data) { size_t list_size; file_list_t *list = (file_list_t*)data; size_t selection = menu_navigation_get_selection(); menu_entries_build_scroll_indices(list); list_size = menu_entries_get_size(); if ((selection >= list_size) && list_size) { size_t idx = list_size - 1; menu_navigation_set_selection(idx); menu_driver_navigation_set(true); } else if (!list_size) { bool pending_push = true; menu_driver_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); } return true; }