mirror of
https://github.com/libretro/RetroArch
synced 2025-04-07 13:23:32 +00:00
(Ozone) Ensure sidebar display status is updated correctly when performing rapid menu navigation (#12524)
This commit is contained in:
parent
6738fa57aa
commit
642d6c9fb8
@ -726,6 +726,7 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
|
|||||||
|
|
||||||
ozone->animations.thumbnail_bar_position = 0.0f;
|
ozone->animations.thumbnail_bar_position = 0.0f;
|
||||||
ozone->show_thumbnail_bar = false;
|
ozone->show_thumbnail_bar = false;
|
||||||
|
ozone->pending_hide_thumbnail_bar = false;
|
||||||
ozone->dimensions_sidebar_width = 0.0f;
|
ozone->dimensions_sidebar_width = 0.0f;
|
||||||
|
|
||||||
ozone->num_search_terms_old = 0;
|
ozone->num_search_terms_old = 0;
|
||||||
@ -1352,7 +1353,7 @@ static void ozone_context_reset(void *data, bool is_threaded)
|
|||||||
static void ozone_collapse_end(void *userdata)
|
static void ozone_collapse_end(void *userdata)
|
||||||
{
|
{
|
||||||
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
||||||
ozone->draw_sidebar = false;
|
ozone->draw_sidebar = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ozone_unload_thumbnail_textures(void *data)
|
static void ozone_unload_thumbnail_textures(void *data)
|
||||||
@ -3288,17 +3289,26 @@ static void ozone_list_open(ozone_handle_t *ozone, settings_t *settings)
|
|||||||
/* Sidebar animation */
|
/* Sidebar animation */
|
||||||
ozone_sidebar_update_collapse(ozone, settings, true);
|
ozone_sidebar_update_collapse(ozone, settings, true);
|
||||||
|
|
||||||
|
/* Kill any existing sidebar slide-in/out animations
|
||||||
|
* before pushing a new one
|
||||||
|
* > This is required since the 'ozone_collapse_end'
|
||||||
|
* callback from an unfinished slide-out animation
|
||||||
|
* may subsequently override the 'draw_sidebar'
|
||||||
|
* value set at the beginning of the next slide-in
|
||||||
|
* animation... */
|
||||||
|
gfx_animation_kill_by_tag(&sidebar_tag);
|
||||||
|
|
||||||
if (ozone->depth == 1)
|
if (ozone->depth == 1)
|
||||||
{
|
{
|
||||||
ozone->draw_sidebar = true;
|
ozone->draw_sidebar = true;
|
||||||
|
|
||||||
entry.cb = NULL;
|
entry.cb = NULL;
|
||||||
entry.duration = ANIMATION_PUSH_ENTRY_DURATION;
|
entry.duration = ANIMATION_PUSH_ENTRY_DURATION;
|
||||||
entry.easing_enum = EASING_OUT_QUAD;
|
entry.easing_enum = EASING_OUT_QUAD;
|
||||||
entry.subject = &ozone->sidebar_offset;
|
entry.subject = &ozone->sidebar_offset;
|
||||||
entry.tag = sidebar_tag;
|
entry.tag = sidebar_tag;
|
||||||
entry.target_value = 0.0f;
|
entry.target_value = 0.0f;
|
||||||
entry.userdata = NULL;
|
entry.userdata = NULL;
|
||||||
|
|
||||||
gfx_animation_push(&entry);
|
gfx_animation_push(&entry);
|
||||||
}
|
}
|
||||||
|
@ -298,6 +298,7 @@ struct ozone_handle
|
|||||||
bool cursor_mode;
|
bool cursor_mode;
|
||||||
bool sidebar_collapsed;
|
bool sidebar_collapsed;
|
||||||
bool show_thumbnail_bar;
|
bool show_thumbnail_bar;
|
||||||
|
bool pending_hide_thumbnail_bar;
|
||||||
bool fullscreen_thumbnails_available;
|
bool fullscreen_thumbnails_available;
|
||||||
bool show_fullscreen_thumbnails;
|
bool show_fullscreen_thumbnails;
|
||||||
bool selection_core_is_viewer;
|
bool selection_core_is_viewer;
|
||||||
|
@ -161,8 +161,9 @@ static void ozone_draw_entry_value(
|
|||||||
|
|
||||||
static void ozone_thumbnail_bar_hide_end(void *userdata)
|
static void ozone_thumbnail_bar_hide_end(void *userdata)
|
||||||
{
|
{
|
||||||
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
||||||
ozone->show_thumbnail_bar = false;
|
ozone->show_thumbnail_bar = false;
|
||||||
|
ozone->pending_hide_thumbnail_bar = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ozone_draw_no_thumbnail_available(
|
static void ozone_draw_no_thumbnail_available(
|
||||||
@ -437,34 +438,52 @@ void ozone_entries_update_thumbnail_bar(ozone_handle_t *ozone, bool is_playlist,
|
|||||||
|
|
||||||
gfx_animation_kill_by_tag(&tag);
|
gfx_animation_kill_by_tag(&tag);
|
||||||
|
|
||||||
/* Show it */
|
/* Show it
|
||||||
if (is_playlist && !ozone->cursor_in_sidebar && !ozone->show_thumbnail_bar && ozone->depth == 1)
|
* > We only want to trigger a 'show' animation
|
||||||
|
* if 'show_thumbnail_bar' is currently false.
|
||||||
|
* However: 'show_thumbnail_bar' is only set
|
||||||
|
* to false by the 'ozone_thumbnail_bar_hide_end'
|
||||||
|
* callback. If the above 'gfx_animation_kill_by_tag()'
|
||||||
|
* kills an existing 'hide' animation, then the
|
||||||
|
* callback will not fire - so the sidebar will be
|
||||||
|
* off screen, but a subsequent attempt to show it
|
||||||
|
* here will fail, since 'show_thumbnail_bar' will
|
||||||
|
* be a false positive. We therefore require an
|
||||||
|
* additional 'pending_hide_thumbnail_bar' parameter
|
||||||
|
* to track mid-animation state changes... */
|
||||||
|
if (is_playlist &&
|
||||||
|
!ozone->cursor_in_sidebar &&
|
||||||
|
(!ozone->show_thumbnail_bar || ozone->pending_hide_thumbnail_bar) &&
|
||||||
|
(ozone->depth == 1))
|
||||||
{
|
{
|
||||||
if (allow_animation)
|
if (allow_animation)
|
||||||
{
|
{
|
||||||
ozone->show_thumbnail_bar = true;
|
ozone->show_thumbnail_bar = true;
|
||||||
|
|
||||||
entry.cb = NULL;
|
entry.cb = NULL;
|
||||||
entry.userdata = NULL;
|
entry.userdata = NULL;
|
||||||
entry.target_value = ozone->dimensions.thumbnail_bar_width;
|
entry.target_value = ozone->dimensions.thumbnail_bar_width;
|
||||||
|
|
||||||
gfx_animation_push(&entry);
|
gfx_animation_push(&entry);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ozone->animations.thumbnail_bar_position = ozone->dimensions.thumbnail_bar_width;
|
ozone->animations.thumbnail_bar_position = ozone->dimensions.thumbnail_bar_width;
|
||||||
ozone->show_thumbnail_bar = true;
|
ozone->show_thumbnail_bar = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ozone->pending_hide_thumbnail_bar = false;
|
||||||
}
|
}
|
||||||
/* Hide it */
|
/* Hide it */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (allow_animation)
|
if (allow_animation)
|
||||||
{
|
{
|
||||||
entry.cb = ozone_thumbnail_bar_hide_end;
|
entry.cb = ozone_thumbnail_bar_hide_end;
|
||||||
entry.userdata = ozone;
|
entry.userdata = ozone;
|
||||||
entry.target_value = 0.0f;
|
entry.target_value = 0.0f;
|
||||||
|
|
||||||
|
ozone->pending_hide_thumbnail_bar = true;
|
||||||
gfx_animation_push(&entry);
|
gfx_animation_push(&entry);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -752,6 +752,7 @@ void ozone_refresh_sidebars(
|
|||||||
ozone->animations.thumbnail_bar_position = 0.0f;
|
ozone->animations.thumbnail_bar_position = 0.0f;
|
||||||
ozone->show_thumbnail_bar = false;
|
ozone->show_thumbnail_bar = false;
|
||||||
}
|
}
|
||||||
|
ozone->pending_hide_thumbnail_bar = false;
|
||||||
|
|
||||||
/* If sidebar is on-screen, update scroll position */
|
/* If sidebar is on-screen, update scroll position */
|
||||||
if (ozone->depth == 1)
|
if (ozone->depth == 1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user