mirror of
https://github.com/libretro/RetroArch
synced 2025-01-31 15:32:59 +00:00
d6fe0ceab2
cannot be called in ozone_init - menu driver init function too early for mouse input calls
317 lines
8.5 KiB
C
317 lines
8.5 KiB
C
/* RetroArch - A frontend for libretro.
|
|
* Copyright (C) 2018 - natinusala
|
|
* Copyright (C) 2019 - Patrick Scheurenbrand
|
|
*
|
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
|
* of the GNU General Public License as published by the Free Software Found-
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with RetroArch.
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef _OZONE_H
|
|
#define _OZONE_H
|
|
|
|
typedef struct ozone_handle ozone_handle_t;
|
|
|
|
#include "ozone_theme.h"
|
|
#include "ozone_sidebar.h"
|
|
|
|
#include <retro_miscellaneous.h>
|
|
|
|
#include "../../menu_thumbnail_path.h"
|
|
#include "../../menu_driver.h"
|
|
|
|
#include "../../../retroarch.h"
|
|
|
|
#define ANIMATION_PUSH_ENTRY_DURATION 166
|
|
#define ANIMATION_CURSOR_DURATION 133
|
|
#define ANIMATION_CURSOR_PULSE 500
|
|
|
|
#define FONT_SIZE_FOOTER 18
|
|
#define FONT_SIZE_TITLE 36
|
|
#define FONT_SIZE_TIME 22
|
|
#define FONT_SIZE_ENTRIES_LABEL 24
|
|
#define FONT_SIZE_ENTRIES_SUBLABEL 18
|
|
#define FONT_SIZE_SIDEBAR 24
|
|
|
|
#define HEADER_HEIGHT 87
|
|
#define FOOTER_HEIGHT 78
|
|
|
|
#define ENTRY_PADDING_HORIZONTAL_HALF 60
|
|
#define ENTRY_PADDING_HORIZONTAL_FULL 150
|
|
#define ENTRY_PADDING_VERTICAL 20
|
|
#define ENTRY_HEIGHT 50
|
|
#define ENTRY_SPACING 8
|
|
#define ENTRY_ICON_SIZE 46
|
|
#define ENTRY_ICON_PADDING 15
|
|
|
|
#define SIDEBAR_WIDTH 408
|
|
#define SIDEBAR_X_PADDING 40
|
|
#define SIDEBAR_Y_PADDING 20
|
|
#define SIDEBAR_ENTRY_HEIGHT 50
|
|
#define SIDEBAR_ENTRY_Y_PADDING 10
|
|
#define SIDEBAR_ENTRY_ICON_SIZE 46
|
|
#define SIDEBAR_ENTRY_ICON_PADDING 15
|
|
|
|
#define CURSOR_SIZE 64
|
|
|
|
#define INTERVAL_OSK_CURSOR (0.5f * 1000000)
|
|
|
|
#if defined(__APPLE__)
|
|
/* UTF-8 support is currently broken on Apple devices... */
|
|
#define OZONE_TICKER_SPACER " | "
|
|
#else
|
|
/* <EM SPACE><BULLET><EM SPACE>
|
|
* UCN equivalent: "\u2003\u2022\u2003" */
|
|
#define OZONE_TICKER_SPACER "\xE2\x80\x83\xE2\x80\xA2\xE2\x80\x83"
|
|
#endif
|
|
|
|
struct ozone_handle
|
|
{
|
|
struct
|
|
{
|
|
font_data_t *footer;
|
|
font_data_t *title;
|
|
font_data_t *time;
|
|
font_data_t *entries_label;
|
|
font_data_t *entries_sublabel;
|
|
font_data_t *sidebar;
|
|
} fonts;
|
|
|
|
struct
|
|
{
|
|
video_font_raster_block_t footer;
|
|
video_font_raster_block_t title;
|
|
video_font_raster_block_t time;
|
|
video_font_raster_block_t entries_label;
|
|
video_font_raster_block_t entries_sublabel;
|
|
video_font_raster_block_t sidebar;
|
|
} raster_blocks;
|
|
|
|
menu_texture_item textures[OZONE_THEME_TEXTURE_LAST];
|
|
menu_texture_item icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_LAST];
|
|
menu_texture_item tab_textures[OZONE_TAB_TEXTURE_LAST];
|
|
|
|
char title[PATH_MAX_LENGTH];
|
|
|
|
char assets_path[PATH_MAX_LENGTH];
|
|
char png_path[PATH_MAX_LENGTH];
|
|
char icons_path[PATH_MAX_LENGTH];
|
|
char tab_path[PATH_MAX_LENGTH];
|
|
|
|
uint8_t system_tab_end;
|
|
uint8_t tabs[OZONE_SYSTEM_TAB_LAST];
|
|
|
|
size_t categories_selection_ptr; /* active tab id */
|
|
size_t categories_active_idx_old;
|
|
|
|
bool cursor_in_sidebar;
|
|
bool cursor_in_sidebar_old;
|
|
|
|
struct
|
|
{
|
|
float cursor_alpha;
|
|
float scroll_y;
|
|
float scroll_y_sidebar;
|
|
|
|
float list_alpha;
|
|
|
|
float messagebox_alpha;
|
|
|
|
float sidebar_text_alpha;
|
|
float thumbnail_bar_position;
|
|
} animations;
|
|
|
|
bool fade_direction; /* false = left to right, true = right to left */
|
|
|
|
size_t selection; /* currently selected entry */
|
|
size_t selection_old; /* previously selected entry (for fancy animation) */
|
|
size_t selection_old_list;
|
|
|
|
unsigned entries_height;
|
|
|
|
int depth;
|
|
|
|
bool draw_sidebar;
|
|
float sidebar_offset;
|
|
|
|
unsigned title_font_glyph_width;
|
|
unsigned entry_font_glyph_width;
|
|
unsigned sublabel_font_glyph_width;
|
|
unsigned footer_font_glyph_width;
|
|
unsigned sidebar_font_glyph_width;
|
|
|
|
ozone_theme_t *theme;
|
|
|
|
struct {
|
|
float selection_border[16];
|
|
float selection[16];
|
|
float entries_border[16];
|
|
float entries_icon[16];
|
|
float entries_checkmark[16];
|
|
float cursor_alpha[16];
|
|
|
|
unsigned cursor_state; /* 0 -> 1 -> 0 -> 1 [...] */
|
|
float cursor_border[16];
|
|
float message_background[16];
|
|
} theme_dynamic;
|
|
|
|
bool need_compute;
|
|
|
|
file_list_t *selection_buf_old;
|
|
|
|
bool draw_old_list;
|
|
float scroll_old;
|
|
|
|
char *pending_message;
|
|
bool has_all_assets;
|
|
|
|
bool is_playlist;
|
|
bool is_playlist_old;
|
|
|
|
bool empty_playlist;
|
|
|
|
bool osk_cursor; /* true = display it, false = don't */
|
|
bool messagebox_state;
|
|
bool messagebox_state_old;
|
|
bool should_draw_messagebox;
|
|
|
|
unsigned old_list_offset_y;
|
|
|
|
file_list_t *horizontal_list; /* console tabs */
|
|
|
|
struct {
|
|
int header_height;
|
|
int footer_height;
|
|
|
|
int entry_padding_horizontal_half;
|
|
int entry_padding_horizontal_full;
|
|
int entry_padding_vertical;
|
|
int entry_height;
|
|
int entry_spacing;
|
|
int entry_icon_size;
|
|
int entry_icon_padding;
|
|
|
|
int sidebar_width_normal;
|
|
int sidebar_width_collapsed;
|
|
|
|
float sidebar_width; /* animated field */
|
|
int sidebar_padding_horizontal;
|
|
int sidebar_padding_vertical;
|
|
int sidebar_entry_padding_vertical;
|
|
int sidebar_entry_height;
|
|
int sidebar_entry_icon_size;
|
|
int sidebar_entry_icon_padding;
|
|
|
|
int cursor_size;
|
|
|
|
int thumbnail_bar_width;
|
|
|
|
float thumbnail_width; /* set at layout time */
|
|
float thumbnail_height; /* set later to thumbnail_width * image aspect ratio */
|
|
float left_thumbnail_width; /* set at layout time */
|
|
float left_thumbnail_height; /* set later to left_thumbnail_width * image aspect ratio */
|
|
} dimensions;
|
|
|
|
bool show_cursor;
|
|
bool cursor_mode;
|
|
|
|
int16_t cursor_x_old;
|
|
int16_t cursor_y_old;
|
|
|
|
bool sidebar_collapsed;
|
|
|
|
/* Thumbnails data */
|
|
bool show_thumbnail_bar;
|
|
|
|
uintptr_t thumbnail;
|
|
uintptr_t left_thumbnail;
|
|
|
|
menu_thumbnail_path_data_t *thumbnail_path_data;
|
|
|
|
char selection_core_name[255];
|
|
char selection_playtime[255];
|
|
char selection_lastplayed[255];
|
|
unsigned selection_core_name_lines;
|
|
bool selection_core_is_viewer;
|
|
|
|
bool is_db_manager_list;
|
|
bool first_frame;
|
|
};
|
|
|
|
/* If you change this struct, also
|
|
change ozone_alloc_node and
|
|
ozone_copy_node */
|
|
typedef struct ozone_node
|
|
{
|
|
/* Entries */
|
|
unsigned height;
|
|
unsigned position_y;
|
|
bool wrap;
|
|
char *fullpath;
|
|
|
|
/* Console tabs */
|
|
char *console_name;
|
|
uintptr_t icon;
|
|
uintptr_t content_icon;
|
|
} ozone_node_t;
|
|
|
|
void ozone_draw_entries(ozone_handle_t *ozone, video_frame_info_t *video_info,
|
|
unsigned selection, unsigned selection_old,
|
|
file_list_t *selection_buf, float alpha, float scroll_y,
|
|
bool is_playlist);
|
|
|
|
void ozone_draw_sidebar(ozone_handle_t *ozone, video_frame_info_t *video_info);
|
|
|
|
void ozone_change_tab(ozone_handle_t *ozone,
|
|
enum msg_hash_enums tab,
|
|
enum menu_settings_type type);
|
|
|
|
void ozone_sidebar_goto(ozone_handle_t *ozone, unsigned new_selection);
|
|
|
|
unsigned ozone_get_sidebar_height(ozone_handle_t *ozone);
|
|
|
|
unsigned ozone_get_selected_sidebar_y_position(ozone_handle_t *ozone);
|
|
|
|
void ozone_leave_sidebar(ozone_handle_t *ozone, uintptr_t tag);
|
|
|
|
void ozone_go_to_sidebar(ozone_handle_t *ozone, uintptr_t tag);
|
|
|
|
void ozone_refresh_horizontal_list(ozone_handle_t *ozone);
|
|
|
|
void ozone_init_horizontal_list(ozone_handle_t *ozone);
|
|
|
|
void ozone_context_destroy_horizontal_list(ozone_handle_t *ozone);
|
|
|
|
void ozone_context_reset_horizontal_list(ozone_handle_t *ozone);
|
|
|
|
ozone_node_t *ozone_alloc_node(void);
|
|
|
|
size_t ozone_list_get_size(void *data, enum menu_list_type type);
|
|
|
|
void ozone_free_list_nodes(file_list_t *list, bool actiondata);
|
|
|
|
bool ozone_is_playlist(ozone_handle_t *ozone, bool depth);
|
|
|
|
void ozone_compute_entries_position(ozone_handle_t *ozone);
|
|
|
|
void ozone_update_scroll(ozone_handle_t *ozone, bool allow_animation, ozone_node_t *node);
|
|
|
|
void ozone_sidebar_update_collapse(ozone_handle_t *ozone, bool allow_animation);
|
|
|
|
void ozone_entries_update_thumbnail_bar(ozone_handle_t *ozone, bool is_playlist, bool allow_animation);
|
|
|
|
void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_info);
|
|
|
|
unsigned ozone_count_lines(const char *str);
|
|
|
|
void ozone_update_content_metadata(ozone_handle_t *ozone);
|
|
|
|
#endif
|