(Ozone+XMB) Savestate thumbnail fullscreen + dropdown (#14116)

* (Ozone+XMB) Savestate thumbnail fullscreen toggle

* (Ozone+XMB) Savestate thumbnail dropdown
This commit is contained in:
sonninnos 2022-07-02 00:41:46 +03:00 committed by GitHub
parent f4803b1023
commit 0232fc8e10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 320 additions and 87 deletions

View File

@ -95,7 +95,7 @@
#define SIDEBAR_ENTRY_ICON_PADDING 15 #define SIDEBAR_ENTRY_ICON_PADDING 15
#define SIDEBAR_GRADIENT_HEIGHT 28 #define SIDEBAR_GRADIENT_HEIGHT 28
#define FULLSCREEN_THUMBNAIL_PADDING 48 #define FULLSCREEN_THUMBNAIL_PADDING 32
#define CURSOR_SIZE 64 #define CURSOR_SIZE 64
/* Cursor becomes active when it moves more /* Cursor becomes active when it moves more
@ -446,7 +446,6 @@ struct ozone_handle
gfx_thumbnail_t savestate; gfx_thumbnail_t savestate;
float stream_delay; float stream_delay;
enum ozone_pending_thumbnail_type pending; enum ozone_pending_thumbnail_type pending;
bool show_savestate;
} thumbnails; } thumbnails;
uintptr_t textures[OZONE_THEME_TEXTURE_LAST]; uintptr_t textures[OZONE_THEME_TEXTURE_LAST];
uintptr_t icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_LAST]; uintptr_t icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_LAST];
@ -454,6 +453,7 @@ struct ozone_handle
size_t categories_selection_ptr; /* active tab id */ size_t categories_selection_ptr; /* active tab id */
size_t categories_active_idx_old; size_t categories_active_idx_old;
size_t playlist_index;
size_t selection; /* currently selected entry */ size_t selection; /* currently selected entry */
size_t selection_old; /* previously selected entry (for fancy animation) */ size_t selection_old; /* previously selected entry (for fancy animation) */
@ -603,7 +603,9 @@ struct ozone_handle
bool show_screensaver; bool show_screensaver;
bool cursor_mode; bool cursor_mode;
bool sidebar_collapsed; bool sidebar_collapsed;
bool want_thumbnail_bar;
bool show_thumbnail_bar; bool show_thumbnail_bar;
bool skip_thumbnail_reset;
bool pending_hide_thumbnail_bar; bool pending_hide_thumbnail_bar;
bool fullscreen_thumbnails_available; bool fullscreen_thumbnails_available;
bool show_fullscreen_thumbnails; bool show_fullscreen_thumbnails;
@ -614,8 +616,10 @@ struct ozone_handle
bool is_db_manager_list; bool is_db_manager_list;
bool is_file_list; bool is_file_list;
bool is_quick_menu; bool is_quick_menu;
bool is_state_slot;
bool is_contentless_cores; bool is_contentless_cores;
bool first_frame; bool first_frame;
bool libretro_running;
struct struct
{ {
@ -3286,9 +3290,6 @@ static void ozone_thumbnail_bar_hide_end(void *userdata)
ozone->pending_hide_thumbnail_bar = false; ozone->pending_hide_thumbnail_bar = false;
} }
static void ozone_entries_update_thumbnail_bar(
ozone_handle_t *ozone, bool is_playlist, bool allow_animation, bool update_savestate);
static void ozone_update_savestate_thumbnail_path(void *data, unsigned i) static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
{ {
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
@ -3308,8 +3309,8 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
ozone->savestate_thumbnail_file_path[0] = '\0'; ozone->savestate_thumbnail_file_path[0] = '\0';
/* Savestate thumbnails are only relevant /* Savestate thumbnails are only relevant
* when viewing the quick menu */ * when viewing the running quick menu or state slots */
if (!ozone->is_quick_menu) if (!((ozone->is_quick_menu || ozone->is_state_slot) && ozone->libretro_running))
return; return;
if (savestate_thumbnail_enable) if (savestate_thumbnail_enable)
@ -3325,10 +3326,8 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
if (!string_is_empty(entry.label)) if (!string_is_empty(entry.label))
{ {
ozone->thumbnails.show_savestate = false; if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT ||
ozone->selection_core_is_viewer = false; string_is_equal(entry.label, "state_slot") ||
if (string_is_equal(entry.label, "state_slot") ||
string_is_equal(entry.label, "loadstate") || string_is_equal(entry.label, "loadstate") ||
string_is_equal(entry.label, "savestate")) string_is_equal(entry.label, "savestate"))
{ {
@ -3337,6 +3336,13 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
path[0] = '\0'; path[0] = '\0';
/* State slot dropdown */
if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT)
{
state_slot = i - 1;
ozone->is_state_slot = true;
}
if (state_slot > 0) if (state_slot > 0)
snprintf(path, sizeof(path), "%s%d", snprintf(path, sizeof(path), "%s%d",
runloop_st->name.savestate, state_slot); runloop_st->name.savestate, state_slot);
@ -3354,17 +3360,25 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
ozone->savestate_thumbnail_file_path, path, ozone->savestate_thumbnail_file_path, path,
sizeof(ozone->savestate_thumbnail_file_path)); sizeof(ozone->savestate_thumbnail_file_path));
ozone->thumbnails.show_savestate = true; ozone->want_thumbnail_bar = true;
ozone->selection_core_is_viewer = true; ozone->fullscreen_thumbnails_available = true;
} }
else if (!ozone->is_state_slot)
{
ozone->want_thumbnail_bar = false;
ozone->fullscreen_thumbnails_available = false;
}
else
ozone->fullscreen_thumbnails_available = false;
}
else
{
ozone->want_thumbnail_bar = false;
ozone->fullscreen_thumbnails_available = false;
} }
/* Reset other images, otherwise they will flash if (ozone->show_thumbnail_bar != ozone->want_thumbnail_bar)
* when sidebar closing animation starts */ ozone->need_compute = true;
gfx_thumbnail_reset(&ozone->thumbnails.left);
gfx_thumbnail_reset(&ozone->thumbnails.right);
ozone_entries_update_thumbnail_bar(ozone, false, true, false);
} }
} }
} }
@ -3379,8 +3393,8 @@ static void ozone_update_savestate_thumbnail_image(void *data)
return; return;
/* Savestate thumbnails are only relevant /* Savestate thumbnails are only relevant
* when viewing the quick menu */ * when viewing the running quick menu or state slots */
if (!ozone->is_quick_menu) if (!((ozone->is_quick_menu || ozone->is_state_slot) && ozone->libretro_running))
return; return;
/* If path is empty, just reset thumbnail */ /* If path is empty, just reset thumbnail */
@ -3403,7 +3417,7 @@ static void ozone_update_savestate_thumbnail_image(void *data)
} }
static void ozone_entries_update_thumbnail_bar( static void ozone_entries_update_thumbnail_bar(
ozone_handle_t *ozone, bool is_playlist, bool allow_animation, bool update_savestate) ozone_handle_t *ozone, bool is_playlist, bool allow_animation)
{ {
struct gfx_animation_ctx_entry entry; struct gfx_animation_ctx_entry entry;
uintptr_t tag = (uintptr_t)&ozone->show_thumbnail_bar; uintptr_t tag = (uintptr_t)&ozone->show_thumbnail_bar;
@ -3411,6 +3425,9 @@ static void ozone_entries_update_thumbnail_bar(
bool savestate_thumbnail_enable bool savestate_thumbnail_enable
= settings ? settings->bools.savestate_thumbnail_enable : false; = settings ? settings->bools.savestate_thumbnail_enable : false;
if (!savestate_thumbnail_enable)
ozone->is_state_slot = false;
entry.duration = ANIMATION_CURSOR_DURATION; entry.duration = ANIMATION_CURSOR_DURATION;
entry.easing_enum = EASING_OUT_QUAD; entry.easing_enum = EASING_OUT_QUAD;
entry.tag = tag; entry.tag = tag;
@ -3431,11 +3448,14 @@ static void ozone_entries_update_thumbnail_bar(
* be a false positive. We therefore require an * be a false positive. We therefore require an
* additional 'pending_hide_thumbnail_bar' parameter * additional 'pending_hide_thumbnail_bar' parameter
* to track mid-animation state changes... */ * to track mid-animation state changes... */
if ((is_playlist && if ( !ozone->cursor_in_sidebar &&
!ozone->cursor_in_sidebar && (!ozone->show_thumbnail_bar || ozone->pending_hide_thumbnail_bar) &&
(!ozone->show_thumbnail_bar || ozone->pending_hide_thumbnail_bar) && (
(ozone->depth == 1)) || (is_playlist && ozone->depth == 1) ||
(ozone->is_quick_menu && ozone->thumbnails.show_savestate)) (ozone->want_thumbnail_bar) ||
(ozone->is_state_slot)
)
)
{ {
if (allow_animation) if (allow_animation)
{ {
@ -3461,7 +3481,8 @@ static void ozone_entries_update_thumbnail_bar(
gfx_thumbnail_set_stream_delay(ozone->thumbnails.stream_delay); gfx_thumbnail_set_stream_delay(ozone->thumbnails.stream_delay);
} }
/* Hide it */ /* Hide it */
else else if (ozone->cursor_in_sidebar ||
(ozone->show_thumbnail_bar && !ozone->want_thumbnail_bar && !ozone->is_state_slot))
{ {
if (allow_animation) if (allow_animation)
{ {
@ -3478,16 +3499,6 @@ static void ozone_entries_update_thumbnail_bar(
ozone_thumbnail_bar_hide_end(ozone); ozone_thumbnail_bar_hide_end(ozone);
} }
} }
if (savestate_thumbnail_enable && ozone->is_quick_menu && update_savestate)
{
/* This shows savestate thumbnail after
* - Opening savestate submenu,
* - Returning from state slot dropdown,
* - Toggling menu while thumbnail visible */
ozone_update_savestate_thumbnail_path(ozone, menu_navigation_get_selection());
ozone_update_savestate_thumbnail_image(ozone);
}
} }
static bool ozone_is_playlist(ozone_handle_t *ozone, bool depth) static bool ozone_is_playlist(ozone_handle_t *ozone, bool depth)
@ -3607,7 +3618,7 @@ static void ozone_sidebar_update_collapse(
} }
} }
ozone_entries_update_thumbnail_bar(ozone, is_playlist, allow_animation, true); ozone_entries_update_thumbnail_bar(ozone, is_playlist, allow_animation);
} }
@ -3695,6 +3706,9 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone)
playlist_index = list->list[selection].entry_idx; playlist_index = list->list[selection].entry_idx;
} }
/* Remember playlist index for Quick Menu fullscreen thumbnail title */
ozone->playlist_index = playlist_index;
/* Fill entry enumeration */ /* Fill entry enumeration */
if (show_entry_idx) if (show_entry_idx)
{ {
@ -4134,8 +4148,12 @@ static void ozone_refresh_sidebars(
} }
/* Set thumbnail bar position */ /* Set thumbnail bar position */
if ((is_playlist && !ozone->cursor_in_sidebar && ozone->depth == 1) || if ( !ozone->cursor_in_sidebar &&
(ozone->is_quick_menu && ozone->thumbnails.show_savestate && ozone->depth >= 2)) ( (is_playlist && ozone->depth == 1) ||
(ozone->want_thumbnail_bar) ||
(ozone->is_state_slot)
)
)
{ {
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;
@ -4755,6 +4773,9 @@ static void ozone_compute_entries_position(
int entry_padding = ozone_get_entries_padding(ozone); int entry_padding = ozone_get_entries_padding(ozone);
float scale_factor = ozone->last_scale_factor; float scale_factor = ozone->last_scale_factor;
if (ozone->show_thumbnail_bar != ozone->want_thumbnail_bar)
ozone_entries_update_thumbnail_bar(ozone, false, true);
menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i);
selection_buf = menu_entries_get_selection_buf_ptr(0); selection_buf = menu_entries_get_selection_buf_ptr(0);
@ -4812,12 +4833,10 @@ static void ozone_compute_entries_position(
entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2; entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2;
if (ozone->depth == 1) if (ozone->depth == 1)
{
sublabel_max_width -= (unsigned) ozone->dimensions_sidebar_width; sublabel_max_width -= (unsigned) ozone->dimensions_sidebar_width;
if (ozone->show_thumbnail_bar) if (ozone->show_thumbnail_bar && !ozone->libretro_running)
sublabel_max_width -= ozone->dimensions.thumbnail_bar_width; sublabel_max_width -= ozone->dimensions.thumbnail_bar_width;
}
(ozone->word_wrap)(wrapped_sublabel_str, sizeof(wrapped_sublabel_str), entry.sublabel, (ozone->word_wrap)(wrapped_sublabel_str, sizeof(wrapped_sublabel_str), entry.sublabel,
sublabel_max_width / sublabel_max_width /
@ -5132,13 +5151,10 @@ border_iterate:
entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2; entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2;
if (ozone->depth == 1) if (ozone->depth == 1)
{ sublabel_max_width -= (unsigned) ozone->dimensions_sidebar_width;
sublabel_max_width -= (unsigned)
ozone->dimensions_sidebar_width;
if (ozone->show_thumbnail_bar) if (ozone->show_thumbnail_bar && !ozone->libretro_running)
sublabel_max_width -= ozone->dimensions.thumbnail_bar_width; sublabel_max_width -= ozone->dimensions.thumbnail_bar_width;
}
wrapped_sublabel_str[0] = '\0'; wrapped_sublabel_str[0] = '\0';
(ozone->word_wrap)(wrapped_sublabel_str, sizeof(wrapped_sublabel_str), (ozone->word_wrap)(wrapped_sublabel_str, sizeof(wrapped_sublabel_str),
@ -5420,18 +5436,36 @@ static void ozone_draw_thumbnail_bar(
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT) && gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT) &&
!ozone->selection_core_is_viewer; !ozone->selection_core_is_viewer;
if (ozone->thumbnails.show_savestate) if (ozone->is_quick_menu && !ozone->libretro_running)
ozone->selection_core_is_viewer = false;
/* Special "viewer" mode for savestate thumbnails */
if ((ozone->want_thumbnail_bar && !string_is_empty(ozone->savestate_thumbnail_file_path)) ||
ozone->is_state_slot)
{ {
ozone->selection_core_is_viewer = true;
show_right_thumbnail = true;
show_left_thumbnail = false;
if (ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_AVAILABLE || if (ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_AVAILABLE ||
ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING) ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING)
{ {
show_right_thumbnail = true;
thumbnail_width = sidebar_width; thumbnail_width = sidebar_width;
thumbnail_height = (video_height - ozone->dimensions.header_height - ozone->dimensions.footer_height) / 2; thumbnail_height = (video_height - ozone->dimensions.header_height - ozone->dimensions.footer_height) / 2;
thumbnail_x_position = x_position - (ozone->dimensions.sidebar_entry_icon_padding * 2); thumbnail_x_position = x_position - (ozone->dimensions.sidebar_entry_icon_padding * 2);
} }
else else
return; {
if (ozone->is_state_slot)
show_right_thumbnail = false;
else
return;
}
}
else if (!ozone->want_thumbnail_bar)
{
ozone->selection_core_is_viewer = false;
return;
} }
/* If this entry is associated with the image viewer /* If this entry is associated with the image viewer
@ -6271,6 +6305,9 @@ static void ozone_show_fullscreen_thumbnails(ozone_handle_t *ozone)
uintptr_t alpha_tag = (uintptr_t)&ozone->animations.fullscreen_thumbnail_alpha; uintptr_t alpha_tag = (uintptr_t)&ozone->animations.fullscreen_thumbnail_alpha;
uintptr_t scroll_tag = (uintptr_t)selection_buf; uintptr_t scroll_tag = (uintptr_t)selection_buf;
char tmpstr[64];
tmpstr[0] = '\0';
/* Before showing fullscreen thumbnails, must /* Before showing fullscreen thumbnails, must
* ensure that any existing fullscreen thumbnail * ensure that any existing fullscreen thumbnail
* view is disabled... */ * view is disabled... */
@ -6294,7 +6331,8 @@ static void ozone_show_fullscreen_thumbnails(ozone_handle_t *ozone)
if (!gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT)) if (!gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT))
return; return;
if (ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_AVAILABLE) if (ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_AVAILABLE &&
ozone->thumbnails.savestate.status != GFX_THUMBNAIL_STATUS_AVAILABLE)
return; return;
} }
else else
@ -6339,9 +6377,36 @@ static void ozone_show_fullscreen_thumbnails(ozone_handle_t *ozone)
/* > Get entry label */ /* > Get entry label */
if (!string_is_empty(selected_entry.rich_label)) if (!string_is_empty(selected_entry.rich_label))
thumbnail_label = selected_entry.rich_label; thumbnail_label = selected_entry.rich_label;
/* > State slot label */
else if (ozone->is_quick_menu && (
string_is_equal(selected_entry.label, "state_slot") ||
string_is_equal(selected_entry.label, "loadstate") ||
string_is_equal(selected_entry.label, "savestate")
))
{
snprintf(tmpstr, sizeof(tmpstr), "%s %d",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
config_get_ptr()->ints.state_slot);
thumbnail_label = tmpstr;
}
else if (string_to_unsigned(selected_entry.label) == MENU_ENUM_LABEL_STATE_SLOT)
{
snprintf(tmpstr, sizeof(tmpstr), "%s %s",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
selected_entry.path);
thumbnail_label = tmpstr;
}
/* > Quick Menu playlist label */
else if (ozone->is_quick_menu)
{
const struct playlist_entry *entry = NULL;
playlist_get_index(playlist_get_cached(), ozone->playlist_index, &entry);
if (entry)
thumbnail_label = entry->label;
}
else else
thumbnail_label = selected_entry.path; thumbnail_label = selected_entry.path;
/* > Sanity check */ /* > Sanity check */
if (!string_is_empty(thumbnail_label)) if (!string_is_empty(thumbnail_label))
@ -6444,6 +6509,14 @@ static void ozone_draw_fullscreen_thumbnails(
show_right_thumbnail = (right_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE); show_right_thumbnail = (right_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE);
show_left_thumbnail = (left_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE); show_left_thumbnail = (left_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE);
if ((ozone->is_quick_menu && !string_is_empty(ozone->savestate_thumbnail_file_path)) ||
ozone->is_state_slot)
{
left_thumbnail = &ozone->thumbnails.savestate;
show_left_thumbnail = (left_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE);
show_right_thumbnail = false;
}
if (show_right_thumbnail) if (show_right_thumbnail)
num_thumbnails++; num_thumbnails++;
@ -7030,6 +7103,8 @@ static enum menu_action ozone_parse_menu_entry_action(
* detection becomes too cumbersome... */ * detection becomes too cumbersome... */
if (ozone->is_file_list || if (ozone->is_file_list ||
ozone->is_db_manager_list || ozone->is_db_manager_list ||
ozone->is_quick_menu ||
ozone->is_state_slot ||
((action != MENU_ACTION_SELECT) && ((action != MENU_ACTION_SELECT) &&
(action != MENU_ACTION_OK))) (action != MENU_ACTION_OK)))
return MENU_ACTION_NOOP; return MENU_ACTION_NOOP;
@ -7054,6 +7129,9 @@ static enum menu_action ozone_parse_menu_entry_action(
{ {
case MENU_ACTION_START: case MENU_ACTION_START:
ozone->cursor_mode = false; ozone->cursor_mode = false;
if (ozone->is_quick_menu && ozone->libretro_running)
break;
/* If this is a menu with thumbnails and cursor /* If this is a menu with thumbnails and cursor
* is not in the sidebar, attempt to show * is not in the sidebar, attempt to show
* fullscreen thumbnail view */ * fullscreen thumbnail view */
@ -7176,6 +7254,7 @@ static enum menu_action ozone_parse_menu_entry_action(
break; break;
case MENU_ACTION_OK: case MENU_ACTION_OK:
ozone->cursor_mode = false; ozone->cursor_mode = false;
if (ozone->cursor_in_sidebar) if (ozone->cursor_in_sidebar)
{ {
if (!ozone->empty_playlist) if (!ozone->empty_playlist)
@ -7271,7 +7350,17 @@ static enum menu_action ozone_parse_menu_entry_action(
ozone->cursor_mode = false; ozone->cursor_mode = false;
break; break;
case MENU_ACTION_SCAN:
ozone->cursor_mode = false;
if (ozone->fullscreen_thumbnails_available &&
((ozone->is_quick_menu && !string_is_empty(ozone->savestate_thumbnail_file_path)) ||
(ozone->is_state_slot)))
{
ozone_show_fullscreen_thumbnails(ozone);
new_action = MENU_ACTION_NOOP;
}
break;
default: default:
/* In all other cases, pass through input /* In all other cases, pass through input
* menu action without intervention */ * menu action without intervention */
@ -7598,15 +7687,21 @@ static void ozone_free(void *data)
static void ozone_update_thumbnail_image(void *data) static void ozone_update_thumbnail_image(void *data)
{ {
ozone_handle_t *ozone = (ozone_handle_t*)data; ozone_handle_t *ozone = (ozone_handle_t*)data;
const char *thumbnail_path = NULL;
bool has_thumbnail = false;
if (!ozone) if (!ozone)
return; return;
ozone->thumbnails.pending = OZONE_PENDING_THUMBNAIL_NONE; ozone->thumbnails.pending = OZONE_PENDING_THUMBNAIL_NONE;
gfx_thumbnail_cancel_pending_requests(); gfx_thumbnail_cancel_pending_requests();
gfx_thumbnail_reset(&ozone->thumbnails.right);
gfx_thumbnail_reset(&ozone->thumbnails.left); if (!ozone->skip_thumbnail_reset)
{
gfx_thumbnail_reset(&ozone->thumbnails.right);
gfx_thumbnail_reset(&ozone->thumbnails.left);
}
/* Right thumbnail */ /* Right thumbnail */
if (gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, if (gfx_thumbnail_is_enabled(ozone->thumbnail_path_data,
@ -7621,6 +7716,10 @@ static void ozone_update_thumbnail_image(void *data)
ozone->thumbnails.pending = ozone->thumbnails.pending =
(ozone->thumbnails.pending == OZONE_PENDING_THUMBNAIL_RIGHT) ? (ozone->thumbnails.pending == OZONE_PENDING_THUMBNAIL_RIGHT) ?
OZONE_PENDING_THUMBNAIL_BOTH : OZONE_PENDING_THUMBNAIL_LEFT; OZONE_PENDING_THUMBNAIL_BOTH : OZONE_PENDING_THUMBNAIL_LEFT;
has_thumbnail = gfx_thumbnail_get_path(ozone->thumbnail_path_data, 0, &thumbnail_path);
if (has_thumbnail && !ozone->libretro_running)
ozone->want_thumbnail_bar = true;
} }
static void ozone_refresh_thumbnail_image(void *data, unsigned i) static void ozone_refresh_thumbnail_image(void *data, unsigned i)
@ -7634,7 +7733,8 @@ static void ozone_refresh_thumbnail_image(void *data, unsigned i)
* and we are currently viewing a playlist */ * and we are currently viewing a playlist */
if ((gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) || if ((gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) ||
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) && gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT)) &&
(ozone->is_playlist && ozone->depth == 1)) ((ozone->is_playlist && ozone->depth == 1) ||
(ozone->is_quick_menu && ozone->want_thumbnail_bar)))
ozone_update_thumbnail_image(ozone); ozone_update_thumbnail_image(ozone);
} }
@ -8747,7 +8847,8 @@ static void ozone_render(void *data,
ozone_update_thumbnail_image(ozone); ozone_update_thumbnail_image(ozone);
} }
/* Also savestate thumbnails need updating */ /* Also savestate thumbnails need updating */
else if (ozone->is_quick_menu && (ozone->depth >= 2)) else if ((ozone->is_quick_menu && ozone->depth >= 2) ||
ozone->is_state_slot)
{ {
ozone_update_savestate_thumbnail_path(ozone, i); ozone_update_savestate_thumbnail_path(ozone, i);
ozone_update_savestate_thumbnail_image(ozone); ozone_update_savestate_thumbnail_image(ozone);
@ -9200,8 +9301,9 @@ static void ozone_draw_footer(
ozone->fullscreen_thumbnails_available && ozone->fullscreen_thumbnails_available &&
!ozone->cursor_in_sidebar && !ozone->cursor_in_sidebar &&
ozone->show_thumbnail_bar && ozone->show_thumbnail_bar &&
((ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_MISSING) || ((ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_MISSING) ||
(ozone->thumbnails.left.status != GFX_THUMBNAIL_STATUS_MISSING)) && (ozone->thumbnails.left.status != GFX_THUMBNAIL_STATUS_MISSING) ||
(ozone->thumbnails.savestate.status != GFX_THUMBNAIL_STATUS_MISSING)) &&
(gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) || (gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) ||
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT)); gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT));
bool metadata_override_available = bool metadata_override_available =
@ -9319,7 +9421,10 @@ static void ozone_draw_footer(
video_height, video_height,
icon_size, icon_size,
icon_size, icon_size,
ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_START], (ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_AVAILABLE ||
ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING)
? ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_L]
: ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_START],
fullscreen_thumbs_x, fullscreen_thumbs_x,
icon_y, icon_y,
video_width,video_height, video_width,video_height,
@ -9733,6 +9838,24 @@ static void ozone_frame(void *data, video_frame_info_t *video_info)
if (!ozone) if (!ozone)
return; return;
/* Reset thumbnail bar when starting/closing content */
if (ozone->libretro_running != libretro_running)
{
ozone->libretro_running = libretro_running;
ozone->need_compute = true;
if (ozone->is_quick_menu && libretro_running)
{
ozone->want_thumbnail_bar = false;
ozone->fullscreen_thumbnails_available = false;
}
else if (ozone->is_quick_menu && !libretro_running)
{
ozone->want_thumbnail_bar = true;
ozone->fullscreen_thumbnails_available = true;
}
}
if (ozone->first_frame) if (ozone->first_frame)
{ {
menu_input_get_pointer_state(&ozone->pointer); menu_input_get_pointer_state(&ozone->pointer);
@ -10218,6 +10341,7 @@ static void ozone_populate_entries(void *data,
} }
ozone->need_compute = true; ozone->need_compute = true;
ozone->skip_thumbnail_reset = false;
ozone->first_onscreen_entry = 0; ozone->first_onscreen_entry = 0;
ozone->last_onscreen_entry = 0; ozone->last_onscreen_entry = 0;
@ -10235,6 +10359,7 @@ static void ozone_populate_entries(void *data,
string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST)); string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST));
ozone->is_contentless_cores = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENTLESS_CORES_TAB)) || ozone->is_contentless_cores = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENTLESS_CORES_TAB)) ||
string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_CONTENTLESS_CORES_LIST)); string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_CONTENTLESS_CORES_LIST));
ozone->is_state_slot = string_to_unsigned(path) == MENU_ENUM_LABEL_STATE_SLOT;
if (animate) if (animate)
if (ozone->categories_selection_ptr == ozone->categories_active_idx_old) if (ozone->categories_selection_ptr == ozone->categories_active_idx_old)
@ -10244,7 +10369,7 @@ static void ozone_populate_entries(void *data,
* > Note: Leave current thumbnails loaded when * > Note: Leave current thumbnails loaded when
* opening the quick menu - allows proper fade * opening the quick menu - allows proper fade
* out of the fullscreen thumbnail viewer */ * out of the fullscreen thumbnail viewer */
if (!ozone->is_quick_menu) if (!ozone->is_quick_menu && !ozone->is_state_slot)
{ {
ozone_unload_thumbnail_textures(ozone); ozone_unload_thumbnail_textures(ozone);
@ -10264,14 +10389,31 @@ static void ozone_populate_entries(void *data,
} }
} }
} }
else if (ozone->is_quick_menu && !ozone->libretro_running)
{
ozone->want_thumbnail_bar = true;
ozone->skip_thumbnail_reset = true;
ozone_update_thumbnail_image(ozone);
}
else if (ozone->is_quick_menu && ozone->libretro_running)
{
ozone->want_thumbnail_bar = false;
ozone_update_savestate_thumbnail_path(ozone, menu_navigation_get_selection());
ozone_update_savestate_thumbnail_image(ozone);
}
/* Fullscreen thumbnails are only enabled on /* Fullscreen thumbnails are only enabled on
* playlists, database manager lists and file * playlists, database manager lists, file lists
* lists */ * and savestate slots */
ozone->fullscreen_thumbnails_available = ozone->fullscreen_thumbnails_available =
(ozone->is_playlist && ozone->depth == 1) || (ozone->is_playlist && ozone->depth == 1) ||
(ozone->is_db_manager_list && ozone->depth == 4) || (ozone->is_db_manager_list && ozone->depth == 4) ||
(ozone->is_quick_menu && ozone->want_thumbnail_bar) ||
ozone->is_state_slot ||
ozone->is_file_list; ozone->is_file_list;
if (ozone->fullscreen_thumbnails_available != ozone->want_thumbnail_bar)
ozone->want_thumbnail_bar = ozone->fullscreen_thumbnails_available;
} }
/* TODO: Fancy toggle animation */ /* TODO: Fancy toggle animation */
@ -10288,7 +10430,12 @@ static void ozone_toggle(void *userdata, bool menu_on)
/* Have to reset this, otherwise savestate /* Have to reset this, otherwise savestate
* thumbnail won't update after selecting * thumbnail won't update after selecting
* 'save state' option */ * 'save state' option */
gfx_thumbnail_reset(&ozone->thumbnails.savestate); if (ozone->is_quick_menu)
{
gfx_thumbnail_reset(&ozone->thumbnails.savestate);
ozone_update_savestate_thumbnail_path(ozone, menu_navigation_get_selection());
ozone_update_savestate_thumbnail_image(ozone);
}
settings = config_get_ptr(); settings = config_get_ptr();
if ((tmp = !menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL))) if ((tmp = !menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL)))

