(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_GRADIENT_HEIGHT 28
#define FULLSCREEN_THUMBNAIL_PADDING 48
#define FULLSCREEN_THUMBNAIL_PADDING 32
#define CURSOR_SIZE 64
/* Cursor becomes active when it moves more
@ -446,7 +446,6 @@ struct ozone_handle
gfx_thumbnail_t savestate;
float stream_delay;
enum ozone_pending_thumbnail_type pending;
bool show_savestate;
} thumbnails;
uintptr_t textures[OZONE_THEME_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_active_idx_old;
size_t playlist_index;
size_t selection; /* currently selected entry */
size_t selection_old; /* previously selected entry (for fancy animation) */
@ -603,7 +603,9 @@ struct ozone_handle
bool show_screensaver;
bool cursor_mode;
bool sidebar_collapsed;
bool want_thumbnail_bar;
bool show_thumbnail_bar;
bool skip_thumbnail_reset;
bool pending_hide_thumbnail_bar;
bool fullscreen_thumbnails_available;
bool show_fullscreen_thumbnails;
@ -614,8 +616,10 @@ struct ozone_handle
bool is_db_manager_list;
bool is_file_list;
bool is_quick_menu;
bool is_state_slot;
bool is_contentless_cores;
bool first_frame;
bool libretro_running;
struct
{
@ -3286,9 +3290,6 @@ static void ozone_thumbnail_bar_hide_end(void *userdata)
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)
{
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';
/* Savestate thumbnails are only relevant
* when viewing the quick menu */
if (!ozone->is_quick_menu)
* when viewing the running quick menu or state slots */
if (!((ozone->is_quick_menu || ozone->is_state_slot) && ozone->libretro_running))
return;
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))
{
ozone->thumbnails.show_savestate = false;
ozone->selection_core_is_viewer = false;
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, "savestate"))
{
@ -3337,6 +3336,13 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
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)
snprintf(path, sizeof(path), "%s%d",
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,
sizeof(ozone->savestate_thumbnail_file_path));
ozone->thumbnails.show_savestate = true;
ozone->selection_core_is_viewer = true;
ozone->want_thumbnail_bar = 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
* when sidebar closing animation starts */
gfx_thumbnail_reset(&ozone->thumbnails.left);
gfx_thumbnail_reset(&ozone->thumbnails.right);
ozone_entries_update_thumbnail_bar(ozone, false, true, false);
if (ozone->show_thumbnail_bar != ozone->want_thumbnail_bar)
ozone->need_compute = true;
}
}
}
@ -3379,8 +3393,8 @@ static void ozone_update_savestate_thumbnail_image(void *data)
return;
/* Savestate thumbnails are only relevant
* when viewing the quick menu */
if (!ozone->is_quick_menu)
* when viewing the running quick menu or state slots */
if (!((ozone->is_quick_menu || ozone->is_state_slot) && ozone->libretro_running))
return;
/* 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(
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;
uintptr_t tag = (uintptr_t)&ozone->show_thumbnail_bar;
@ -3411,6 +3425,9 @@ static void ozone_entries_update_thumbnail_bar(
bool savestate_thumbnail_enable
= settings ? settings->bools.savestate_thumbnail_enable : false;
if (!savestate_thumbnail_enable)
ozone->is_state_slot = false;
entry.duration = ANIMATION_CURSOR_DURATION;
entry.easing_enum = EASING_OUT_QUAD;
entry.tag = tag;
@ -3431,11 +3448,14 @@ static void ozone_entries_update_thumbnail_bar(
* 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)) ||
(ozone->is_quick_menu && ozone->thumbnails.show_savestate))
if ( !ozone->cursor_in_sidebar &&
(!ozone->show_thumbnail_bar || ozone->pending_hide_thumbnail_bar) &&
(
(is_playlist && ozone->depth == 1) ||
(ozone->want_thumbnail_bar) ||
(ozone->is_state_slot)
)
)
{
if (allow_animation)
{
@ -3461,7 +3481,8 @@ static void ozone_entries_update_thumbnail_bar(
gfx_thumbnail_set_stream_delay(ozone->thumbnails.stream_delay);
}
/* Hide it */
else
else if (ozone->cursor_in_sidebar ||
(ozone->show_thumbnail_bar && !ozone->want_thumbnail_bar && !ozone->is_state_slot))
{
if (allow_animation)
{
@ -3478,16 +3499,6 @@ static void ozone_entries_update_thumbnail_bar(
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)
@ -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;
}
/* Remember playlist index for Quick Menu fullscreen thumbnail title */
ozone->playlist_index = playlist_index;
/* Fill entry enumeration */
if (show_entry_idx)
{
@ -4134,8 +4148,12 @@ static void ozone_refresh_sidebars(
}
/* Set thumbnail bar position */
if ((is_playlist && !ozone->cursor_in_sidebar && ozone->depth == 1) ||
(ozone->is_quick_menu && ozone->thumbnails.show_savestate && ozone->depth >= 2))
if ( !ozone->cursor_in_sidebar &&
( (is_playlist && ozone->depth == 1) ||
(ozone->want_thumbnail_bar) ||
(ozone->is_state_slot)
)
)
{
ozone->animations.thumbnail_bar_position = ozone->dimensions.thumbnail_bar_width;
ozone->show_thumbnail_bar = true;
@ -4755,6 +4773,9 @@ static void ozone_compute_entries_position(
int entry_padding = ozone_get_entries_padding(ozone);
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);
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;
if (ozone->depth == 1)
{
sublabel_max_width -= (unsigned) ozone->dimensions_sidebar_width;
if (ozone->show_thumbnail_bar)
sublabel_max_width -= ozone->dimensions.thumbnail_bar_width;
}
if (ozone->show_thumbnail_bar && !ozone->libretro_running)
sublabel_max_width -= ozone->dimensions.thumbnail_bar_width;
(ozone->word_wrap)(wrapped_sublabel_str, sizeof(wrapped_sublabel_str), entry.sublabel,
sublabel_max_width /
@ -5132,13 +5151,10 @@ border_iterate:
entry_padding * 2 - ozone->dimensions.entry_icon_padding * 2;
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)
sublabel_max_width -= ozone->dimensions.thumbnail_bar_width;
}
if (ozone->show_thumbnail_bar && !ozone->libretro_running)
sublabel_max_width -= ozone->dimensions.thumbnail_bar_width;
wrapped_sublabel_str[0] = '\0';
(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) &&
!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 ||
ozone->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING)
{
show_right_thumbnail = true;
thumbnail_width = sidebar_width;
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);
}
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
@ -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 scroll_tag = (uintptr_t)selection_buf;
char tmpstr[64];
tmpstr[0] = '\0';
/* Before showing fullscreen thumbnails, must
* ensure that any existing fullscreen thumbnail
* 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))
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;
}
else
@ -6339,9 +6377,36 @@ static void ozone_show_fullscreen_thumbnails(ozone_handle_t *ozone)
/* > Get entry 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
thumbnail_label = selected_entry.path;
thumbnail_label = selected_entry.path;
/* > Sanity check */
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_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)
num_thumbnails++;
@ -7030,6 +7103,8 @@ static enum menu_action ozone_parse_menu_entry_action(
* detection becomes too cumbersome... */
if (ozone->is_file_list ||
ozone->is_db_manager_list ||
ozone->is_quick_menu ||
ozone->is_state_slot ||
((action != MENU_ACTION_SELECT) &&
(action != MENU_ACTION_OK)))
return MENU_ACTION_NOOP;
@ -7054,6 +7129,9 @@ static enum menu_action ozone_parse_menu_entry_action(
{
case MENU_ACTION_START:
ozone->cursor_mode = false;
if (ozone->is_quick_menu && ozone->libretro_running)
break;
/* If this is a menu with thumbnails and cursor
* is not in the sidebar, attempt to show
* fullscreen thumbnail view */
@ -7176,6 +7254,7 @@ static enum menu_action ozone_parse_menu_entry_action(
break;
case MENU_ACTION_OK:
ozone->cursor_mode = false;
if (ozone->cursor_in_sidebar)
{
if (!ozone->empty_playlist)
@ -7271,7 +7350,17 @@ static enum menu_action ozone_parse_menu_entry_action(
ozone->cursor_mode = false;
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:
/* In all other cases, pass through input
* menu action without intervention */
@ -7598,15 +7687,21 @@ static void ozone_free(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)
return;
ozone->thumbnails.pending = OZONE_PENDING_THUMBNAIL_NONE;
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 */
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_PENDING_THUMBNAIL_RIGHT) ?
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)
@ -7634,7 +7733,8 @@ static void ozone_refresh_thumbnail_image(void *data, unsigned i)
* and we are currently viewing a playlist */
if ((gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) ||
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);
}
@ -8747,7 +8847,8 @@ static void ozone_render(void *data,
ozone_update_thumbnail_image(ozone);
}
/* 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_image(ozone);
@ -9200,8 +9301,9 @@ static void ozone_draw_footer(
ozone->fullscreen_thumbnails_available &&
!ozone->cursor_in_sidebar &&
ozone->show_thumbnail_bar &&
((ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_MISSING) ||
(ozone->thumbnails.left.status != GFX_THUMBNAIL_STATUS_MISSING)) &&
((ozone->thumbnails.right.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_LEFT));
bool metadata_override_available =
@ -9319,7 +9421,10 @@ static void ozone_draw_footer(
video_height,
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,
icon_y,
video_width,video_height,
@ -9733,6 +9838,24 @@ static void ozone_frame(void *data, video_frame_info_t *video_info)
if (!ozone)
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)
{
menu_input_get_pointer_state(&ozone->pointer);
@ -10218,6 +10341,7 @@ static void ozone_populate_entries(void *data,
}
ozone->need_compute = true;
ozone->skip_thumbnail_reset = false;
ozone->first_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));
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));
ozone->is_state_slot = string_to_unsigned(path) == MENU_ENUM_LABEL_STATE_SLOT;
if (animate)
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
* opening the quick menu - allows proper fade
* 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);
@ -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
* playlists, database manager lists and file
* lists */
* playlists, database manager lists, file lists
* and savestate slots */
ozone->fullscreen_thumbnails_available =
(ozone->is_playlist && ozone->depth == 1) ||
(ozone->is_db_manager_list && ozone->depth == 4) ||
(ozone->is_quick_menu && ozone->want_thumbnail_bar) ||
ozone->is_state_slot ||
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 */
@ -10288,7 +10430,12 @@ static void ozone_toggle(void *userdata, bool menu_on)
/* Have to reset this, otherwise savestate
* thumbnail won't update after selecting
* '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();
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 selection_ptr_old;
size_t fullscreen_thumbnail_selection;
size_t playlist_index;
/* size of the current list */
size_t list_size;
@ -422,6 +423,8 @@ typedef struct xmb_handle
/* Load Content file browser */
bool is_file_list;
bool is_quick_menu;
bool is_state_slot;
bool libretro_running;
/* Whether to show entry index for current list */
bool entry_idx_enabled;
@ -784,11 +787,10 @@ static float *xmb_gradient_ident(unsigned xmb_color_theme)
case XMB_THEME_ICE_COLD:
return &gradient_ice_cold[0];
case XMB_THEME_LEGACY_RED:
return &gradient_legacy_red[0];
default:
break;
return &gradient_dark[0];
}
return &gradient_legacy_red[0];
}
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';
/* Savestate thumbnails are only relevant
* when viewing the quick menu */
if (!xmb->is_quick_menu)
* when viewing the running quick menu or state slots */
if (!((xmb->is_quick_menu || xmb->is_state_slot) && xmb->libretro_running))
return;
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_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, "savestate"))
{
@ -1173,6 +1176,13 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
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)
snprintf(path, sizeof(path), "%s%d",
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));
if (path_is_valid(path))
{
strlcpy(
xmb->savestate_thumbnail_file_path, 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;
}
/* Remember playlist index for Quick Menu fullscreen thumbnail title */
xmb->playlist_index = playlist_index;
gfx_thumbnail_set_content_playlist(xmb->thumbnail_path_data,
playlist_valid ? playlist_get_cached() : NULL, playlist_index);
xmb->fullscreen_thumbnails_available = true;
@ -1411,8 +1428,8 @@ static void xmb_update_savestate_thumbnail_image(void *data)
return;
/* Savestate thumbnails are only relevant
* when viewing the quick menu */
if (!xmb->is_quick_menu)
* when viewing the running quick menu or state slots */
if (!((xmb->is_quick_menu || xmb->is_state_slot) && xmb->libretro_running))
return;
/* 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 &&
xmb->is_quick_menu &&
(xmb->depth == 3))
((xmb->is_quick_menu && xmb->depth >= 2) ||
(xmb->is_state_slot)))
{
/* This shows savestate thumbnail after
* 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);
}
}
@ -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)) ||
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));
xmb->is_state_slot = string_to_unsigned(path) == MENU_ENUM_LABEL_STATE_SLOT;
xmb_set_title(xmb);
if (menu_dynamic_wallpaper_enable)
@ -2515,6 +2533,11 @@ static void xmb_populate_entries(void *data,
!xmb->is_quick_menu &&
!((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
* performing 'complex' directory navigation
* via 'load content'. We have to work around
@ -3866,12 +3889,16 @@ static void xmb_show_fullscreen_thumbnails(
uintptr_t alpha_tag = (uintptr_t)
&xmb->fullscreen_thumbnail_alpha;
char tmpstr[64];
tmpstr[0] = '\0';
/* We can only enable fullscreen thumbnails if
* current selection has at least one valid thumbnail
* and all thumbnails for current selection are already
* loaded/available */
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,
* 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))
{
if ( xmb->thumbnails.right.status
!= GFX_THUMBNAIL_STATUS_AVAILABLE &&
xmb->thumbnails.savestate.status
!= GFX_THUMBNAIL_STATUS_AVAILABLE)
return;
}
@ -3931,9 +3960,36 @@ static void xmb_show_fullscreen_thumbnails(
/* > Get entry 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
thumbnail_label = selected_entry.path;
thumbnail_label = selected_entry.path;
/* > Sanity check */
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
* thumbnail to content is jarring... */
if (xmb->is_file_list ||
xmb->is_quick_menu ||
xmb->is_state_slot ||
((action != MENU_ACTION_SELECT) &&
(action != MENU_ACTION_OK)))
return MENU_ACTION_NOOP;
@ -4027,6 +4085,10 @@ static enum menu_action xmb_parse_menu_entry_action(
}
break;
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
* to show fullscreen thumbnail view */
if (xmb->fullscreen_thumbnails_available)
@ -4042,6 +4104,16 @@ static enum menu_action xmb_parse_menu_entry_action(
new_action = MENU_ACTION_NOOP;
}
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:
/* In all other cases, pass through input
* 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_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)
num_thumbnails++;
@ -5114,15 +5194,16 @@ static void xmb_frame(void *data, video_frame_info_t *video_info)
/**************************/
/* Draw thumbnails: START */
/**************************/
xmb->libretro_running = libretro_running;
/* Note: This is incredibly ugly, but there are
* so many combinations here that we would go insane
* trying to rationalise this any further... */
/* 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_PENDING)))
(xmb->thumbnails.savestate.status == GFX_THUMBNAIL_STATUS_PENDING)))
{
float thumb_width = right_thumbnail_margin_width;
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.
* NOTE: This is currently a pretty crude check, simply going by menu depth
* 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 =
(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);
}
/* 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);
}
@ -6992,7 +7077,8 @@ static void xmb_toggle(void *userdata, bool menu_on)
/* Have to reset this, otherwise savestate
* thumbnail won't update after selecting
* '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.target_value = 1.0f;