mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
Merge pull request #7595 from natinusala/ozone
Ozone: add console playlists support, always enable, set as default for libnx
This commit is contained in:
commit
f2d184ead6
@ -675,9 +675,9 @@ ifeq ($(HW_CONTEXT_MENU_DRIVERS), 1)
|
||||
#HAVE_STRIPES = 1
|
||||
#endif
|
||||
|
||||
#ifeq ($(HAVE_OZONE),)
|
||||
#HAVE_OZONE = 1
|
||||
#endif
|
||||
ifeq ($(HAVE_OZONE),)
|
||||
HAVE_OZONE = 1
|
||||
endif
|
||||
else
|
||||
HAVE_ZARCH ?= 0
|
||||
HAVE_MATERIALUI ?= 0
|
||||
|
@ -547,8 +547,8 @@ static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_NULL;
|
||||
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XUI;
|
||||
#elif defined(HAVE_MATERIALUI) && defined(RARCH_MOBILE)
|
||||
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_MATERIALUI;
|
||||
/* #elif defined(HAVE_OZONE) && defined(HAVE_LIBNX)
|
||||
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_OZONE; */
|
||||
#elif defined(HAVE_OZONE) && defined(HAVE_LIBNX)
|
||||
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_OZONE;
|
||||
#elif defined(HAVE_XMB) && !defined(_XBOX)
|
||||
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XMB;
|
||||
#elif defined(HAVE_RGUI)
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <encodings/utf.h>
|
||||
#include <streams/file_stream.h>
|
||||
#include <features/features_cpu.h>
|
||||
#include <formats/image.h>
|
||||
|
||||
#include "menu_generic.h"
|
||||
|
||||
@ -554,6 +555,7 @@ typedef struct ozone_handle
|
||||
{
|
||||
float cursor_alpha;
|
||||
float scroll_y;
|
||||
float scroll_y_sidebar;
|
||||
|
||||
float list_alpha;
|
||||
|
||||
@ -599,8 +601,6 @@ typedef struct ozone_handle
|
||||
bool draw_old_list;
|
||||
float scroll_old;
|
||||
|
||||
bool want_horizontal_animation;
|
||||
|
||||
char *pending_message;
|
||||
bool has_all_assets;
|
||||
|
||||
@ -615,6 +615,8 @@ typedef struct ozone_handle
|
||||
bool should_draw_messagebox;
|
||||
|
||||
unsigned old_list_offset_y;
|
||||
|
||||
file_list_t *horizontal_list; /* console tabs */
|
||||
} ozone_handle_t;
|
||||
|
||||
/* If you change this struct, also
|
||||
@ -622,9 +624,15 @@ typedef struct ozone_handle
|
||||
ozone_copy_node */
|
||||
typedef struct ozone_node
|
||||
{
|
||||
/* Entries */
|
||||
unsigned height;
|
||||
unsigned position_y;
|
||||
bool wrap;
|
||||
|
||||
/* Console tabs */
|
||||
char *console_name;
|
||||
uintptr_t icon;
|
||||
uintptr_t content_icon;
|
||||
} ozone_node_t;
|
||||
|
||||
static const char *ozone_entries_icon_texture_path(ozone_handle_t *ozone, unsigned id)
|
||||
@ -1538,6 +1546,278 @@ static void ozone_set_color_theme(ozone_handle_t *ozone, unsigned color_theme)
|
||||
last_color_theme = color_theme;
|
||||
}
|
||||
|
||||
static ozone_node_t *ozone_alloc_node()
|
||||
{
|
||||
ozone_node_t *node = (ozone_node_t*)malloc(sizeof(*node));
|
||||
|
||||
node->height = 0;
|
||||
node->position_y = 0;
|
||||
node->console_name = NULL;
|
||||
node->icon = 0;
|
||||
node->content_icon = 0;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static size_t ozone_list_get_size(void *data, enum menu_list_type type)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*) data;
|
||||
|
||||
if (!ozone)
|
||||
return 0;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MENU_LIST_PLAIN:
|
||||
return menu_entries_get_stack_size(0);
|
||||
case MENU_LIST_HORIZONTAL:
|
||||
if (ozone && ozone->horizontal_list)
|
||||
return file_list_get_size(ozone->horizontal_list);
|
||||
break;
|
||||
case MENU_LIST_TABS:
|
||||
return ozone->system_tab_end;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ozone_context_reset_horizontal_list(ozone_handle_t *ozone)
|
||||
{
|
||||
unsigned i;
|
||||
const char *title;
|
||||
char title_noext[255];
|
||||
|
||||
size_t list_size = ozone_list_get_size(ozone, MENU_LIST_HORIZONTAL);
|
||||
|
||||
for (i = 0; i < list_size; i++)
|
||||
{
|
||||
const char *path = NULL;
|
||||
ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(ozone->horizontal_list, i);
|
||||
|
||||
if (!node)
|
||||
{
|
||||
node = ozone_alloc_node();
|
||||
if (!node)
|
||||
continue;
|
||||
}
|
||||
|
||||
file_list_get_at_offset(ozone->horizontal_list, i,
|
||||
&path, NULL, NULL, NULL);
|
||||
|
||||
if (!path)
|
||||
continue;
|
||||
|
||||
if (!strstr(path, file_path_str(FILE_PATH_LPL_EXTENSION)))
|
||||
continue;
|
||||
|
||||
{
|
||||
struct texture_image ti;
|
||||
char *sysname = (char*)
|
||||
malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
char *texturepath = (char*)
|
||||
malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
char *content_texturepath = (char*)
|
||||
malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
|
||||
sysname[0] = texturepath[0] = content_texturepath[0] = '\0';
|
||||
|
||||
fill_pathname_base_noext(sysname, path,
|
||||
PATH_MAX_LENGTH * sizeof(char));
|
||||
|
||||
fill_pathname_join_concat(texturepath, ozone->icons_path, sysname,
|
||||
file_path_str(FILE_PATH_PNG_EXTENSION),
|
||||
PATH_MAX_LENGTH * sizeof(char));
|
||||
|
||||
/* If the playlist icon doesn't exist return default */
|
||||
|
||||
if (!filestream_exists(texturepath))
|
||||
fill_pathname_join_concat(texturepath, ozone->icons_path, "default",
|
||||
file_path_str(FILE_PATH_PNG_EXTENSION),
|
||||
PATH_MAX_LENGTH * sizeof(char));
|
||||
|
||||
ti.width = 0;
|
||||
ti.height = 0;
|
||||
ti.pixels = NULL;
|
||||
ti.supports_rgba = video_driver_supports_rgba();
|
||||
|
||||
if (image_texture_load(&ti, texturepath))
|
||||
{
|
||||
if(ti.pixels)
|
||||
{
|
||||
video_driver_texture_unload(&node->icon);
|
||||
video_driver_texture_load(&ti,
|
||||
TEXTURE_FILTER_MIPMAP_LINEAR, &node->icon);
|
||||
}
|
||||
|
||||
image_texture_free(&ti);
|
||||
}
|
||||
|
||||
fill_pathname_join_delim(sysname, sysname,
|
||||
file_path_str(FILE_PATH_CONTENT_BASENAME), '-',
|
||||
PATH_MAX_LENGTH * sizeof(char));
|
||||
strlcat(content_texturepath, ozone->icons_path, PATH_MAX_LENGTH * sizeof(char));
|
||||
|
||||
strlcat(content_texturepath, path_default_slash(), PATH_MAX_LENGTH * sizeof(char));
|
||||
strlcat(content_texturepath, sysname, PATH_MAX_LENGTH * sizeof(char));
|
||||
|
||||
/* If the content icon doesn't exist return default-content */
|
||||
if (!filestream_exists(content_texturepath))
|
||||
{
|
||||
strlcat(ozone->icons_path, "default", PATH_MAX_LENGTH * sizeof(char));
|
||||
fill_pathname_join_delim(content_texturepath, ozone->icons_path,
|
||||
file_path_str(FILE_PATH_CONTENT_BASENAME), '-',
|
||||
PATH_MAX_LENGTH * sizeof(char));
|
||||
}
|
||||
|
||||
if (image_texture_load(&ti, content_texturepath))
|
||||
{
|
||||
if(ti.pixels)
|
||||
{
|
||||
video_driver_texture_unload(&node->content_icon);
|
||||
video_driver_texture_load(&ti,
|
||||
TEXTURE_FILTER_MIPMAP_LINEAR, &node->content_icon);
|
||||
}
|
||||
|
||||
image_texture_free(&ti);
|
||||
}
|
||||
|
||||
/* Console name */
|
||||
menu_entries_get_at_offset(
|
||||
ozone->horizontal_list,
|
||||
i,
|
||||
&title, NULL, NULL, NULL, NULL);
|
||||
|
||||
fill_pathname_base_noext(title_noext, title, sizeof(title_noext));
|
||||
|
||||
/* Format : "Vendor - Console"
|
||||
Remove everything before the hyphen
|
||||
and the subsequent space */
|
||||
char *chr = title_noext;
|
||||
|
||||
while (*chr != '-' && *chr != '\0')
|
||||
{
|
||||
chr++;
|
||||
}
|
||||
|
||||
chr += 2;
|
||||
|
||||
node->console_name = strdup(chr);
|
||||
|
||||
free(sysname);
|
||||
free(texturepath);
|
||||
free(content_texturepath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ozone_context_destroy_horizontal_list(ozone_handle_t *ozone)
|
||||
{
|
||||
unsigned i;
|
||||
size_t list_size = ozone_list_get_size(ozone, MENU_LIST_HORIZONTAL);
|
||||
|
||||
for (i = 0; i < list_size; i++)
|
||||
{
|
||||
const char *path = NULL;
|
||||
ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(ozone->horizontal_list, i);
|
||||
|
||||
if (!node)
|
||||
continue;
|
||||
|
||||
file_list_get_at_offset(ozone->horizontal_list, i,
|
||||
&path, NULL, NULL, NULL);
|
||||
|
||||
if (!path || !strstr(path, file_path_str(FILE_PATH_LPL_EXTENSION)))
|
||||
continue;
|
||||
|
||||
video_driver_texture_unload(&node->icon);
|
||||
video_driver_texture_unload(&node->content_icon);
|
||||
}
|
||||
}
|
||||
|
||||
static void ozone_free_node(ozone_node_t *node)
|
||||
{
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
if (node->console_name)
|
||||
free(node->console_name);
|
||||
|
||||
free(node);
|
||||
}
|
||||
|
||||
static void ozone_free_list_nodes(file_list_t *list, bool actiondata)
|
||||
{
|
||||
unsigned i, size = (unsigned)file_list_get_size(list);
|
||||
|
||||
for (i = 0; i < size; ++i)
|
||||
{
|
||||
ozone_free_node((ozone_node_t*)file_list_get_userdata_at_offset(list, i));
|
||||
|
||||
/* file_list_set_userdata() doesn't accept NULL */
|
||||
list->list[i].userdata = NULL;
|
||||
|
||||
if (actiondata)
|
||||
file_list_free_actiondata(list, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void ozone_init_horizontal_list(ozone_handle_t *ozone)
|
||||
{
|
||||
menu_displaylist_info_t info;
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
menu_displaylist_info_init(&info);
|
||||
|
||||
info.list = ozone->horizontal_list;
|
||||
info.path = strdup(
|
||||
settings->paths.directory_playlist);
|
||||
info.label = strdup(
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST));
|
||||
info.exts = strdup(
|
||||
file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT));
|
||||
info.type_default = FILE_TYPE_PLAIN;
|
||||
info.enum_idx = MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST;
|
||||
|
||||
if (settings->bools.menu_content_show_playlists && !string_is_empty(info.path))
|
||||
{
|
||||
if (menu_displaylist_ctl(DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL, &info))
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < ozone->horizontal_list->size; i++)
|
||||
{
|
||||
ozone_node_t *node = ozone_alloc_node();
|
||||
file_list_set_userdata(ozone->horizontal_list, i, node);
|
||||
}
|
||||
|
||||
menu_displaylist_process(&info);
|
||||
}
|
||||
}
|
||||
|
||||
menu_displaylist_info_free(&info);
|
||||
}
|
||||
|
||||
static void ozone_refresh_horizontal_list(ozone_handle_t *ozone)
|
||||
{
|
||||
ozone_context_destroy_horizontal_list(ozone);
|
||||
if (ozone->horizontal_list)
|
||||
{
|
||||
ozone_free_list_nodes(ozone->horizontal_list, false);
|
||||
file_list_free(ozone->horizontal_list);
|
||||
}
|
||||
ozone->horizontal_list = NULL;
|
||||
|
||||
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||
|
||||
ozone->horizontal_list = (file_list_t*)
|
||||
calloc(1, sizeof(file_list_t));
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
ozone_init_horizontal_list(ozone);
|
||||
|
||||
ozone_context_reset_horizontal_list(ozone);
|
||||
}
|
||||
|
||||
static void *ozone_init(void **userdata, bool video_is_threaded)
|
||||
{
|
||||
bool fallback_color_theme = false;
|
||||
@ -1563,7 +1843,6 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
|
||||
|
||||
ozone->selection_buf_old = (file_list_t*)calloc(1, sizeof(file_list_t));
|
||||
|
||||
ozone->want_horizontal_animation = false;
|
||||
ozone->draw_sidebar = true;
|
||||
ozone->sidebar_offset = 0;
|
||||
ozone->pending_message = NULL;
|
||||
@ -1605,6 +1884,11 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
|
||||
|
||||
menu_display_allocate_white_texture();
|
||||
|
||||
ozone->horizontal_list = (file_list_t*)calloc(1, sizeof(file_list_t));
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
ozone_init_horizontal_list(ozone);
|
||||
|
||||
/* Theme */
|
||||
if (settings->bools.menu_use_preferred_system_color_theme)
|
||||
{
|
||||
@ -1632,8 +1916,9 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
|
||||
ozone_set_color_theme(ozone, color_theme);
|
||||
}
|
||||
|
||||
ozone->need_compute = false;
|
||||
ozone->animations.scroll_y = 0.0f;
|
||||
ozone->need_compute = false;
|
||||
ozone->animations.scroll_y = 0.0f;
|
||||
ozone->animations.scroll_y_sidebar = 0.0f;
|
||||
|
||||
/* Assets path */
|
||||
fill_pathname_join(
|
||||
@ -1672,36 +1957,19 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
|
||||
return menu;
|
||||
|
||||
error:
|
||||
if (ozone->horizontal_list)
|
||||
{
|
||||
ozone_free_list_nodes(ozone->horizontal_list, false);
|
||||
file_list_free(ozone->horizontal_list);
|
||||
}
|
||||
ozone->horizontal_list = NULL;
|
||||
|
||||
if (menu)
|
||||
free(menu);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void ozone_free_node(ozone_node_t *node)
|
||||
{
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
free(node);
|
||||
}
|
||||
|
||||
static void ozone_free_list_nodes(file_list_t *list, bool actiondata)
|
||||
{
|
||||
unsigned i, size = (unsigned)file_list_get_size(list);
|
||||
|
||||
for (i = 0; i < size; ++i)
|
||||
{
|
||||
ozone_free_node((ozone_node_t*)file_list_get_userdata_at_offset(list, i));
|
||||
|
||||
/* file_list_set_userdata() doesn't accept NULL */
|
||||
list->list[i].userdata = NULL;
|
||||
|
||||
if (actiondata)
|
||||
file_list_free_actiondata(list, i);
|
||||
}
|
||||
}
|
||||
|
||||
static void ozone_free(void *data)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*) data;
|
||||
@ -1723,6 +1991,12 @@ static void ozone_free(void *data)
|
||||
file_list_free(ozone->selection_buf_old);
|
||||
}
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
{
|
||||
ozone_free_list_nodes(ozone->horizontal_list, false);
|
||||
file_list_free(ozone->horizontal_list);
|
||||
}
|
||||
|
||||
if (!string_is_empty(ozone->pending_message))
|
||||
free(ozone->pending_message);
|
||||
}
|
||||
@ -1812,6 +2086,9 @@ static void ozone_context_reset(void *data, bool is_threaded)
|
||||
|
||||
menu_display_allocate_white_texture();
|
||||
|
||||
/* Horizontal list */
|
||||
ozone_context_reset_horizontal_list(ozone);
|
||||
|
||||
/* State reset */
|
||||
ozone->frame_count = 0;
|
||||
ozone->fade_direction = false;
|
||||
@ -1882,12 +2159,16 @@ static void ozone_context_destroy(void *data)
|
||||
|
||||
menu_animation_ctx_tag tag = (uintptr_t) &ozone_default_theme;
|
||||
menu_animation_kill_by_tag(&tag);
|
||||
|
||||
/* Horizontal list */
|
||||
ozone_context_destroy_horizontal_list(ozone);
|
||||
}
|
||||
|
||||
static void *ozone_list_get_entry(void *data,
|
||||
enum menu_list_type type, unsigned i)
|
||||
{
|
||||
size_t list_size = 0;
|
||||
ozone_handle_t* ozone = (ozone_handle_t*) data;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
@ -1900,7 +2181,10 @@ static void *ozone_list_get_entry(void *data,
|
||||
}
|
||||
break;
|
||||
case MENU_LIST_HORIZONTAL:
|
||||
/* TODO Sidebar */
|
||||
if (ozone && ozone->horizontal_list)
|
||||
list_size = file_list_get_size(ozone->horizontal_list);
|
||||
if (i < list_size)
|
||||
return (void*)&ozone->horizontal_list->list[i];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1909,36 +2193,6 @@ static void *ozone_list_get_entry(void *data,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static unsigned ozone_get_system_tab(ozone_handle_t *ozone, unsigned i)
|
||||
{
|
||||
if (i <= ozone->system_tab_end)
|
||||
return ozone->tabs[i];
|
||||
return UINT_MAX;
|
||||
}
|
||||
#endif
|
||||
|
||||
static size_t ozone_list_get_size(void *data, enum menu_list_type type)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*) data;
|
||||
|
||||
if (!ozone)
|
||||
return 0;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MENU_LIST_PLAIN:
|
||||
return menu_entries_get_stack_size(0);
|
||||
case MENU_LIST_HORIZONTAL:
|
||||
/* TODO Return horizontal list size */
|
||||
return 0;
|
||||
case MENU_LIST_TABS:
|
||||
return ozone->system_tab_end;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ozone_list_push(void *data, void *userdata,
|
||||
menu_displaylist_info_t *info, unsigned type)
|
||||
{
|
||||
@ -2704,12 +2958,19 @@ static void ozone_draw_sidebar(ozone_handle_t *ozone, video_frame_info_t *video_
|
||||
{
|
||||
size_t y;
|
||||
unsigned i, sidebar_height;
|
||||
unsigned selection_y = 0;
|
||||
unsigned selection_old_y = 0;
|
||||
char console_title[255];
|
||||
menu_animation_ctx_ticker_t ticker;
|
||||
|
||||
unsigned selection_y = 0;
|
||||
unsigned selection_old_y = 0;
|
||||
unsigned horizontal_list_size = 0;
|
||||
|
||||
if (!ozone->draw_sidebar)
|
||||
return;
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
horizontal_list_size = ozone->horizontal_list->size;
|
||||
|
||||
menu_display_scissor_begin(video_info, 0, 87, 408, video_info->height - 87 - 78);
|
||||
|
||||
/* Background */
|
||||
@ -2723,32 +2984,39 @@ static void ozone_draw_sidebar(ozone_handle_t *ozone, video_frame_info_t *video_
|
||||
}
|
||||
|
||||
/* Tabs */
|
||||
/* TODO Scroll */
|
||||
|
||||
/* y offset computation */
|
||||
y = ENTRIES_START_Y - 10;
|
||||
for (i = 0; i < OZONE_SYSTEM_TAB_LAST; i++)
|
||||
for (i = 0; i < ozone->system_tab_end + horizontal_list_size + 1; i++)
|
||||
{
|
||||
if (i == ozone->categories_selection_ptr)
|
||||
{
|
||||
selection_y = y;
|
||||
if (ozone->categories_selection_ptr > ozone->system_tab_end)
|
||||
selection_y += 30;
|
||||
}
|
||||
|
||||
if (i == ozone->categories_active_idx_old)
|
||||
{
|
||||
selection_old_y = y;
|
||||
if (ozone->categories_active_idx_old > ozone->system_tab_end)
|
||||
selection_old_y += 30;
|
||||
}
|
||||
|
||||
y += 65;
|
||||
}
|
||||
|
||||
/* Cursor */
|
||||
if (ozone->cursor_in_sidebar)
|
||||
ozone_draw_cursor(ozone, video_info, ozone->sidebar_offset + 41, 408 - 81, 52, selection_y-8, ozone->animations.cursor_alpha);
|
||||
ozone_draw_cursor(ozone, video_info, ozone->sidebar_offset + 41, 408 - 81, 52, selection_y-8 + ozone->animations.scroll_y_sidebar, ozone->animations.cursor_alpha);
|
||||
|
||||
if (ozone->cursor_in_sidebar_old)
|
||||
ozone_draw_cursor(ozone, video_info, ozone->sidebar_offset + 41, 408 - 81, 52, selection_old_y-8, 1-ozone->animations.cursor_alpha);
|
||||
ozone_draw_cursor(ozone, video_info, ozone->sidebar_offset + 41, 408 - 81, 52, selection_old_y-8 + ozone->animations.scroll_y_sidebar, 1-ozone->animations.cursor_alpha);
|
||||
|
||||
/* Icons */
|
||||
/* Menu tabs */
|
||||
y = ENTRIES_START_Y - 10;
|
||||
menu_display_blend_begin(video_info);
|
||||
/* TODO Cache all the tabs data */
|
||||
|
||||
for (i = 0; i < ozone->system_tab_end; i++)
|
||||
for (i = 0; i < ozone->system_tab_end+1; i++)
|
||||
{
|
||||
enum msg_hash_enums value_idx;
|
||||
const char *title = NULL;
|
||||
@ -2756,18 +3024,59 @@ static void ozone_draw_sidebar(ozone_handle_t *ozone, video_frame_info_t *video_
|
||||
unsigned icon = ozone_system_tabs_icons[ozone->tabs[i]];
|
||||
|
||||
/* Icon */
|
||||
ozone_draw_icon(video_info, 40, 40, ozone->tab_textures[icon], ozone->sidebar_offset + 41 + 10, y - 5, video_info->width, video_info->height, 0, 1, (selected ? ozone->theme->text_selected : ozone->theme->entries_icon));
|
||||
ozone_draw_icon(video_info, 40, 40, ozone->tab_textures[icon], ozone->sidebar_offset + 41 + 10, y - 5 + ozone->animations.scroll_y_sidebar, video_info->width, video_info->height, 0, 1, (selected ? ozone->theme->text_selected : ozone->theme->entries_icon));
|
||||
|
||||
value_idx = ozone_system_tabs_value[ozone->tabs[i]];
|
||||
title = msg_hash_to_str(value_idx);
|
||||
|
||||
/* Text */
|
||||
ozone_draw_text(video_info, ozone, title, ozone->sidebar_offset + 115 - 10, y + FONT_SIZE_SIDEBAR, TEXT_ALIGN_LEFT, video_info->width, video_info->height, ozone->fonts.sidebar, (selected ? ozone->theme->text_selected_rgba : ozone->theme->text_rgba), true);
|
||||
ozone_draw_text(video_info, ozone, title, ozone->sidebar_offset + 115 - 10, y + FONT_SIZE_SIDEBAR + ozone->animations.scroll_y_sidebar, TEXT_ALIGN_LEFT, video_info->width, video_info->height, ozone->fonts.sidebar, (selected ? ozone->theme->text_selected_rgba : ozone->theme->text_rgba), true);
|
||||
|
||||
y += 65;
|
||||
}
|
||||
|
||||
menu_display_blend_end(video_info);
|
||||
|
||||
/* Console tabs */
|
||||
if (horizontal_list_size > 0)
|
||||
{
|
||||
menu_display_draw_quad(video_info, ozone->sidebar_offset + 41 + 10, y - 5 + ozone->animations.scroll_y_sidebar, 408-81, 1, video_info->width, video_info->height, ozone->theme->entries_border);
|
||||
|
||||
y += 30;
|
||||
|
||||
menu_display_blend_begin(video_info);
|
||||
|
||||
for (i = 0; i < horizontal_list_size; i++)
|
||||
{
|
||||
bool selected = (ozone->categories_selection_ptr == ozone->system_tab_end + 1 + i);
|
||||
|
||||
ozone_node_t *node = (ozone_node_t*) file_list_get_userdata_at_offset(ozone->horizontal_list, i);
|
||||
|
||||
if (!node)
|
||||
goto console_iterate;
|
||||
|
||||
/* Icon */
|
||||
ozone_draw_icon(video_info, 40, 40, node->icon, ozone->sidebar_offset + 41 + 10, y - 5 + ozone->animations.scroll_y_sidebar, video_info->width, video_info->height, 0, 1, (selected ? ozone->theme->text_selected : ozone->theme->entries_icon));
|
||||
|
||||
/* Text */
|
||||
ticker.idx = ozone->frame_count / 20;
|
||||
ticker.len = 19;
|
||||
ticker.s = console_title;
|
||||
ticker.selected = selected;
|
||||
ticker.str = node->console_name;
|
||||
|
||||
menu_animation_ticker(&ticker);
|
||||
|
||||
ozone_draw_text(video_info, ozone, console_title, ozone->sidebar_offset + 115 - 10, y + FONT_SIZE_SIDEBAR + ozone->animations.scroll_y_sidebar, TEXT_ALIGN_LEFT, video_info->width, video_info->height, ozone->fonts.sidebar, (selected ? ozone->theme->text_selected_rgba : ozone->theme->text_rgba), true);
|
||||
|
||||
console_iterate:
|
||||
y += 65;
|
||||
}
|
||||
|
||||
menu_display_blend_end(video_info);
|
||||
|
||||
}
|
||||
|
||||
font_driver_flush(video_info->width, video_info->height, ozone->fonts.sidebar, video_info);
|
||||
ozone->raster_blocks.sidebar.carr.coords.vertices = 0;
|
||||
|
||||
@ -2998,10 +3307,23 @@ border_iterate:
|
||||
icon = ozone_entries_icon_get_id(ozone, entry.enum_idx, entry.type, entry_selected);
|
||||
if (icon != OZONE_ENTRIES_ICONS_TEXTURE_SUBSETTING)
|
||||
{
|
||||
uintptr_t texture = ozone->icons_textures[icon];
|
||||
|
||||
/* Console specific icons */
|
||||
if (entry.type == FILE_TYPE_RPL_ENTRY && ozone->horizontal_list && ozone->categories_selection_ptr > ozone->system_tab_end)
|
||||
{
|
||||
ozone_node_t *sidebar_node = (ozone_node_t*) file_list_get_userdata_at_offset(ozone->horizontal_list, ozone->categories_selection_ptr - ozone->system_tab_end);
|
||||
|
||||
if (!sidebar_node || !sidebar_node->content_icon)
|
||||
texture = ozone->icons_textures[icon];
|
||||
else
|
||||
texture = sidebar_node->content_icon;
|
||||
}
|
||||
|
||||
ozone_color_alpha(ozone->theme_dynamic.entries_icon, alpha);
|
||||
|
||||
menu_display_blend_begin(video_info);
|
||||
ozone_draw_icon(video_info, 46, 46, ozone->icons_textures[icon], x_offset + 451+5+10, y + scroll_y, video_info->width, video_info->height, 0, 1, ozone->theme_dynamic.entries_icon);
|
||||
ozone_draw_icon(video_info, 46, 46, texture, x_offset + 451+5+10, y + scroll_y, video_info->width, video_info->height, 0, 1, ozone->theme_dynamic.entries_icon);
|
||||
menu_display_blend_end(video_info);
|
||||
|
||||
text_offset = 0;
|
||||
@ -3461,9 +3783,17 @@ static void ozone_frame(void *data, video_frame_info_t *video_info)
|
||||
|
||||
static void ozone_set_header(ozone_handle_t *ozone)
|
||||
{
|
||||
/* TODO Set title of playlist if in a playlist */
|
||||
if (ozone->categories_selection_ptr <= ozone->system_tab_end)
|
||||
{
|
||||
menu_entries_get_title(ozone->title, sizeof(ozone->title));
|
||||
}
|
||||
else if (ozone->horizontal_list)
|
||||
{
|
||||
ozone_node_t *node = (ozone_node_t*) file_list_get_userdata_at_offset(ozone->horizontal_list, ozone->categories_selection_ptr - ozone->system_tab_end-1);
|
||||
|
||||
menu_entries_get_title(ozone->title, sizeof(ozone->title));
|
||||
if (node && node->console_name)
|
||||
strlcpy(ozone->title, node->console_name, sizeof(ozone->title));
|
||||
}
|
||||
}
|
||||
|
||||
static void ozone_animation_end(void *userdata)
|
||||
@ -3476,12 +3806,6 @@ static void ozone_list_open(ozone_handle_t *ozone)
|
||||
{
|
||||
struct menu_animation_ctx_entry entry;
|
||||
|
||||
if (!ozone->want_horizontal_animation)
|
||||
{
|
||||
ozone->want_horizontal_animation = true;
|
||||
return;
|
||||
}
|
||||
|
||||
ozone->draw_old_list = true;
|
||||
|
||||
/* Left/right animation */
|
||||
@ -3560,7 +3884,9 @@ static void ozone_populate_entries(void *data, const char *path, const char *lab
|
||||
}
|
||||
}
|
||||
|
||||
static void ozone_change_tab(ozone_handle_t *ozone, enum msg_hash_enums tab, enum menu_settings_type type)
|
||||
static void ozone_change_tab(ozone_handle_t *ozone,
|
||||
enum msg_hash_enums tab,
|
||||
enum menu_settings_type type)
|
||||
{
|
||||
file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0);
|
||||
size_t stack_size;
|
||||
@ -3638,8 +3964,23 @@ static void ozone_leave_sidebar(ozone_handle_t *ozone, uintptr_t tag)
|
||||
menu_animation_push(&entry);
|
||||
}
|
||||
|
||||
static unsigned ozone_get_selected_sidebar_y_position(ozone_handle_t *ozone)
|
||||
{
|
||||
return ozone->categories_selection_ptr * 65 + (ozone->categories_selection_ptr > ozone->system_tab_end ? 30 : 0);
|
||||
}
|
||||
|
||||
static unsigned ozone_get_sidebar_height(ozone_handle_t *ozone)
|
||||
{
|
||||
return (ozone->system_tab_end + 1 + (ozone->horizontal_list ? ozone->horizontal_list->size : 0)) * 65
|
||||
+ (ozone->horizontal_list && ozone->horizontal_list->size > 0 ? 30 : 0);
|
||||
}
|
||||
|
||||
static void ozone_sidebar_goto(ozone_handle_t *ozone, unsigned new_selection)
|
||||
{
|
||||
unsigned video_info_height;
|
||||
|
||||
video_driver_get_size(NULL, &video_info_height);
|
||||
|
||||
struct menu_animation_ctx_entry entry;
|
||||
|
||||
menu_animation_ctx_tag tag = (uintptr_t)ozone;
|
||||
@ -3667,7 +4008,41 @@ static void ozone_sidebar_goto(ozone_handle_t *ozone, unsigned new_selection)
|
||||
|
||||
menu_animation_push(&entry);
|
||||
|
||||
ozone_change_tab(ozone, ozone_system_tabs_idx[ozone->tabs[new_selection]], ozone_system_tabs_type[ozone->tabs[new_selection]]);
|
||||
/* Scroll animation */
|
||||
float new_scroll = 0;
|
||||
float selected_position_y = ozone_get_selected_sidebar_y_position(ozone);
|
||||
float current_selection_middle_onscreen = ENTRIES_START_Y - 10 + ozone->animations.scroll_y_sidebar + selected_position_y + 65 / 2;
|
||||
float bottom_boundary = video_info_height - 87 - 78;
|
||||
float entries_middle = video_info_height/2;
|
||||
float entries_height = ozone_get_sidebar_height(ozone);
|
||||
|
||||
if (current_selection_middle_onscreen != entries_middle)
|
||||
new_scroll = ozone->animations.scroll_y_sidebar - (current_selection_middle_onscreen - entries_middle);
|
||||
|
||||
if (new_scroll + entries_height < bottom_boundary)
|
||||
new_scroll = -(30 + entries_height - bottom_boundary);
|
||||
|
||||
if (new_scroll > 0)
|
||||
new_scroll = 0;
|
||||
|
||||
entry.cb = NULL;
|
||||
entry.duration = ANIMATION_CURSOR_DURATION;
|
||||
entry.easing_enum = EASING_OUT_QUAD;
|
||||
entry.subject = &ozone->animations.scroll_y_sidebar;
|
||||
entry.tag = tag;
|
||||
entry.target_value = new_scroll;
|
||||
entry.userdata = NULL;
|
||||
|
||||
menu_animation_push(&entry);
|
||||
|
||||
if (new_selection > ozone->system_tab_end)
|
||||
{
|
||||
ozone_change_tab(ozone, MENU_ENUM_LABEL_HORIZONTAL_MENU, MENU_SETTING_HORIZONTAL_MENU);
|
||||
}
|
||||
else
|
||||
{
|
||||
ozone_change_tab(ozone, ozone_system_tabs_idx[ozone->tabs[new_selection]], ozone_system_tabs_type[ozone->tabs[new_selection]]);
|
||||
}
|
||||
}
|
||||
|
||||
static int ozone_menu_iterate(menu_handle_t *menu, void *userdata, enum menu_action action)
|
||||
@ -3676,8 +4051,13 @@ static int ozone_menu_iterate(menu_handle_t *menu, void *userdata, enum menu_act
|
||||
struct menu_animation_ctx_entry entry;
|
||||
enum menu_action new_action;
|
||||
menu_animation_ctx_tag tag;
|
||||
file_list_t *selection_buf = NULL;
|
||||
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
||||
|
||||
file_list_t *selection_buf = NULL;
|
||||
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
||||
unsigned horizontal_list_size = 0;
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
horizontal_list_size = ozone->horizontal_list->size;
|
||||
|
||||
ozone->messagebox_state = false || menu_input_dialog_get_display_kb();
|
||||
|
||||
@ -3699,7 +4079,7 @@ static int ozone_menu_iterate(menu_handle_t *menu, void *userdata, enum menu_act
|
||||
|
||||
new_selection = (ozone->categories_selection_ptr + 1);
|
||||
|
||||
if (new_selection >= ozone->system_tab_end)
|
||||
if (new_selection >= ozone->system_tab_end + horizontal_list_size + 1)
|
||||
new_selection = 0;
|
||||
|
||||
ozone_sidebar_goto(ozone, new_selection);
|
||||
@ -3715,7 +4095,7 @@ static int ozone_menu_iterate(menu_handle_t *menu, void *userdata, enum menu_act
|
||||
new_selection = ozone->categories_selection_ptr - 1;
|
||||
|
||||
if (new_selection < 0)
|
||||
new_selection = ozone->system_tab_end-1;
|
||||
new_selection = horizontal_list_size + ozone->system_tab_end;
|
||||
|
||||
ozone_sidebar_goto(ozone, new_selection);
|
||||
|
||||
@ -3842,16 +4222,6 @@ error:
|
||||
return false;
|
||||
}
|
||||
|
||||
static ozone_node_t *ozone_alloc_node()
|
||||
{
|
||||
ozone_node_t *node = (ozone_node_t*)malloc(sizeof(*node));
|
||||
|
||||
node->height = 0;
|
||||
node->position_y = 0;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static ozone_node_t *ozone_copy_node(const ozone_node_t *old_node)
|
||||
{
|
||||
ozone_node_t *new_node = (ozone_node_t*)malloc(sizeof(*new_node));
|
||||
@ -3991,12 +4361,6 @@ text_iterate:
|
||||
ozone_list_deep_copy(selection_buf, ozone->selection_buf_old, first, last);
|
||||
}
|
||||
|
||||
static void ozone_refresh_consoles_list(ozone_handle_t *ozone)
|
||||
{
|
||||
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||
/* TODO Refresh consoles list (= horizontal list) */
|
||||
}
|
||||
|
||||
static int ozone_environ_cb(enum menu_environ_cb type, void *data, void *userdata)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*) userdata;
|
||||
@ -4007,7 +4371,10 @@ static int ozone_environ_cb(enum menu_environ_cb type, void *data, void *userdat
|
||||
switch (type)
|
||||
{
|
||||
case MENU_ENVIRON_RESET_HORIZONTAL_LIST:
|
||||
ozone_refresh_consoles_list(ozone);
|
||||
if (!ozone)
|
||||
return -1;
|
||||
|
||||
ozone_refresh_horizontal_list(ozone);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
|
@ -10,7 +10,7 @@ HAVE_LIBRETRODB=yes # Libretrodb support
|
||||
HAVE_RGUI=yes # RGUI menu
|
||||
HAVE_MATERIALUI=auto # MaterialUI menu
|
||||
HAVE_XMB=auto # XMB menu
|
||||
HAVE_OZONE=no # Ozone menu
|
||||
HAVE_OZONE=auto # Ozone menu
|
||||
HAVE_STRIPES=no # Stripes menu
|
||||
HAVE_ZARCH=no # Zarch menu
|
||||
HAVE_NUKLEAR=no # Nuklear menu
|
||||
|
Loading…
x
Reference in New Issue
Block a user