static void glui_navigation_set(bool scroll) { menu_display_t *disp = menu_display_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); float scroll_pos = 0; if (!menu || !disp || !scroll) return; scroll_pos = glui_get_scroll(); if (menu->userdata) { unsigned height = 0, num_lines = 0, end = 0; glui_handle_t *glui = (glui_handle_t*)menu->userdata; menu_navigation_t *nav = menu_navigation_get_ptr(); video_driver_get_size(NULL, &height); num_lines = height / glui->line_height; end = menu_entries_get_end(); if (nav->selection_ptr < num_lines / 2 || end <= num_lines) menu_entries_set_start(0); else if (nav->selection_ptr < (end - num_lines / 2)) menu_entries_set_start(nav->selection_ptr - num_lines / 2); else menu_entries_set_start(end - num_lines); if (menu_entries_get_start() >= 5) menu_entries_set_start(menu_entries_get_start() - 5); } menu_animation_push(disp->animation, 10, scroll_pos, &menu->scroll_y, EASING_IN_OUT_QUAD, -1, NULL); }
static void glui_navigation_set(bool scroll) { menu_handle_t *menu = menu_driver_get_ptr(); if (!menu || !scroll) return; menu_animation_push(menu->animation, 10, glui_get_scroll(), &menu->scroll_y, EASING_IN_OUT_QUAD, NULL); }
static void mui_navigation_set(void *data, bool scroll) { mui_handle_t *mui = (mui_handle_t*)data; float scroll_pos = mui ? mui_get_scroll(mui) : 0.0f; if (!mui || !scroll) return; menu_animation_push(10, scroll_pos, &mui->scroll_y, EASING_IN_OUT_QUAD, -1, NULL); }
static void glui_navigation_set(bool scroll) { menu_display_t *disp = menu_display_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); float scroll_pos = glui_get_scroll(); if (!menu || !disp || !scroll) return; menu_animation_push(disp->animation, 10, scroll_pos, &menu->scroll_y, EASING_IN_OUT_QUAD, -1, NULL); }
void ozone_go_to_sidebar(ozone_handle_t *ozone, uintptr_t tag) { struct menu_animation_ctx_entry entry; ozone->selection_old = ozone->selection; ozone->cursor_in_sidebar_old = ozone->cursor_in_sidebar; ozone->cursor_in_sidebar = true; /* Cursor animation */ ozone->animations.cursor_alpha = 0.0f; entry.cb = NULL; entry.duration = ANIMATION_CURSOR_DURATION; entry.easing_enum = EASING_OUT_QUAD; entry.subject = &ozone->animations.cursor_alpha; entry.tag = tag; entry.target_value = 1.0f; entry.userdata = NULL; menu_animation_push(&entry); }
void ozone_leave_sidebar(ozone_handle_t *ozone, uintptr_t tag) { struct menu_animation_ctx_entry entry; if (ozone->empty_playlist) return; ozone->categories_active_idx_old = ozone->categories_selection_ptr; ozone->cursor_in_sidebar_old = ozone->cursor_in_sidebar; ozone->cursor_in_sidebar = false; /* Cursor animation */ ozone->animations.cursor_alpha = 0.0f; entry.cb = NULL; entry.duration = ANIMATION_CURSOR_DURATION; entry.easing_enum = EASING_OUT_QUAD; entry.subject = &ozone->animations.cursor_alpha; entry.tag = tag; entry.target_value = 1.0f; entry.userdata = NULL; menu_animation_push(&entry); }
bool menu_animation_ctl(enum menu_animation_ctl_state state, void *data) { static menu_animation_t anim; static retro_time_t cur_time = 0; static retro_time_t old_time = 0; static float delta_time = 0.0f; static bool animation_is_active = false; switch (state) { case MENU_ANIMATION_CTL_DEINIT: { size_t i; for (i = 0; i < anim.size; i++) { if (anim.list[i].subject) anim.list[i].subject = NULL; } free(anim.list); memset(&anim, 0, sizeof(menu_animation_t)); } cur_time = 0; old_time = 0; delta_time = 0.0f; break; case MENU_ANIMATION_CTL_IS_ACTIVE: return animation_is_active; case MENU_ANIMATION_CTL_CLEAR_ACTIVE: animation_is_active = false; break; case MENU_ANIMATION_CTL_SET_ACTIVE: animation_is_active = true; break; case MENU_ANIMATION_CTL_DELTA_TIME: { float *ptr = (float*)data; if (!ptr) return false; *ptr = delta_time; } break; case MENU_ANIMATION_CTL_UPDATE_TIME: { static retro_time_t last_clock_update = 0; settings_t *settings = config_get_ptr(); cur_time = cpu_features_get_time_usec(); delta_time = cur_time - old_time; if (delta_time >= IDEAL_DELTA_TIME* 4) delta_time = IDEAL_DELTA_TIME * 4; if (delta_time <= IDEAL_DELTA_TIME / 4) delta_time = IDEAL_DELTA_TIME / 4; old_time = cur_time; if (((cur_time - last_clock_update) > 1000000) && settings->menu.timedate_enable) { animation_is_active = true; last_clock_update = cur_time; } } break; case MENU_ANIMATION_CTL_UPDATE: { unsigned i; unsigned active_tweens = 0; float *dt = (float*)data; if (!dt) return false; for(i = 0; i < anim.size; i++) menu_animation_iterate(&anim, i, *dt, &active_tweens); if (!active_tweens) { anim.size = 0; anim.first_dead = 0; return false; } animation_is_active = true; } break; case MENU_ANIMATION_CTL_KILL_BY_TAG: { unsigned i; menu_animation_ctx_tag_t *tag = (menu_animation_ctx_tag_t*)data; if (!tag || tag->id == -1) return false; for (i = 0; i < anim.size; ++i) { if (anim.list[i].tag != tag->id) continue; anim.list[i].alive = false; anim.list[i].subject = NULL; if (i < anim.first_dead) anim.first_dead = i; } } break; case MENU_ANIMATION_CTL_KILL_BY_SUBJECT: { unsigned i, j, killed = 0; menu_animation_ctx_subject_t *subject = (menu_animation_ctx_subject_t*)data; float **sub = (float**)subject->data; for (i = 0; i < anim.size; ++i) { if (!anim.list[i].alive) continue; for (j = 0; j < subject->count; ++j) { if (anim.list[i].subject != sub[j]) continue; anim.list[i].alive = false; anim.list[i].subject = NULL; if (i < anim.first_dead) anim.first_dead = i; killed++; break; } } } break; case MENU_ANIMATION_CTL_TICKER: { menu_animation_ctx_ticker_t *ticker = (menu_animation_ctx_ticker_t*) data; size_t str_len = utf8len(ticker->str); size_t offset = 0; if ((size_t)str_len <= ticker->len) { utf8cpy(ticker->s, PATH_MAX_LENGTH, ticker->str, ticker->len); return true; } if (!ticker->selected) { utf8cpy(ticker->s, PATH_MAX_LENGTH, ticker->str, ticker->len - 3); strlcat(ticker->s, "...", PATH_MAX_LENGTH); return true; } menu_animation_ticker_generic( ticker->idx, ticker->len, &offset, &str_len); utf8cpy( ticker->s, PATH_MAX_LENGTH, utf8skip(ticker->str, offset), str_len); animation_is_active = true; } break; case MENU_ANIMATION_CTL_IDEAL_DELTA_TIME_GET: { menu_animation_ctx_delta_t *delta = (menu_animation_ctx_delta_t*)data; if (!delta) return false; delta->ideal = delta->current / IDEAL_DELTA_TIME; } break; case MENU_ANIMATION_CTL_PUSH: return menu_animation_push(&anim, data); case MENU_ANIMATION_CTL_NONE: default: break; } return true; }
void ozone_sidebar_goto(ozone_handle_t *ozone, unsigned new_selection) { unsigned video_info_height; struct menu_animation_ctx_entry entry; menu_animation_ctx_tag tag; float new_scroll; float selected_position_y; float current_selection_middle_onscreen; float bottom_boundary; float entries_middle; float entries_height; video_driver_get_size(NULL, &video_info_height); tag = (uintptr_t)ozone; if (ozone->categories_selection_ptr != new_selection) { ozone->categories_active_idx_old = ozone->categories_selection_ptr; ozone->categories_selection_ptr = new_selection; ozone->cursor_in_sidebar_old = ozone->cursor_in_sidebar; menu_animation_kill_by_tag(&tag); } /* Cursor animation */ ozone->animations.cursor_alpha = 0.0f; entry.cb = NULL; entry.duration = ANIMATION_CURSOR_DURATION; entry.easing_enum = EASING_OUT_QUAD; entry.subject = &ozone->animations.cursor_alpha; entry.tag = tag; entry.target_value = 1.0f; entry.userdata = NULL; menu_animation_push(&entry); /* Scroll animation */ new_scroll = 0; selected_position_y = ozone_get_selected_sidebar_y_position(ozone); current_selection_middle_onscreen = ozone->dimensions.header_height + 1 + ozone->animations.scroll_y_sidebar + selected_position_y + ozone->dimensions.sidebar_entry_height / 2; bottom_boundary = video_info_height - (ozone->dimensions.header_height + 1) - ozone->dimensions.footer_height; entries_middle = video_info_height/2; entries_height = ozone_get_sidebar_height(ozone); if (current_selection_middle_onscreen != entries_middle) new_scroll = ozone->animations.scroll_y_sidebar - (current_selection_middle_onscreen - entries_middle); if (new_scroll + entries_height < bottom_boundary) new_scroll = bottom_boundary - entries_height - ozone->dimensions.sidebar_padding_vertical; if (new_scroll > 0) new_scroll = 0; entry.cb = NULL; entry.duration = ANIMATION_CURSOR_DURATION; entry.easing_enum = EASING_OUT_QUAD; entry.subject = &ozone->animations.scroll_y_sidebar; entry.tag = tag; entry.target_value = new_scroll; entry.userdata = NULL; menu_animation_push(&entry); if (new_selection > ozone->system_tab_end) { ozone_change_tab(ozone, MENU_ENUM_LABEL_HORIZONTAL_MENU, MENU_SETTING_HORIZONTAL_MENU); } else { ozone_change_tab(ozone, ozone_system_tabs_idx[ozone->tabs[new_selection]], ozone_system_tabs_type[ozone->tabs[new_selection]]); } }