diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 8f7ddb81d5..90e030f077 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -1212,14 +1212,21 @@ static float mui_get_scroll(mui_handle_t *mui) static void mui_navigation_set(void *data, bool scroll) { + menu_animation_ctx_entry_t entry; 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); + entry.duration = 10; + entry.target_value = scroll_pos; + entry.subject = &mui->scroll_y; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } static void mui_list_set_selection(void *data, file_list_t *list) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 69fab7afd0..5129724a14 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -658,14 +658,30 @@ static void xmb_selection_pointer_changed( } else { - menu_animation_push(XMB_DELAY, ia, &node->alpha, - EASING_IN_OUT_QUAD, tag.id, NULL); - menu_animation_push(XMB_DELAY, ia, &node->label_alpha, - EASING_IN_OUT_QUAD, tag.id, NULL); - menu_animation_push(XMB_DELAY, iz, &node->zoom, - EASING_IN_OUT_QUAD, tag.id, NULL); - menu_animation_push(XMB_DELAY, iy, &node->y, - EASING_IN_OUT_QUAD, tag.id, NULL); + menu_animation_ctx_entry_t entry; + + entry.duration = XMB_DELAY; + entry.target_value = ia; + entry.subject = &node->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = tag.id; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.subject = &node->label_alpha; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = iz; + entry.subject = &node->zoom; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = iy; + entry.subject = &node->y; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } } @@ -708,13 +724,26 @@ static void xmb_list_open_old(xmb_handle_t *xmb, } else { - menu_animation_push( - XMB_DELAY, ia, &node->alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, 0, &node->label_alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, xmb->icon.size * dir * -2, &node->x, - EASING_IN_OUT_QUAD, -1, NULL); + menu_animation_ctx_entry_t entry; + + entry.duration = XMB_DELAY; + entry.target_value = ia; + entry.subject = &node->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = 0; + entry.subject = &node->label_alpha; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = xmb->icon.size * dir * -2; + entry.subject = &node->x; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } } } @@ -765,12 +794,25 @@ static void xmb_list_open_new(xmb_handle_t *xmb, } else { - menu_animation_push( - XMB_DELAY, ia, &node->alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, ia, &node->label_alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, 0, &node->x, EASING_IN_OUT_QUAD, -1, NULL); + menu_animation_ctx_entry_t entry; + + entry.duration = XMB_DELAY; + entry.target_value = ia; + entry.subject = &node->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.subject = &node->label_alpha; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = 0; + entry.subject = &node->x; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } } @@ -812,12 +854,25 @@ static xmb_node_t* xmb_get_userdata_from_horizontal_list( static void xmb_push_animations(xmb_node_t *node, float ia, float ix) { - menu_animation_push( - XMB_DELAY, ia, &node->alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, ia, &node->label_alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, ix, &node->x, EASING_IN_OUT_QUAD, -1, NULL); + menu_animation_ctx_entry_t entry; + + entry.duration = XMB_DELAY; + entry.target_value = ia; + entry.subject = &node->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.subject = &node->label_alpha; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = ix; + entry.subject = &node->x; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } static void xmb_list_switch_old(xmb_handle_t *xmb, @@ -955,6 +1010,7 @@ static void xmb_list_switch_horizontal_list(xmb_handle_t *xmb) for (j = 0; j <= list_size; j++) { + menu_animation_ctx_entry_t entry; float ia = XMB_CATEGORIES_PASSIVE_ALPHA; float iz = XMB_CATEGORIES_PASSIVE_ZOOM; xmb_node_t *node = xmb_get_node(xmb, j); @@ -968,15 +1024,25 @@ static void xmb_list_switch_horizontal_list(xmb_handle_t *xmb) iz = XMB_CATEGORIES_ACTIVE_ZOOM; } - menu_animation_push( - XMB_DELAY, ia, &node->alpha, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, iz, &node->zoom, EASING_IN_OUT_QUAD, -1, NULL); + entry.duration = XMB_DELAY; + entry.target_value = ia; + entry.subject = &node->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = iz; + entry.subject = &node->zoom; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } } static void xmb_list_switch(xmb_handle_t *xmb) { + menu_animation_ctx_entry_t entry; size_t selection; int dir = -1; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); @@ -992,9 +1058,14 @@ static void xmb_list_switch(xmb_handle_t *xmb) xmb_list_switch_horizontal_list(xmb); - menu_animation_push(XMB_DELAY, - xmb->icon.spacing.horizontal * -(float)xmb->categories.selection_ptr, - &xmb->categories.x_pos, EASING_IN_OUT_QUAD, -1, NULL); + entry.duration = XMB_DELAY; + entry.target_value = xmb->icon.spacing.horizontal * -(float)xmb->categories.selection_ptr; + entry.subject = &xmb->categories.x_pos; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); dir = -1; if (xmb->categories.selection_ptr > xmb->categories.selection_ptr_old) @@ -1020,6 +1091,7 @@ static void xmb_list_open_horizontal_list(xmb_handle_t *xmb) for (j = 0; j <= list_size; j++) { + menu_animation_ctx_entry_t entry; float ia = 0; xmb_node_t *node = xmb_get_node(xmb, j); @@ -1031,8 +1103,14 @@ static void xmb_list_open_horizontal_list(xmb_handle_t *xmb) else if (xmb->depth <= 1) ia = XMB_CATEGORIES_PASSIVE_ALPHA; - menu_animation_push(XMB_DELAY, ia, - &node->alpha, EASING_IN_OUT_QUAD, -1, NULL); + entry.duration = XMB_DELAY; + entry.target_value = ia; + entry.subject = &node->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); } } @@ -1230,6 +1308,8 @@ static int xmb_environ(menu_environ_cb_t type, void *data, void *userdata) static void xmb_list_open(xmb_handle_t *xmb) { + menu_animation_ctx_entry_t entry; + size_t selection; int dir = 0; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); @@ -1251,23 +1331,32 @@ static void xmb_list_open(xmb_handle_t *xmb) xmb_list_open_new(xmb, selection_buf, dir, selection); + + entry.duration = XMB_DELAY; + entry.target_value = xmb->icon.size * -(xmb->depth*2-2); + entry.subject = &xmb->x; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + switch (xmb->depth) { case 1: - menu_animation_push( - XMB_DELAY, xmb->icon.size * -(xmb->depth*2-2), - &xmb->x, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, 0, &xmb->textures.arrow.alpha, - EASING_IN_OUT_QUAD, -1, NULL); + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = 0; + entry.subject = &xmb->textures.arrow.alpha; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); break; case 2: - menu_animation_push( - XMB_DELAY, xmb->icon.size * -(xmb->depth*2-2), - &xmb->x, EASING_IN_OUT_QUAD, -1, NULL); - menu_animation_push( - XMB_DELAY, 1, &xmb->textures.arrow.alpha, - EASING_IN_OUT_QUAD, -1, NULL); + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); + + entry.target_value = 1; + entry.subject = &xmb->textures.arrow.alpha; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); break; } @@ -2677,6 +2766,7 @@ static void xmb_context_destroy(void *data) static void xmb_toggle(void *userdata, bool menu_on) { + menu_animation_ctx_entry_t entry; bool tmp = false; xmb_handle_t *xmb = (xmb_handle_t*)userdata; @@ -2691,8 +2781,14 @@ static void xmb_toggle(void *userdata, bool menu_on) return; } - menu_animation_push(XMB_DELAY, 1.0f, - &xmb->alpha, EASING_IN_OUT_QUAD, -1, NULL); + entry.duration = XMB_DELAY; + entry.target_value = 1.0f; + entry.subject = &xmb->alpha; + entry.easing_enum = EASING_IN_OUT_QUAD; + entry.tag = -1; + entry.cb = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_PUSH, &entry); tmp = !menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL); diff --git a/menu/menu_animation.c b/menu/menu_animation.c index e512626ea6..41ebaf65d9 100644 --- a/menu/menu_animation.c +++ b/menu/menu_animation.c @@ -375,25 +375,26 @@ static void menu_animation_push_internal(menu_animation_t *anim, *target = *t; } -bool menu_animation_push(float duration, float target_value, float* subject, - enum menu_animation_easing_type easing_enum, int tag, tween_cb cb) +static bool menu_animation_push(menu_animation_t *anim, void *data) { struct tween t; - menu_animation_t *anim = menu_animation_get_ptr(); + menu_animation_ctx_entry_t *entry = + (menu_animation_ctx_entry_t*)data; - if (!subject) + if (!entry || !entry->subject) return false; t.alive = true; - t.duration = duration; + t.duration = entry->duration; t.running_since = 0; - t.initial_value = *subject; - t.target_value = target_value; - t.subject = subject; - t.tag = tag; - t.cb = cb; + t.initial_value = *entry->subject; + t.target_value = entry->target_value; + t.subject = entry->subject; + t.tag = entry->tag; + t.cb = entry->cb; + t.easing = NULL; - switch (easing_enum) + switch (entry->easing_enum) { case EASING_LINEAR: t.easing = &easing_linear; @@ -503,7 +504,6 @@ bool menu_animation_push(float duration, float target_value, float* subject, t.easing = &easing_out_in_bounce; break; default: - t.easing = NULL; break; } @@ -700,6 +700,8 @@ bool menu_animation_ctl(enum menu_animation_ctl_state state, void *data) animation_is_active = true; } break; + case MENU_ANIMATION_CTL_PUSH: + return menu_animation_push(anim, data); case MENU_ANIMATION_CTL_NONE: default: break; diff --git a/menu/menu_animation.h b/menu/menu_animation.h index a8268c90f1..19dd329e81 100644 --- a/menu/menu_animation.h +++ b/menu/menu_animation.h @@ -44,7 +44,8 @@ enum menu_animation_ctl_state MENU_ANIMATION_CTL_UPDATE, MENU_ANIMATION_CTL_KILL_BY_TAG, MENU_ANIMATION_CTL_KILL_BY_SUBJECT, - MENU_ANIMATION_CTL_TICKER + MENU_ANIMATION_CTL_TICKER, + MENU_ANIMATION_CTL_PUSH }; enum menu_animation_easing_type @@ -104,6 +105,16 @@ typedef struct menu_animation_ctx_subject const void *data; } menu_animation_ctx_subject_t; +typedef struct menu_animation_ctx_entry +{ + float duration; + float target_value; + float *subject; + enum menu_animation_easing_type easing_enum; + int tag; + tween_cb cb; +} menu_animation_ctx_entry_t; + typedef struct menu_animation_ctx_ticker { char *s; @@ -113,10 +124,6 @@ typedef struct menu_animation_ctx_ticker bool selected; } menu_animation_ctx_ticker_t; -/* Use -1 for untagged */ -bool menu_animation_push(float duration, float target_value, float* subject, - enum menu_animation_easing_type easing_enum, int tag, tween_cb cb); - bool menu_animation_ctl(enum menu_animation_ctl_state state, void *data); #ifdef __cplusplus