View File

@ -340,6 +340,7 @@ typedef struct xmb_handle
size_t categories_selection_ptr_old; size_t categories_selection_ptr_old;
size_t selection_ptr_old; size_t selection_ptr_old;
size_t fullscreen_thumbnail_selection; size_t fullscreen_thumbnail_selection;
size_t playlist_index;
/* size of the current list */ /* size of the current list */
size_t list_size; size_t list_size;
@ -422,6 +423,8 @@ typedef struct xmb_handle
/* Load Content file browser */ /* Load Content file browser */
bool is_file_list; bool is_file_list;
bool is_quick_menu; bool is_quick_menu;
bool is_state_slot;
bool libretro_running;
/* Whether to show entry index for current list */ /* Whether to show entry index for current list */
bool entry_idx_enabled; bool entry_idx_enabled;
@ -784,11 +787,10 @@ static float *xmb_gradient_ident(unsigned xmb_color_theme)
case XMB_THEME_ICE_COLD: case XMB_THEME_ICE_COLD:
return &gradient_ice_cold[0]; return &gradient_ice_cold[0];
case XMB_THEME_LEGACY_RED: case XMB_THEME_LEGACY_RED:
return &gradient_legacy_red[0];
default: default:
break; return &gradient_dark[0];
} }
return &gradient_legacy_red[0];
} }
static size_t xmb_list_get_selection(void *data) static size_t xmb_list_get_selection(void *data)
@ -1147,8 +1149,8 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
xmb->savestate_thumbnail_file_path[0] = '\0'; xmb->savestate_thumbnail_file_path[0] = '\0';
/* Savestate thumbnails are only relevant /* Savestate thumbnails are only relevant
* when viewing the quick menu */ * when viewing the running quick menu or state slots */
if (!xmb->is_quick_menu) if (!((xmb->is_quick_menu || xmb->is_state_slot) && xmb->libretro_running))
return; return;
if (savestate_thumbnail_enable) if (savestate_thumbnail_enable)
@ -1164,7 +1166,8 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
if (!string_is_empty(entry.label)) if (!string_is_empty(entry.label))
{ {
if (string_is_equal(entry.label, "state_slot") || if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT ||
string_is_equal(entry.label, "state_slot") ||
string_is_equal(entry.label, "loadstate") || string_is_equal(entry.label, "loadstate") ||
string_is_equal(entry.label, "savestate")) string_is_equal(entry.label, "savestate"))
{ {
@ -1173,6 +1176,13 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
path[0] = '\0'; path[0] = '\0';
/* State slot dropdown */
if (string_to_unsigned(entry.label) == MENU_ENUM_LABEL_STATE_SLOT)
{
state_slot = menu_navigation_get_selection() - 1;
xmb->is_state_slot = true;
}
if (state_slot > 0) if (state_slot > 0)
snprintf(path, sizeof(path), "%s%d", snprintf(path, sizeof(path), "%s%d",
runloop_st->name.savestate, state_slot); runloop_st->name.savestate, state_slot);
@ -1185,9 +1195,13 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
strlcat(path, FILE_PATH_PNG_EXTENSION, sizeof(path)); strlcat(path, FILE_PATH_PNG_EXTENSION, sizeof(path));
if (path_is_valid(path)) if (path_is_valid(path))
{
strlcpy( strlcpy(
xmb->savestate_thumbnail_file_path, path, xmb->savestate_thumbnail_file_path, path,
sizeof(xmb->savestate_thumbnail_file_path)); sizeof(xmb->savestate_thumbnail_file_path));
xmb->fullscreen_thumbnails_available = true;
}
} }
} }
} }
@ -1336,6 +1350,9 @@ static void xmb_set_thumbnail_content(void *data, const char *s)
playlist_index = list->list[selection].entry_idx; playlist_index = list->list[selection].entry_idx;
} }
/* Remember playlist index for Quick Menu fullscreen thumbnail title */
xmb->playlist_index = playlist_index;
gfx_thumbnail_set_content_playlist(xmb->thumbnail_path_data, gfx_thumbnail_set_content_playlist(xmb->thumbnail_path_data,
playlist_valid ? playlist_get_cached() : NULL, playlist_index); playlist_valid ? playlist_get_cached() : NULL, playlist_index);
xmb->fullscreen_thumbnails_available = true; xmb->fullscreen_thumbnails_available = true;
@ -1411,8 +1428,8 @@ static void xmb_update_savestate_thumbnail_image(void *data)
return; return;
/* Savestate thumbnails are only relevant /* Savestate thumbnails are only relevant
* when viewing the quick menu */ * when viewing the running quick menu or state slots */
if (!xmb->is_quick_menu) if (!((xmb->is_quick_menu || xmb->is_state_slot) && xmb->libretro_running))
return; return;
/* If path is empty, just reset thumbnail */ /* If path is empty, just reset thumbnail */
@ -1764,12 +1781,12 @@ static void xmb_list_open_new(xmb_handle_t *xmb,
} }
if (savestate_thumbnail_enable && if (savestate_thumbnail_enable &&
xmb->is_quick_menu && ((xmb->is_quick_menu && xmb->depth >= 2) ||
(xmb->depth == 3)) (xmb->is_state_slot)))
{ {
/* This shows savestate thumbnail after /* This shows savestate thumbnail after
* opening savestate submenu */ * opening savestate submenu */
xmb_update_savestate_thumbnail_path(xmb, 0); xmb_update_savestate_thumbnail_path(xmb, menu_navigation_get_selection());
xmb_update_savestate_thumbnail_image(xmb); xmb_update_savestate_thumbnail_image(xmb);
} }
} }
@ -2477,6 +2494,7 @@ static void xmb_populate_entries(void *data,
xmb->is_quick_menu = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS)) || xmb->is_quick_menu = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS)) ||
string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_SETTINGS)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_SETTINGS)) ||
string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST)); string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SAVESTATE_LIST));
xmb->is_state_slot = string_to_unsigned(path) == MENU_ENUM_LABEL_STATE_SLOT;
xmb_set_title(xmb); xmb_set_title(xmb);
if (menu_dynamic_wallpaper_enable) if (menu_dynamic_wallpaper_enable)
@ -2515,6 +2533,11 @@ static void xmb_populate_entries(void *data,
!xmb->is_quick_menu && !xmb->is_quick_menu &&
!((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS) && (xmb->depth > 2)); !((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS) && (xmb->depth > 2));
if ((xmb->is_quick_menu &&
(!string_is_empty(xmb->savestate_thumbnail_file_path) || !xmb->libretro_running)) ||
xmb->is_state_slot)
xmb->fullscreen_thumbnails_available = true;
/* Hack: XMB gets into complete muddle when /* Hack: XMB gets into complete muddle when
* performing 'complex' directory navigation * performing 'complex' directory navigation
* via 'load content'. We have to work around * via 'load content'. We have to work around
@ -3866,12 +3889,16 @@ static void xmb_show_fullscreen_thumbnails(
uintptr_t alpha_tag = (uintptr_t) uintptr_t alpha_tag = (uintptr_t)
&xmb->fullscreen_thumbnail_alpha; &xmb->fullscreen_thumbnail_alpha;
char tmpstr[64];
tmpstr[0] = '\0';
/* We can only enable fullscreen thumbnails if /* We can only enable fullscreen thumbnails if
* current selection has at least one valid thumbnail * current selection has at least one valid thumbnail
* and all thumbnails for current selection are already * and all thumbnails for current selection are already
* loaded/available */ * loaded/available */
gfx_thumbnail_get_core_name(xmb->thumbnail_path_data, &core_name); gfx_thumbnail_get_core_name(xmb->thumbnail_path_data, &core_name);
if (string_is_equal(core_name, "imageviewer")) if (string_is_equal(core_name, "imageviewer") ||
!string_is_empty(xmb->savestate_thumbnail_file_path))
{ {
/* imageviewer content requires special treatment, /* imageviewer content requires special treatment,
* since only one thumbnail can ever be loaded * since only one thumbnail can ever be loaded
@ -3880,6 +3907,8 @@ static void xmb_show_fullscreen_thumbnails(
xmb->thumbnail_path_data, GFX_THUMBNAIL_RIGHT)) xmb->thumbnail_path_data, GFX_THUMBNAIL_RIGHT))
{ {
if ( xmb->thumbnails.right.status if ( xmb->thumbnails.right.status
!= GFX_THUMBNAIL_STATUS_AVAILABLE &&
xmb->thumbnails.savestate.status
!= GFX_THUMBNAIL_STATUS_AVAILABLE) != GFX_THUMBNAIL_STATUS_AVAILABLE)
return; return;
} }
@ -3931,9 +3960,36 @@ static void xmb_show_fullscreen_thumbnails(
/* > Get entry label */ /* > Get entry label */
if (!string_is_empty(selected_entry.rich_label)) if (!string_is_empty(selected_entry.rich_label))
thumbnail_label = selected_entry.rich_label; thumbnail_label = selected_entry.rich_label;
/* > State slot label */
else if (xmb->is_quick_menu && (
string_is_equal(selected_entry.label, "state_slot") ||
string_is_equal(selected_entry.label, "loadstate") ||
string_is_equal(selected_entry.label, "savestate")
))
{
snprintf(tmpstr, sizeof(tmpstr), "%s %d",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
config_get_ptr()->ints.state_slot);
thumbnail_label = tmpstr;
}
else if (string_to_unsigned(selected_entry.label) == MENU_ENUM_LABEL_STATE_SLOT)
{
snprintf(tmpstr, sizeof(tmpstr), "%s %s",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
selected_entry.path);
thumbnail_label = tmpstr;
}
/* > Quick Menu playlist label */
else if (xmb->is_quick_menu)
{
const struct playlist_entry *entry = NULL;
playlist_get_index(playlist_get_cached(), xmb->playlist_index, &entry);
if (entry)
thumbnail_label = entry->label;
}
else else
thumbnail_label = selected_entry.path; thumbnail_label = selected_entry.path;
/* > Sanity check */ /* > Sanity check */
if (!string_is_empty(thumbnail_label)) if (!string_is_empty(thumbnail_label))
@ -3987,6 +4043,8 @@ static enum menu_action xmb_parse_menu_entry_action(
* and a sudden transition from fullscreen * and a sudden transition from fullscreen
* thumbnail to content is jarring... */ * thumbnail to content is jarring... */
if (xmb->is_file_list || if (xmb->is_file_list ||
xmb->is_quick_menu ||
xmb->is_state_slot ||
((action != MENU_ACTION_SELECT) && ((action != MENU_ACTION_SELECT) &&
(action != MENU_ACTION_OK))) (action != MENU_ACTION_OK)))
return MENU_ACTION_NOOP; return MENU_ACTION_NOOP;
@ -4027,6 +4085,10 @@ static enum menu_action xmb_parse_menu_entry_action(
} }
break; break;
case MENU_ACTION_START: case MENU_ACTION_START:
if ((xmb->is_quick_menu && xmb->libretro_running) ||
xmb->is_state_slot)
break;
/* If this is a menu with thumbnails, attempt /* If this is a menu with thumbnails, attempt
* to show fullscreen thumbnail view */ * to show fullscreen thumbnail view */
if (xmb->fullscreen_thumbnails_available) if (xmb->fullscreen_thumbnails_available)
@ -4042,6 +4104,16 @@ static enum menu_action xmb_parse_menu_entry_action(
new_action = MENU_ACTION_NOOP; new_action = MENU_ACTION_NOOP;
} }
break; break;
case MENU_ACTION_SCAN:
if (xmb->fullscreen_thumbnails_available &&
((xmb->is_quick_menu && !string_is_empty(xmb->savestate_thumbnail_file_path)) ||
(xmb->is_state_slot)))
{
xmb_hide_fullscreen_thumbnails(xmb, false);
xmb_show_fullscreen_thumbnails(xmb, menu_navigation_get_selection());
new_action = MENU_ACTION_NOOP;
}
break;
default: default:
/* In all other cases, pass through input /* In all other cases, pass through input
* menu action without intervention */ * menu action without intervention */
@ -4628,6 +4700,14 @@ static void xmb_draw_fullscreen_thumbnails(
show_right_thumbnail = (right_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE); show_right_thumbnail = (right_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE);
show_left_thumbnail = (left_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE); show_left_thumbnail = (left_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE);
if ((xmb->is_quick_menu && !string_is_empty(xmb->savestate_thumbnail_file_path)) ||
xmb->is_state_slot)
{
left_thumbnail = &xmb->thumbnails.savestate;
show_left_thumbnail = (left_thumbnail->status == GFX_THUMBNAIL_STATUS_AVAILABLE);
show_right_thumbnail = false;
}
if (show_right_thumbnail) if (show_right_thumbnail)
num_thumbnails++; num_thumbnails++;
@ -5114,15 +5194,16 @@ static void xmb_frame(void *data, video_frame_info_t *video_info)
/**************************/ /**************************/
/* Draw thumbnails: START */ /* Draw thumbnails: START */
/**************************/ /**************************/
xmb->libretro_running = libretro_running;
/* Note: This is incredibly ugly, but there are /* Note: This is incredibly ugly, but there are
* so many combinations here that we would go insane * so many combinations here that we would go insane
* trying to rationalise this any further... */ * trying to rationalise this any further... */
/* Save state thumbnail, right side */ /* Save state thumbnail, right side */
if (xmb->is_quick_menu && if ((xmb->is_quick_menu || xmb->is_state_slot) &&
((xmb->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || ((xmb->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_AVAILABLE) ||
(xmb->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING))) (xmb->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING)))
{ {
float thumb_width = right_thumbnail_margin_width; float thumb_width = right_thumbnail_margin_width;
float thumb_height = thumbnail_margin_height_full; float thumb_height = thumbnail_margin_height_full;
@ -5147,7 +5228,8 @@ static void xmb_frame(void *data, video_frame_info_t *video_info)
* Quick Menu as well as when selecting "Information" for a playlist entry. * Quick Menu as well as when selecting "Information" for a playlist entry.
* NOTE: This is currently a pretty crude check, simply going by menu depth * NOTE: This is currently a pretty crude check, simply going by menu depth
* and not specifically identifying which menu we're actually in. */ * and not specifically identifying which menu we're actually in. */
else if (!((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS) && (xmb->depth > 2))) else if (!((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS) &&
((xmb->depth > 1 && libretro_running) || (xmb->depth > 2 && !libretro_running))))
{ {
bool show_right_thumbnail = bool show_right_thumbnail =
(xmb->thumbnails.right.status == GFX_THUMBNAIL_STATUS_AVAILABLE) || (xmb->thumbnails.right.status == GFX_THUMBNAIL_STATUS_AVAILABLE) ||
@ -6639,6 +6721,9 @@ static void xmb_context_reset_internal(xmb_handle_t *xmb,
xmb_update_thumbnail_image(xmb); xmb_update_thumbnail_image(xmb);
} }
/* Have to reset this, otherwise savestate
* thumbnail won't update after fullscreen toggle */
gfx_thumbnail_reset(&xmb->thumbnails.savestate);
xmb_update_savestate_thumbnail_image(xmb); xmb_update_savestate_thumbnail_image(xmb);
} }
@ -6992,7 +7077,8 @@ static void xmb_toggle(void *userdata, bool menu_on)
/* Have to reset this, otherwise savestate /* Have to reset this, otherwise savestate
* thumbnail won't update after selecting * thumbnail won't update after selecting
* 'save state' option */ * 'save state' option */
gfx_thumbnail_reset(&xmb->thumbnails.savestate); if (xmb->is_quick_menu)
gfx_thumbnail_reset(&xmb->thumbnails.savestate);
entry.duration = XMB_DELAY * 2; entry.duration = XMB_DELAY * 2;
entry.target_value = 1.0f; entry.target_value = 1.0f;