(Ozone+XMB) Fullscreen thumbnail browsing (#14342)

This commit is contained in:
sonninnos 2022-08-24 13:35:54 +03:00 committed by GitHub
parent 8776c79a60
commit 5f7d14966c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 390 additions and 253 deletions

View File

@ -456,6 +456,7 @@ struct ozone_handle
size_t categories_selection_ptr; /* active tab id */
size_t categories_active_idx_old;
size_t playlist_index;
size_t playlist_size;
size_t playlist_collection_offset;
size_t selection; /* currently selected entry */
@ -616,6 +617,7 @@ struct ozone_handle
bool pending_hide_thumbnail_bar;
bool no_thumbnail_available;
bool fullscreen_thumbnails_available;
bool want_fullscreen_thumbnails;
bool show_fullscreen_thumbnails;
bool selection_core_is_viewer;
bool selection_core_is_viewer_real;
@ -3357,11 +3359,27 @@ console_iterate:
video_width, video_height);
}
static bool ozone_is_running_quick_menu(void)
{
menu_entry_t entry;
MENU_ENTRY_INIT(entry);
entry.path_enabled = false;
entry.value_enabled = false;
entry.sublabel_enabled = false;
menu_entry_get(&entry, 0, 0, NULL, true);
return string_is_equal(entry.label, "resume_content") ||
string_is_equal(entry.label, "state_slot");
}
static void ozone_thumbnail_bar_hide_end(void *userdata)
{
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
ozone->show_thumbnail_bar = false;
ozone->pending_hide_thumbnail_bar = false;
if (!(ozone->is_quick_menu && ozone_is_running_quick_menu()))
ozone->need_compute = true;
}
@ -3382,18 +3400,60 @@ static bool ozone_is_load_content_playlist(void *userdata)
return entry.type == FILE_TYPE_RPL_ENTRY;
}
static bool ozone_is_running_quick_menu(void)
static void ozone_update_fullscreen_thumbnail_label(ozone_handle_t *ozone)
{
menu_entry_t entry;
menu_entry_t selected_entry;
const char *thumbnail_label = NULL;
MENU_ENTRY_INIT(entry);
entry.path_enabled = false;
entry.value_enabled = false;
entry.sublabel_enabled = false;
menu_entry_get(&entry, 0, 0, NULL, true);
char tmpstr[64];
tmpstr[0] = '\0';
return string_is_equal(entry.label, "resume_content") ||
string_is_equal(entry.label, "state_slot");
/* > Get menu entry */
MENU_ENTRY_INIT(selected_entry);
selected_entry.path_enabled = false;
selected_entry.value_enabled = false;
selected_entry.sublabel_enabled = false;
menu_entry_get(&selected_entry, 0, (size_t)ozone->selection, NULL, true);
/* > Get entry label */
if (!string_is_empty(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 %d",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
string_to_unsigned(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;
/* > Sanity check */
if (!string_is_empty(thumbnail_label))
strlcpy(
ozone->fullscreen_thumbnail_label,
thumbnail_label,
sizeof(ozone->fullscreen_thumbnail_label));
}
static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
@ -3473,6 +3533,7 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
ozone->want_thumbnail_bar = true;
ozone->fullscreen_thumbnails_available = true;
ozone_update_fullscreen_thumbnail_label(ozone);
}
else if (!ozone->is_state_slot)
{
@ -3488,7 +3549,7 @@ static void ozone_update_savestate_thumbnail_path(void *data, unsigned i)
ozone->fullscreen_thumbnails_available = false;
}
if (ozone->show_thumbnail_bar != ozone->want_thumbnail_bar)
if (ozone->show_thumbnail_bar != ozone->want_thumbnail_bar && !ozone->pending_hide_thumbnail_bar)
ozone->need_compute = true;
}
}
@ -3803,7 +3864,7 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone)
ozone->selection_core_is_viewer_real = ozone->selection_core_is_viewer;
if ((ozone->is_playlist && playlist) ||
if ((playlist && (ozone->is_playlist || (ozone->is_quick_menu && !ozone_is_running_quick_menu()))) ||
(ozone->is_db_manager_list && ozone->depth == 4))
{
const char *core_label = NULL;
@ -3812,23 +3873,36 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone)
file_list_t *list = menu_entries_get_selection_buf_ptr(0);
size_t playlist_index = selection;
if (ozone->is_quick_menu)
{
bool content_runtime_log = settings->bools.content_runtime_log;
bool content_runtime_log_aggr = settings->bools.content_runtime_log_aggregate;
playlist_index = ozone->playlist_index;
list_size = ozone->playlist_size;
/* Fill play time if applicable */
if (content_runtime_log || content_runtime_log_aggr)
playlist_get_index(playlist, playlist_index, &entry);
}
/* Get playlist index corresponding
* to the selected entry */
if (list &&
else if (list &&
(selection < list_size) &&
(list->list[selection].type == FILE_TYPE_RPL_ENTRY))
{
bool content_runtime_log = settings->bools.content_runtime_log;
bool content_runtime_log_aggr = settings->bools.content_runtime_log_aggregate;
playlist_index = list->list[selection].entry_idx;
/* Remember playlist index for Quick Menu fullscreen thumbnail title */
ozone->playlist_index = playlist_index;
ozone->playlist_size = list_size;
/* Fill play time if applicable */
if (content_runtime_log || content_runtime_log_aggr)
playlist_get_index(playlist, playlist_index, &entry);
}
/* Remember playlist index for Quick Menu fullscreen thumbnail title */
ozone->playlist_index = playlist_index;
/* Fill entry enumeration */
if (show_entry_idx)
{
@ -3843,10 +3917,20 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone)
ozone->selection_entry_enumeration[0] = '\0';
/* Fill core name */
if (entry)
{
if (!entry->core_name || string_is_equal(entry->core_name, "DETECT"))
core_label = msg_hash_to_str(MSG_AUTODETECT);
else
core_label = entry->core_name;
}
else
{
if (!core_name || string_is_equal(core_name, "DETECT"))
core_label = msg_hash_to_str(MSG_AUTODETECT);
else
core_label = core_name;
}
snprintf(ozone->selection_core_name, sizeof(ozone->selection_core_name),
"%s %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_CORE), core_label);
@ -3874,7 +3958,7 @@ static void ozone_update_content_metadata(ozone_handle_t *ozone)
if (entry)
{
if (entry->runtime_status == PLAYLIST_RUNTIME_UNKNOWN)
if (entry->runtime_status == PLAYLIST_RUNTIME_UNKNOWN || ozone->is_quick_menu)
runtime_update_playlist(
playlist, playlist_index,
directory_runtime_log,
@ -4913,7 +4997,13 @@ static void ozone_compute_entries_position(
float scale_factor = ozone->last_scale_factor;
if (ozone->show_thumbnail_bar != ozone->want_thumbnail_bar)
{
if (!(ozone->pending_hide_thumbnail_bar && ozone->is_quick_menu))
ozone_entries_update_thumbnail_bar(ozone, false, true);
}
if (ozone->show_thumbnail_bar)
ozone_update_content_metadata(ozone);
menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i);
@ -6513,9 +6603,6 @@ 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... */
@ -6538,10 +6625,6 @@ static void ozone_show_fullscreen_thumbnails(ozone_handle_t *ozone)
* since only the right thumbnail is ever loaded */
if (!gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT))
return;
if (ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_AVAILABLE &&
ozone->thumbnails.savestate.status != GFX_THUMBNAIL_STATUS_AVAILABLE)
return;
}
else
{
@ -6575,53 +6658,7 @@ static void ozone_show_fullscreen_thumbnails(ozone_handle_t *ozone)
* (used as title when fullscreen thumbnails
* are shown) */
ozone->fullscreen_thumbnail_label[0] = '\0';
/* > Get menu entry */
MENU_ENTRY_INIT(selected_entry);
selected_entry.path_enabled = false;
selected_entry.value_enabled = false;
selected_entry.sublabel_enabled = false;
menu_entry_get(&selected_entry, 0, (size_t)ozone->selection, NULL, true);
/* > Get entry label */
if (!string_is_empty(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 %d",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
string_to_unsigned(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;
/* > Sanity check */
if (!string_is_empty(thumbnail_label))
strlcpy(
ozone->fullscreen_thumbnail_label,
thumbnail_label,
sizeof(ozone->fullscreen_thumbnail_label));
ozone_update_fullscreen_thumbnail_label(ozone);
/* Configure fade in animation */
animation_entry.easing_enum = EASING_OUT_QUAD;
@ -6650,7 +6687,7 @@ static void ozone_draw_fullscreen_thumbnails(
unsigned video_height)
{
/* Check whether fullscreen thumbnails are visible */
if (ozone->animations.fullscreen_thumbnail_alpha > 0.0f)
if (ozone->animations.fullscreen_thumbnail_alpha > 0.0f || ozone->want_fullscreen_thumbnails)
{
/* Note: right thumbnail is drawn at the top
* in the sidebar, so it becomes the *left*
@ -6731,12 +6768,36 @@ static void ozone_draw_fullscreen_thumbnails(
if (show_left_thumbnail)
num_thumbnails++;
/* Prevent screen flashing when browsing in fullscreen thumbnail mode */
if (ozone->is_playlist && num_thumbnails < 1 && ozone->want_fullscreen_thumbnails &&
(right_thumbnail->status != GFX_THUMBNAIL_STATUS_MISSING &&
left_thumbnail->status != GFX_THUMBNAIL_STATUS_MISSING))
{
/* Darken background */
gfx_display_draw_quad(
p_disp,
userdata,
video_width,
video_height,
0,
ozone->dimensions.header_height + ozone->dimensions.spacer_1px,
width,
(unsigned)view_height,
width,
height,
background_color,
NULL);
return;
}
/* Do nothing if both thumbnails are missing
* > Note: Baring inexplicable internal errors, this
* can never happen...
* > Return instead of error to keep fullscreen
* mode after menu/fullscreen toggle */
if (num_thumbnails < 1)
if (num_thumbnails < 1 &&
(right_thumbnail->status == GFX_THUMBNAIL_STATUS_MISSING &&
left_thumbnail->status == GFX_THUMBNAIL_STATUS_MISSING))
return;
/* Get base thumbnail dimensions + draw positions */
@ -7323,41 +7384,6 @@ static enum menu_action ozone_parse_menu_entry_action(
gfx_thumbnail_set_stream_delay(ozone->thumbnails.stream_delay);
}
/* If fullscreen thumbnail view is active, any
* valid menu action will disable it... */
if (ozone->show_fullscreen_thumbnails)
{
if (action != MENU_ACTION_NOOP && action != MENU_ACTION_TOGGLE)
{
ozone_hide_fullscreen_thumbnails(ozone, true);
/* ...and any action other than Select/OK
* is ignored
* > We allow pass-through of Select/OK since
* users may want to run content directly
* after viewing fullscreen thumbnails,
* and having to press RetroPad A or the Return
* key twice is navigationally confusing
* > Note that we can only do this for non-pointer
* input
* > Note that we don't do this when viewing a
* file list, since there is no quick menu
* in this case - i.e. content loads directly,
* and a sudden transition from fullscreen
* thumbnail to content is jarring...
* > We also don't do this when viewing a database
* manager list, because the menu transition
* 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;
}
}
horizontal_list_size = (unsigned)ozone->horizontal_list.size;
ozone->messagebox_state = menu_input_dialog_get_display_kb();
@ -7384,9 +7410,17 @@ static enum menu_action ozone_parse_menu_entry_action(
* is not in the sidebar, attempt to show
* fullscreen thumbnail view */
if (ozone->fullscreen_thumbnails_available &&
!ozone->show_fullscreen_thumbnails &&
!ozone->cursor_in_sidebar)
{
ozone_show_fullscreen_thumbnails(ozone);
ozone->want_fullscreen_thumbnails = true;
new_action = MENU_ACTION_NOOP;
}
else if (ozone->show_fullscreen_thumbnails || ozone->want_fullscreen_thumbnails)
{
ozone_hide_fullscreen_thumbnails(ozone, true);
ozone->want_fullscreen_thumbnails = false;
new_action = MENU_ACTION_NOOP;
}
break;
@ -7394,10 +7428,18 @@ static enum menu_action ozone_parse_menu_entry_action(
ozone->cursor_mode = false;
if (ozone->fullscreen_thumbnails_available &&
!ozone->show_fullscreen_thumbnails &&
(ozone->is_state_slot ||
(ozone->is_quick_menu && !string_is_empty(ozone->savestate_thumbnail_file_path))))
{
ozone_show_fullscreen_thumbnails(ozone);
ozone->want_fullscreen_thumbnails = true;
new_action = MENU_ACTION_NOOP;
}
else if (ozone->show_fullscreen_thumbnails && !ozone->is_playlist)
{
ozone_hide_fullscreen_thumbnails(ozone, true);
ozone->want_fullscreen_thumbnails = false;
new_action = MENU_ACTION_NOOP;
}
break;
@ -7425,6 +7467,9 @@ static enum menu_action ozone_parse_menu_entry_action(
else if (!menu_navigation_wraparound_enable && selection == selection_total - 1)
ozone_start_cursor_wiggle(ozone, MENU_ACTION_DOWN);
if (ozone->show_fullscreen_thumbnails && ozone->is_quick_menu)
return MENU_ACTION_NOOP;
/* If pointer is active and current selection
* is off screen, auto select *centre* item */
if (ozone->cursor_mode)
@ -7453,6 +7498,9 @@ static enum menu_action ozone_parse_menu_entry_action(
else if (!menu_navigation_wraparound_enable && selection == 0)
ozone_start_cursor_wiggle(ozone, MENU_ACTION_UP);
if (ozone->show_fullscreen_thumbnails && ozone->is_quick_menu)
return MENU_ACTION_NOOP;
/* If pointer is active and current selection
* is off screen, auto select *centre* item */
if (ozone->cursor_mode)
@ -7468,7 +7516,6 @@ static enum menu_action ozone_parse_menu_entry_action(
{
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
ozone_start_cursor_wiggle(ozone, MENU_ACTION_LEFT);
break;
}
else if (ozone->depth > 1)
@ -7479,8 +7526,16 @@ static enum menu_action ozone_parse_menu_entry_action(
if (!menu_navigation_wraparound_enable && selection == 0 && !is_current_entry_settings)
ozone_start_cursor_wiggle(ozone, MENU_ACTION_DOWN);
if (ozone->show_fullscreen_thumbnails && (ozone->is_quick_menu && !ozone_is_running_quick_menu()))
return MENU_ACTION_NOOP;
break;
}
else if (ozone->depth == 1 && ozone->show_fullscreen_thumbnails && ozone->is_playlist)
{
ozone_hide_fullscreen_thumbnails(ozone, true);
ozone->want_fullscreen_thumbnails = false;
}
ozone_go_to_sidebar(ozone, ozone_collapse_sidebar, tag);
@ -7501,6 +7556,10 @@ static enum menu_action ozone_parse_menu_entry_action(
else if (!menu_navigation_wraparound_enable && selection == selection_total - 1 && !is_current_entry_settings)
ozone_start_cursor_wiggle(ozone, MENU_ACTION_DOWN);
if (ozone->show_fullscreen_thumbnails &&
(ozone->is_playlist || (ozone->is_quick_menu && !ozone_is_running_quick_menu())))
return MENU_ACTION_NOOP;
break;
}
@ -7521,12 +7580,23 @@ static enum menu_action ozone_parse_menu_entry_action(
ozone->show_thumbnail_bar && ozone->fullscreen_thumbnails_available)
{
ozone_show_fullscreen_thumbnails(ozone);
ozone->want_fullscreen_thumbnails = true;
new_action = MENU_ACTION_NOOP;
break;
}
if (ozone->show_fullscreen_thumbnails || ozone->want_fullscreen_thumbnails)
{
ozone_hide_fullscreen_thumbnails(ozone, true);
ozone->want_fullscreen_thumbnails = false;
if (!ozone->is_state_slot && !ozone->is_playlist)
new_action = MENU_ACTION_NOOP;
break;
}
if (ozone->cursor_in_sidebar)
{
ozone_refresh_sidebars(ozone, ozone_collapse_sidebar, ozone->last_height);
if (!ozone->empty_playlist)
ozone_leave_sidebar(ozone, ozone_collapse_sidebar, tag);
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL;
@ -7555,6 +7625,14 @@ static enum menu_action ozone_parse_menu_entry_action(
break;
}
if (ozone->show_fullscreen_thumbnails || ozone->want_fullscreen_thumbnails)
{
ozone_hide_fullscreen_thumbnails(ozone, true);
ozone->want_fullscreen_thumbnails = false;
new_action = MENU_ACTION_NOOP;
break;
}
if (menu_entries_get_stack_size(0) == 1)
{
ozone_go_to_sidebar(ozone, ozone_collapse_sidebar, tag);
@ -7572,6 +7650,9 @@ static enum menu_action ozone_parse_menu_entry_action(
break;
}
if (ozone->show_fullscreen_thumbnails && ozone->is_quick_menu)
return MENU_ACTION_NOOP;
/* If pointer is active and current selection
* is off screen, auto select *last* item */
if (ozone->cursor_mode)
@ -7590,6 +7671,9 @@ static enum menu_action ozone_parse_menu_entry_action(
break;
}
if (ozone->show_fullscreen_thumbnails && ozone->is_quick_menu)
return MENU_ACTION_NOOP;
/* If pointer is active and current selection
* is off screen, auto select *first* item */
if (ozone->cursor_mode)
@ -7991,6 +8075,10 @@ static void ozone_refresh_thumbnail_image(void *data, unsigned i)
if (!ozone)
return;
/* Refresh metadata */
if (!i)
ozone_update_content_metadata(ozone);
/* Only refresh thumbnails if thumbnails are enabled
* and we are currently viewing a playlist */
if ((gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT) ||
@ -9289,6 +9377,7 @@ static void ozone_draw_header(
float scale_factor = ozone->last_scale_factor;
unsigned logo_icon_size = 60 * scale_factor;
unsigned status_icon_size = 92 * scale_factor;
unsigned status_row_size = 160 * scale_factor;
unsigned seperator_margin = 30 * scale_factor;
enum gfx_animation_ticker_type
menu_ticker_type = (enum gfx_animation_ticker_type)settings->uints.menu_ticker_type;
@ -9327,43 +9416,6 @@ static void ozone_draw_header(
ozone->theme->header_footer_separator,
NULL);
/* Title */
if (use_smooth_ticker)
{
ticker_smooth.font = ozone->fonts.title.font;
ticker_smooth.selected = true;
ticker_smooth.field_width = (video_width - (128 + 47 + 180) * scale_factor);
ticker_smooth.src_str = ozone->show_fullscreen_thumbnails ? ozone->fullscreen_thumbnail_label : ozone->title;
ticker_smooth.dst_str = title;
ticker_smooth.dst_str_len = sizeof(title);
gfx_animation_ticker_smooth(&ticker_smooth);
}
else
{
ticker.s = title;
ticker.len = (video_width - (128 + 47 + 180) * scale_factor) / ozone->fonts.title.glyph_width;
ticker.str = ozone->show_fullscreen_thumbnails ? ozone->fullscreen_thumbnail_label : ozone->title;
ticker.selected = true;
gfx_animation_ticker(&ticker);
}
gfx_display_draw_text(
ozone->fonts.title.font,
title,
ticker_x_offset + 128 * scale_factor,
ozone->dimensions.header_height / 2
+ ozone->fonts.title.line_centre_offset,
video_width,
video_height,
ozone->theme->text_rgba,
TEXT_ALIGN_LEFT,
1.0f,
false,
1.0f,
false);
/* Icon */
if (dispctx)
{
@ -9427,12 +9479,13 @@ static void ozone_draw_header(
if (powerstate.battery_enabled)
{
timedate_offset = 95 * scale_factor;
timedate_offset = 90 * scale_factor;
status_row_size += timedate_offset;
gfx_display_draw_text(
ozone->fonts.time.font,
msg,
video_width - 85 * scale_factor,
video_width - 55 * scale_factor,
ozone->dimensions.header_height / 2
+ ozone->fonts.time.line_centre_offset,
video_width,
@ -9456,8 +9509,13 @@ static void ozone_draw_header(
video_height,
status_icon_size,
status_icon_size,
ozone->icons_textures[powerstate.charging? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_CHARGING : (powerstate.percent > 80)? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_FULL : (powerstate.percent > 60)? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_80 : (powerstate.percent > 40)? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_60 : (powerstate.percent > 20)? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_40 : OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_20],
video_width - (60 + 58) * scale_factor,
ozone->icons_textures[powerstate.charging ? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_CHARGING
: (powerstate.percent > 80) ? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_FULL
: (powerstate.percent > 60) ? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_80
: (powerstate.percent > 40) ? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_60
: (powerstate.percent > 20) ? OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_40
: OZONE_ENTRIES_ICONS_TEXTURE_BATTERY_20],
video_width - (55 + 32) * scale_factor,
0,
video_width,
video_height,
@ -9489,7 +9547,7 @@ static void ozone_draw_header(
gfx_display_draw_text(
ozone->fonts.time.font,
timedate,
video_width - (85 * scale_factor) - timedate_offset,
video_width - (64 * scale_factor) - timedate_offset,
ozone->dimensions.header_height / 2
+ ozone->fonts.time.line_centre_offset,
video_width,
@ -9514,7 +9572,7 @@ static void ozone_draw_header(
status_icon_size,
status_icon_size,
ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CLOCK],
video_width - (60 + 54) * scale_factor - timedate_offset,
video_width - (64 + 28) * scale_factor - timedate_offset,
0,
video_width,
video_height,
@ -9525,7 +9583,46 @@ static void ozone_draw_header(
if (dispctx->blend_end)
dispctx->blend_end(userdata);
}
status_row_size += 240 * scale_factor;
}
/* Title */
if (use_smooth_ticker)
{
ticker_smooth.font = ozone->fonts.title.font;
ticker_smooth.selected = true;
ticker_smooth.field_width = video_width - status_row_size;
ticker_smooth.src_str = ozone->show_fullscreen_thumbnails ? ozone->fullscreen_thumbnail_label : ozone->title;
ticker_smooth.dst_str = title;
ticker_smooth.dst_str_len = sizeof(title);
gfx_animation_ticker_smooth(&ticker_smooth);
}
else
{
ticker.s = title;
ticker.len = video_width - status_row_size / ozone->fonts.title.glyph_width;
ticker.str = ozone->show_fullscreen_thumbnails ? ozone->fullscreen_thumbnail_label : ozone->title;
ticker.selected = true;
gfx_animation_ticker(&ticker);
}
gfx_display_draw_text(
ozone->fonts.title.font,
title,
ticker_x_offset + 128 * scale_factor,
ozone->dimensions.header_height / 2
+ ozone->fonts.title.line_centre_offset,
video_width,
video_height,
ozone->theme->text_rgba,
TEXT_ALIGN_LEFT,
1.0f,
false,
1.0f,
false);
}
static void ozone_draw_footer(
@ -9542,7 +9639,7 @@ static void ozone_draw_footer(
bool menu_core_enable = settings->bools.menu_core_enable;
float scale_factor = ozone->last_scale_factor;
unsigned seperator_margin = 30 * scale_factor;
float footer_margin = 59 * scale_factor;
float footer_margin = 42 * scale_factor;
float footer_text_y = (float)video_height -
(ozone->dimensions.footer_height / 2.0f) +
ozone->fonts.footer.line_centre_offset;
@ -10116,6 +10213,18 @@ static void ozone_frame(void *data, video_frame_info_t *video_info)
}
}
if ((ozone->is_playlist || ozone->is_state_slot) &&
ozone->show_fullscreen_thumbnails && (size_t)ozone->selection != ozone->fullscreen_thumbnail_selection)
{
ozone->need_compute = true;
ozone_show_fullscreen_thumbnails(ozone);
}
else if (!ozone->show_fullscreen_thumbnails && ozone->want_fullscreen_thumbnails)
{
ozone->need_compute = true;
ozone_show_fullscreen_thumbnails(ozone);
}
if (ozone->first_frame)
{
menu_input_get_pointer_state(&ozone->pointer);

View File

@ -412,6 +412,7 @@ typedef struct xmb_handle
bool fullscreen_thumbnails_available;
bool show_fullscreen_thumbnails;
bool want_fullscreen_thumbnails;
bool skip_thumbnail_reset;
bool show_mouse;
bool show_screensaver;
@ -1160,6 +1161,62 @@ static bool xmb_is_running_quick_menu(void)
string_is_equal(entry.label, "state_slot");
}
static void xmb_update_fullscreen_thumbnail_label(xmb_handle_t *xmb)
{
menu_entry_t selected_entry;
const char *thumbnail_label = NULL;
char tmpstr[64];
tmpstr[0] = '\0';
/* > Get menu entry */
MENU_ENTRY_INIT(selected_entry);
selected_entry.path_enabled = false;
selected_entry.value_enabled = false;
selected_entry.sublabel_enabled = false;
menu_entry_get(&selected_entry, 0, menu_navigation_get_selection(), NULL, true);
/* > Get entry label */
if (!string_is_empty(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 %d",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
string_to_unsigned(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;
/* > Sanity check */
if (!string_is_empty(thumbnail_label))
strlcpy(
xmb->fullscreen_thumbnail_label,
thumbnail_label,
sizeof(xmb->fullscreen_thumbnail_label));
}
static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
{
settings_t *settings = config_get_ptr();
@ -1236,6 +1293,7 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
sizeof(xmb->savestate_thumbnail_file_path));
xmb->fullscreen_thumbnails_available = true;
xmb_update_fullscreen_thumbnail_label(xmb);
}
}
}
@ -4053,9 +4111,6 @@ 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
@ -4114,53 +4169,7 @@ static void xmb_show_fullscreen_thumbnails(
* (used as title when fullscreen thumbnails
* are shown) */
xmb->fullscreen_thumbnail_label[0] = '\0';
/* > Get menu entry */
MENU_ENTRY_INIT(selected_entry);
selected_entry.path_enabled = false;
selected_entry.value_enabled = false;
selected_entry.sublabel_enabled = false;
menu_entry_get(&selected_entry, 0, selection, NULL, true);
/* > Get entry label */
if (!string_is_empty(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 %d",
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STATE_SLOT),
string_to_unsigned(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;
/* > Sanity check */
if (!string_is_empty(thumbnail_label))
strlcpy(
xmb->fullscreen_thumbnail_label,
thumbnail_label,
sizeof(xmb->fullscreen_thumbnail_label));
xmb_update_fullscreen_thumbnail_label(xmb);
/* Configure fade in animation */
animation_entry.easing_enum = EASING_OUT_QUAD;
@ -4184,42 +4193,14 @@ static enum menu_action xmb_parse_menu_entry_action(
{
enum menu_action new_action = action;
/* If fullscreen thumbnail view is active, any
* valid menu action will disable it... */
if (xmb->show_fullscreen_thumbnails)
{
if (action != MENU_ACTION_NOOP && action != MENU_ACTION_TOGGLE)
{
xmb_hide_fullscreen_thumbnails(xmb, true);
/* ...and any action other than Select/OK
* is ignored
* > We allow pass-through of Select/OK since
* users may want to run content directly
* after viewing fullscreen thumbnails,
* and having to press RetroPad A or the Return
* key twice is navigationally confusing
* > Note that we can only do this for non-pointer
* input
* > Note that we don't do this when viewing a
* file list, since there is no quick menu
* in this case - i.e. content loads directly,
* 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;
}
}
/* Scan user inputs */
switch (action)
{
case MENU_ACTION_LEFT:
case MENU_ACTION_RIGHT:
if (xmb->show_fullscreen_thumbnails && (xmb->is_quick_menu && !xmb_is_running_quick_menu()))
return MENU_ACTION_NOOP;
/* Check whether left/right action will
* trigger a tab switch event */
if (xmb->depth == 1)
@ -4256,26 +4237,35 @@ static enum menu_action xmb_parse_menu_entry_action(
/* If this is a menu with thumbnails, attempt
* to show fullscreen thumbnail view */
if (xmb->fullscreen_thumbnails_available)
if (xmb->fullscreen_thumbnails_available &&
!xmb->show_fullscreen_thumbnails)
{
size_t selection = menu_navigation_get_selection();
/* Before showing fullscreen thumbnails, must
* ensure that any existing fullscreen thumbnail
* view is disabled... */
xmb_hide_fullscreen_thumbnails(xmb, false);
if (xmb->fullscreen_thumbnails_available)
xmb_show_fullscreen_thumbnails(xmb, selection);
xmb_show_fullscreen_thumbnails(xmb, menu_navigation_get_selection());
xmb->want_fullscreen_thumbnails = true;
new_action = MENU_ACTION_NOOP;
}
else if (xmb->show_fullscreen_thumbnails || xmb->want_fullscreen_thumbnails)
{
xmb_hide_fullscreen_thumbnails(xmb, true);
xmb->want_fullscreen_thumbnails = false;
}
break;
case MENU_ACTION_SCAN:
if (xmb->fullscreen_thumbnails_available &&
!xmb->show_fullscreen_thumbnails &&
((xmb->is_state_slot) ||
(xmb->is_quick_menu && !string_is_empty(xmb->savestate_thumbnail_file_path))))
{
xmb_hide_fullscreen_thumbnails(xmb, false);
xmb_show_fullscreen_thumbnails(xmb, menu_navigation_get_selection());
xmb->want_fullscreen_thumbnails = true;
new_action = MENU_ACTION_NOOP;
}
else if (xmb->show_fullscreen_thumbnails && !xmb->is_playlist)
{
xmb_hide_fullscreen_thumbnails(xmb, true);
xmb->want_fullscreen_thumbnails = false;
new_action = MENU_ACTION_NOOP;
}
break;
@ -4292,10 +4282,32 @@ static enum menu_action xmb_parse_menu_entry_action(
xmb_show_fullscreen_thumbnails(xmb, menu_navigation_get_selection());
new_action = MENU_ACTION_NOOP;
}
if (xmb->show_fullscreen_thumbnails || xmb->want_fullscreen_thumbnails)
{
xmb_hide_fullscreen_thumbnails(xmb, true);
xmb->want_fullscreen_thumbnails = false;
if (!xmb->is_state_slot && !xmb->is_playlist)
return MENU_ACTION_NOOP;
}
break;
case MENU_ACTION_CANCEL:
if (xmb->is_state_slot)
xmb->skip_thumbnail_reset = true;
if (xmb->show_fullscreen_thumbnails || xmb->want_fullscreen_thumbnails)
{
xmb_hide_fullscreen_thumbnails(xmb, true);
xmb->want_fullscreen_thumbnails = false;
return MENU_ACTION_NOOP;
}
break;
case MENU_ACTION_UP:
case MENU_ACTION_DOWN:
case MENU_ACTION_SCROLL_UP:
case MENU_ACTION_SCROLL_DOWN:
if (xmb->show_fullscreen_thumbnails && xmb->is_quick_menu)
return MENU_ACTION_NOOP;
break;
default:
/* In all other cases, pass through input
@ -4792,7 +4804,7 @@ static void xmb_draw_fullscreen_thumbnails(
settings_t *settings, size_t selection)
{
/* Check whether fullscreen thumbnails are visible */
if (xmb->fullscreen_thumbnail_alpha > 0.0f)
if (xmb->fullscreen_thumbnail_alpha > 0.0f || xmb->want_fullscreen_thumbnails)
{
int header_margin;
int thumbnail_box_width;
@ -4902,7 +4914,9 @@ static void xmb_draw_fullscreen_thumbnails(
* can never happen...
* > Return instead of error to keep fullscreen
* mode after menu/fullscreen toggle */
if (num_thumbnails < 1)
if (num_thumbnails < 1 &&
(right_thumbnail->status == GFX_THUMBNAIL_STATUS_MISSING &&
left_thumbnail->status == GFX_THUMBNAIL_STATUS_MISSING))
return;
/* Get base thumbnail dimensions + draw positions */
@ -5387,6 +5401,17 @@ static void xmb_frame(void *data, video_frame_info_t *video_info)
xmb->fullscreen_thumbnails_available = true;
}
/* Allow browsing playlist in fullscreen thumbnail mode */
if ((xmb->is_playlist || xmb->is_state_slot) &&
xmb->show_fullscreen_thumbnails &&
xmb->fullscreen_thumbnails_available &&
menu_navigation_get_selection() != xmb->fullscreen_thumbnail_selection)
xmb_show_fullscreen_thumbnails(xmb, menu_navigation_get_selection());
else if (!xmb->show_fullscreen_thumbnails &&
xmb->fullscreen_thumbnails_available &&
xmb->want_fullscreen_thumbnails)
xmb_show_fullscreen_thumbnails(xmb, menu_navigation_get_selection());
/* Note: This is incredibly ugly, but there are
* so many combinations here that we would go insane
* trying to rationalise this any further... */

View File

@ -2571,6 +2571,7 @@ bool command_event(enum event_command cmd, void *data)
const char *core_path = "DETECT";
size_t *playlist_index = (size_t*)data;
struct playlist_entry entry = {0};
unsigned i = 0;
/* the update function reads our entry as const,
* so these casts are safe */
@ -2580,9 +2581,11 @@ bool command_event(enum event_command cmd, void *data)
command_playlist_update_write(
NULL, *playlist_index, &entry);
/* Update playlist metadata */
menu_driver_ctl(RARCH_MENU_CTL_REFRESH_THUMBNAIL_IMAGE, &i);
runloop_msg_queue_push(msg_hash_to_str(MSG_RESET_CORE_ASSOCIATION), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
break;
}
case CMD_EVENT_RESTART_RETROARCH:
if (!frontend_driver_set_fork(FRONTEND_FORK_RESTART))