diff --git a/config.def.h b/config.def.h index 3c1b02c72b..dc3f43767e 100644 --- a/config.def.h +++ b/config.def.h @@ -339,6 +339,7 @@ #ifdef HAVE_OZONE #define DEFAULT_OZONE_COLLAPSE_SIDEBAR false #define DEFAULT_OZONE_TRUNCATE_PLAYLIST_NAME true +#define DEFAULT_OZONE_SCROLL_CONTENT_METADATA false #endif #define DEFAULT_SETTINGS_SHOW_DRIVERS true diff --git a/configuration.c b/configuration.c index 78bf874369..9cb5c38362 100644 --- a/configuration.c +++ b/configuration.c @@ -1656,6 +1656,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, #ifdef HAVE_OZONE SETTING_BOOL("ozone_collapse_sidebar", &settings->bools.ozone_collapse_sidebar, true, DEFAULT_OZONE_COLLAPSE_SIDEBAR, false); SETTING_BOOL("ozone_truncate_playlist_name", &settings->bools.ozone_truncate_playlist_name, true, DEFAULT_OZONE_TRUNCATE_PLAYLIST_NAME, false); + SETTING_BOOL("ozone_scroll_content_metadata",&settings->bools.ozone_scroll_content_metadata, true, DEFAULT_OZONE_SCROLL_CONTENT_METADATA, false); #endif SETTING_BOOL("log_to_file", &settings->bools.log_to_file, true, DEFAULT_LOG_TO_FILE, false); SETTING_OVERRIDE(RARCH_OVERRIDE_SETTING_LOG_TO_FILE); diff --git a/configuration.h b/configuration.h index 7107eb790d..90b159f363 100644 --- a/configuration.h +++ b/configuration.h @@ -368,6 +368,7 @@ typedef struct settings bool enable_device_vibration; bool ozone_collapse_sidebar; bool ozone_truncate_playlist_name; + bool ozone_scroll_content_metadata; bool log_to_file; bool log_to_file_timestamp; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 4fcf775066..3f57dc7405 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -721,6 +721,8 @@ MSG_HASH(MENU_ENUM_LABEL_OZONE_COLLAPSE_SIDEBAR, "ozone_collapse_sidebar") MSG_HASH(MENU_ENUM_LABEL_OZONE_TRUNCATE_PLAYLIST_NAME, "ozone_truncate_playlist_name") +MSG_HASH(MENU_ENUM_LABEL_OZONE_SCROLL_CONTENT_METADATA, + "ozone_scroll_content_metadata") MSG_HASH(MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME, "materialui_menu_color_theme") MSG_HASH(MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 616e31150e..b66b06f502 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -8849,6 +8849,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_OZONE_TRUNCATE_PLAYLIST_NAME, "When enabled, will remove the system names from the playlists. For example, display 'PlayStation' instead of 'Sony - PlayStation'. Changes require a restart to take effect." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_SCROLL_CONTENT_METADATA, + "Use Ticker Text For Content Metadata" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OZONE_SCROLL_CONTENT_METADATA, + "When enabled, each item of content metadata shown on the right sidebar of playlists (associated core, play time) will occupy a single line; strings exceeding the width of the sidebar will be displayed as scrolling ticker text. When disabled, each item of content metadata will be displayed statically, wrapped to occupy as many lines as required." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Use preferred system color theme" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9e124045b2..129606cd99 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -483,6 +483,7 @@ default_sublabel_macro(action_bind_sublabel_menu_color_theme, default_sublabel_macro(action_bind_sublabel_ozone_menu_color_theme, MENU_ENUM_SUBLABEL_OZONE_MENU_COLOR_THEME) default_sublabel_macro(action_bind_sublabel_ozone_collapse_sidebar, MENU_ENUM_SUBLABEL_OZONE_COLLAPSE_SIDEBAR) default_sublabel_macro(action_bind_sublabel_ozone_truncate_playlist_name, MENU_ENUM_SUBLABEL_OZONE_TRUNCATE_PLAYLIST_NAME) +default_sublabel_macro(action_bind_sublabel_ozone_scroll_content_metadata, MENU_ENUM_SUBLABEL_OZONE_SCROLL_CONTENT_METADATA) default_sublabel_macro(action_bind_sublabel_menu_use_preferred_system_color_theme, MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME) default_sublabel_macro(action_bind_sublabel_menu_wallpaper_opacity, MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY) default_sublabel_macro(action_bind_sublabel_menu_framebuffer_opacity, MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY) @@ -1699,6 +1700,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_OZONE_TRUNCATE_PLAYLIST_NAME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_ozone_truncate_playlist_name); break; + case MENU_ENUM_LABEL_OZONE_SCROLL_CONTENT_METADATA: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_ozone_scroll_content_metadata); + break; case MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME: case MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_color_theme); diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 57508c8f1e..e74cfe60e0 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -1238,8 +1238,9 @@ void ozone_update_content_metadata(ozone_handle_t *ozone) if (ozone->is_playlist && playlist) { - const char *core_name = NULL; - const char *core_label = NULL; + const char *core_name = NULL; + const char *core_label = NULL; + bool scroll_content_metadata = settings->bools.ozone_scroll_content_metadata; menu_thumbnail_get_core_name(ozone->thumbnail_path_data, &core_name); @@ -1252,6 +1253,18 @@ void ozone_update_content_metadata(ozone_handle_t *ozone) 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); + /* Word wrap core name string, if required */ + if (!scroll_content_metadata) + { + unsigned metadata_len = + (ozone->dimensions.thumbnail_bar_width - ((ozone->dimensions.sidebar_entry_icon_padding * 2) * 2)) / + ozone->footer_font_glyph_width; + word_wrap(ozone->selection_core_name, ozone->selection_core_name, metadata_len, true, 0); + ozone->selection_core_name_lines = ozone_count_lines(ozone->selection_core_name); + } + else + ozone->selection_core_name_lines = 1; + ozone->selection_core_is_viewer = string_is_equal(core_label, "imageviewer") || string_is_equal(core_label, "musicplayer") || string_is_equal(core_label, "movieplayer"); @@ -1281,6 +1294,20 @@ void ozone_update_content_metadata(ozone_handle_t *ozone) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED)); } + + /* Word wrap last played string, if required */ + if (!scroll_content_metadata) + { + /* Note: Have to use a fixed length of '30' here, to + * avoid awkward wrapping for certain last played time + * formats. Last played strings are well defined, however + * (unlike core names), so this should never overflow the + * side bar */ + word_wrap(ozone->selection_lastplayed, ozone->selection_lastplayed, 30, true, 0); + ozone->selection_lastplayed_lines = ozone_count_lines(ozone->selection_lastplayed); + } + else + ozone->selection_lastplayed_lines = 1; } } diff --git a/menu/drivers/ozone/ozone.h b/menu/drivers/ozone/ozone.h index c321f0ba6b..82d8aa5556 100644 --- a/menu/drivers/ozone/ozone.h +++ b/menu/drivers/ozone/ozone.h @@ -238,6 +238,8 @@ struct ozone_handle char selection_core_name[255]; char selection_playtime[255]; char selection_lastplayed[255]; + unsigned selection_core_name_lines; + unsigned selection_lastplayed_lines; bool selection_core_is_viewer; bool is_db_manager_list; diff --git a/menu/drivers/ozone/ozone_entries.c b/menu/drivers/ozone/ozone_entries.c index 62377ddbac..e5b54c5ae1 100644 --- a/menu/drivers/ozone/ozone_entries.c +++ b/menu/drivers/ozone/ozone_entries.c @@ -708,8 +708,10 @@ static void ozone_draw_no_thumbnail_available(ozone_handle_t *ozone, } static void ozone_content_metadata_line(video_frame_info_t *video_info, ozone_handle_t *ozone, - unsigned *y, unsigned column_x, const char *text) + unsigned *y, unsigned column_x, const char *text, unsigned lines_count) { + int line_height = font_driver_get_line_height(ozone->fonts.footer, 1); + ozone_draw_text(video_info, ozone, text, column_x, @@ -721,7 +723,8 @@ static void ozone_content_metadata_line(video_frame_info_t *video_info, ozone_ha true ); - *y += font_driver_get_line_height(ozone->fonts.footer, 1) * 1.5; + if (lines_count > 0) + *y += (unsigned)(line_height * (lines_count - 1)) + (unsigned)((float)line_height * 1.5f); } void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_info) @@ -816,36 +819,40 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i static const char* const ticker_spacer = OZONE_TICKER_SPACER; unsigned ticker_x_offset = 0; settings_t *settings = config_get_ptr(); + bool scroll_content_metadata = settings->bools.ozone_scroll_content_metadata; bool use_smooth_ticker = settings->bools.menu_ticker_smooth; unsigned y = video_info->height / 2 + ozone->dimensions.sidebar_entry_icon_padding / 2; unsigned separator_padding = ozone->dimensions.sidebar_entry_icon_padding*2; unsigned column_x = x_position + separator_padding; - /* Initial ticker configuration */ - if (use_smooth_ticker) + if (scroll_content_metadata) { - ticker_smooth.idx = menu_animation_get_ticker_pixel_idx(); - ticker_smooth.font_scale = 1.0f; - ticker_smooth.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; - ticker_smooth.spacer = ticker_spacer; - ticker_smooth.x_offset = &ticker_x_offset; - ticker_smooth.dst_str_width = NULL; + /* Initial ticker configuration */ + if (use_smooth_ticker) + { + ticker_smooth.idx = menu_animation_get_ticker_pixel_idx(); + ticker_smooth.font_scale = 1.0f; + ticker_smooth.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; + ticker_smooth.spacer = ticker_spacer; + ticker_smooth.x_offset = &ticker_x_offset; + ticker_smooth.dst_str_width = NULL; - ticker_smooth.font = ozone->fonts.footer; - ticker_smooth.selected = true; - ticker_smooth.field_width = sidebar_width - (separator_padding * 2); - ticker_smooth.dst_str = ticker_buf; - ticker_smooth.dst_str_len = sizeof(ticker_buf); - } - else - { - ticker.idx = menu_animation_get_ticker_idx(); - ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; - ticker.spacer = ticker_spacer; + ticker_smooth.font = ozone->fonts.footer; + ticker_smooth.selected = true; + ticker_smooth.field_width = sidebar_width - (separator_padding * 2); + ticker_smooth.dst_str = ticker_buf; + ticker_smooth.dst_str_len = sizeof(ticker_buf); + } + else + { + ticker.idx = menu_animation_get_ticker_idx(); + ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; + ticker.spacer = ticker_spacer; - ticker.selected = true; - ticker.len = (sidebar_width - (separator_padding * 2)) / ozone->footer_font_glyph_width; - ticker.s = ticker_buf; + ticker.selected = true; + ticker.len = (sidebar_width - (separator_padding * 2)) / ozone->footer_font_glyph_width; + ticker.s = ticker_buf; + } } /* Content metadata */ @@ -860,59 +867,83 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i y += 18; - /* Core association */ - ticker_buf[0] = '\0'; - - if (use_smooth_ticker) + if (scroll_content_metadata) { - ticker_smooth.src_str = ozone->selection_core_name; - menu_animation_ticker_smooth(&ticker_smooth); + /* Core association */ + ticker_buf[0] = '\0'; + + if (use_smooth_ticker) + { + ticker_smooth.src_str = ozone->selection_core_name; + menu_animation_ticker_smooth(&ticker_smooth); + } + else + { + ticker.str = ozone->selection_core_name; + menu_animation_ticker(&ticker); + } + + ozone_content_metadata_line(video_info, ozone, + &y, ticker_x_offset + column_x, + ticker_buf, 1); + + /* Playtime + * Note: It is essentially impossible for this string + * to exceed the width of the sidebar, but since we + * are ticker-texting everything else, we include this + * by default */ + ticker_buf[0] = '\0'; + + if (use_smooth_ticker) + { + ticker_smooth.src_str = ozone->selection_playtime; + menu_animation_ticker_smooth(&ticker_smooth); + } + else + { + ticker.str = ozone->selection_playtime; + menu_animation_ticker(&ticker); + } + + ozone_content_metadata_line(video_info, ozone, + &y, ticker_x_offset + column_x, + ticker_buf, 1); + + /* Last played */ + ticker_buf[0] = '\0'; + + if (use_smooth_ticker) + { + ticker_smooth.src_str = ozone->selection_lastplayed; + menu_animation_ticker_smooth(&ticker_smooth); + } + else + { + ticker.str = ozone->selection_lastplayed; + menu_animation_ticker(&ticker); + } + + ozone_content_metadata_line(video_info, ozone, + &y, ticker_x_offset + column_x, + ticker_buf, 1); } else { - ticker.str = ozone->selection_core_name; - menu_animation_ticker(&ticker); + /* Core association */ + ozone_content_metadata_line(video_info, ozone, + &y, column_x, + ozone->selection_core_name, ozone->selection_core_name_lines); + + /* Playtime */ + ozone_content_metadata_line(video_info, ozone, + &y, column_x, + ozone->selection_playtime, 1); + + /* Last played */ + ozone_content_metadata_line(video_info, ozone, + &y, column_x, + ozone->selection_lastplayed, ozone->selection_lastplayed_lines); } - - ozone_content_metadata_line(video_info, ozone, - &y, ticker_x_offset + column_x, - ticker_buf); - - /* Playtime */ - ticker_buf[0] = '\0'; - - if (use_smooth_ticker) - { - ticker_smooth.src_str = ozone->selection_playtime; - menu_animation_ticker_smooth(&ticker_smooth); - } - else - { - ticker.str = ozone->selection_playtime; - menu_animation_ticker(&ticker); - } - - ozone_content_metadata_line(video_info, ozone, - &y, ticker_x_offset + column_x, - ticker_buf); - - /* Last played */ - ticker_buf[0] = '\0'; - - if (use_smooth_ticker) - { - ticker_smooth.src_str = ozone->selection_lastplayed; - menu_animation_ticker_smooth(&ticker_smooth); - } - else - { - ticker.str = ozone->selection_lastplayed; - menu_animation_ticker(&ticker); - } - - ozone_content_metadata_line(video_info, ozone, - &y, ticker_x_offset + column_x, - ticker_buf); } } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 9dd3470acf..f191443ec9 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5435,6 +5435,7 @@ unsigned menu_displaylist_build_list(file_list_t *list, enum menu_displaylist_ct {MENU_ENUM_LABEL_MENU_TICKER_TYPE, PARSE_ONLY_UINT }, {MENU_ENUM_LABEL_MENU_TICKER_SPEED, PARSE_ONLY_FLOAT}, {MENU_ENUM_LABEL_MENU_TICKER_SMOOTH, PARSE_ONLY_BOOL }, + {MENU_ENUM_LABEL_OZONE_SCROLL_CONTENT_METADATA, PARSE_ONLY_BOOL }, {MENU_ENUM_LABEL_MENU_RGUI_EXTENDED_ASCII, PARSE_ONLY_BOOL }, }; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index d203449754..8e783fbbbd 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -12903,6 +12903,21 @@ static bool setting_append_list( general_write_handler, general_read_handler, SD_FLAG_NONE); + + CONFIG_BOOL( + list, list_info, + &settings->bools.ozone_scroll_content_metadata, + MENU_ENUM_LABEL_OZONE_SCROLL_CONTENT_METADATA, + MENU_ENUM_LABEL_VALUE_OZONE_SCROLL_CONTENT_METADATA, + DEFAULT_OZONE_SCROLL_CONTENT_METADATA, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); } #endif diff --git a/msg_hash.h b/msg_hash.h index 9c614e0f6f..96fe5cf731 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -965,6 +965,7 @@ enum msg_hash_enums MENU_LABEL(OZONE_MENU_COLOR_THEME), MENU_LABEL(OZONE_COLLAPSE_SIDEBAR), MENU_LABEL(OZONE_TRUNCATE_PLAYLIST_NAME), + MENU_LABEL(OZONE_SCROLL_CONTENT_METADATA), MENU_LABEL(MATERIALUI_MENU_COLOR_THEME), MENU_LABEL(QUICK_MENU_OVERRIDE_OPTIONS), MENU_LABEL(SETTINGS_SHOW_DRIVERS),