mirror of
https://github.com/libretro/RetroArch
synced 2025-04-18 14:42:30 +00:00
(XMB) Vertical animations
This commit is contained in:
parent
c162510005
commit
fed8744aef
@ -40,8 +40,32 @@
|
|||||||
#include "../../../gfx/fonts/bitmap.h"
|
#include "../../../gfx/fonts/bitmap.h"
|
||||||
|
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
|
#include "tween.h"
|
||||||
|
|
||||||
#define THEME "monochrome"
|
#ifndef XMB_THEME
|
||||||
|
#define XMB_THEME "monochrome"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef XMB_DELAY
|
||||||
|
#define XMB_DELAY 0.02
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[256];
|
||||||
|
char value[256];
|
||||||
|
float alpha;
|
||||||
|
float zoom;
|
||||||
|
float y;
|
||||||
|
} xmb_node_t;
|
||||||
|
|
||||||
|
xmb_node_t *xmb_nodes;
|
||||||
|
|
||||||
|
char xmb_title[256] = "";
|
||||||
|
char xmb_oldtitle[256] = "";
|
||||||
|
int xmb_depth = 0;
|
||||||
|
int selptr = -1;
|
||||||
|
int oldselptr = -1;
|
||||||
|
|
||||||
unsigned line_height, glyph_width, xmb_margin, xmb_term_width, xmb_term_height;
|
unsigned line_height, glyph_width, xmb_margin, xmb_term_width, xmb_term_height;
|
||||||
GLuint xmb_bg = 0;
|
GLuint xmb_bg = 0;
|
||||||
@ -286,6 +310,95 @@ static void xmb_render_messagebox(const char *message)
|
|||||||
string_list_free(list);
|
string_list_free(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void xmb_selection_pointer_changed()
|
||||||
|
{
|
||||||
|
int num_nodes = file_list_get_size(driver.menu->selection_buf);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_nodes; i++)
|
||||||
|
{
|
||||||
|
float iy;
|
||||||
|
float ia = 0.5;
|
||||||
|
float iz = 0.5;
|
||||||
|
xmb_node_t *node = (xmb_node_t*)&xmb_nodes[i];
|
||||||
|
|
||||||
|
if (!node)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
iy = (i < selptr) ? xmb_vspacing *
|
||||||
|
(i - selptr + xmb_above_item_offset) :
|
||||||
|
xmb_vspacing * (i - selptr + xmb_under_item_offset);
|
||||||
|
|
||||||
|
if (i == selptr)
|
||||||
|
{
|
||||||
|
ia = 1.0;
|
||||||
|
iz = 1.0;
|
||||||
|
iy = xmb_vspacing * xmb_active_item_factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_tween(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL);
|
||||||
|
add_tween(XMB_DELAY, iz, &node->zoom, &inOutQuad, NULL);
|
||||||
|
add_tween(XMB_DELAY, iy, &node->y, &inOutQuad, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
oldselptr = selptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void xmb_screen_changed()
|
||||||
|
{
|
||||||
|
int num_nodes = file_list_get_size(driver.menu->selection_buf);
|
||||||
|
|
||||||
|
xmb_nodes = (xmb_node_t*)
|
||||||
|
calloc(num_nodes, sizeof(xmb_node_t));
|
||||||
|
|
||||||
|
const char *dir = NULL;
|
||||||
|
const char *label = NULL;
|
||||||
|
unsigned menu_type = 0;
|
||||||
|
file_list_get_last(driver.menu->menu_stack, &dir, &label, &menu_type);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_nodes; i++)
|
||||||
|
{
|
||||||
|
char name[PATH_MAX], value[PATH_MAX],
|
||||||
|
entry_title_buf[PATH_MAX], type_str_buf[PATH_MAX],
|
||||||
|
path_buf[PATH_MAX];
|
||||||
|
const char *path = NULL, *entry_label = NULL;
|
||||||
|
unsigned type = 0, w = 0;
|
||||||
|
|
||||||
|
file_list_get_at_offset(driver.menu->selection_buf, i, &path,
|
||||||
|
&entry_label, &type);
|
||||||
|
rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(
|
||||||
|
setting_data_get_list(SL_FLAG_ALL_SETTINGS, false),
|
||||||
|
driver.menu->selection_buf->list[i].label);
|
||||||
|
(void)setting;
|
||||||
|
|
||||||
|
disp_set_label(&w, type, i, label,
|
||||||
|
value, sizeof(value),
|
||||||
|
entry_label, path,
|
||||||
|
path_buf, sizeof(path_buf));
|
||||||
|
|
||||||
|
snprintf(name, sizeof(name), "%s", path_buf);
|
||||||
|
|
||||||
|
float iy = (i < selptr) ? xmb_vspacing *
|
||||||
|
(i - selptr + xmb_above_item_offset) :
|
||||||
|
xmb_vspacing * (i - selptr + xmb_under_item_offset);
|
||||||
|
|
||||||
|
if (i == selptr)
|
||||||
|
iy = xmb_vspacing * xmb_active_item_factor;
|
||||||
|
|
||||||
|
xmb_node_t *node = (xmb_node_t*)&xmb_nodes[i];
|
||||||
|
strlcpy(node->name, name, sizeof(node->name));
|
||||||
|
strlcpy(node->value, value, sizeof(node->value));
|
||||||
|
node->alpha = i == selptr ? 1.0 : 0.5;
|
||||||
|
node->zoom = i == selptr ? 1.0 : 0.5;
|
||||||
|
node->y = iy;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(xmb_oldtitle, xmb_title, sizeof(xmb_oldtitle));
|
||||||
|
}
|
||||||
|
|
||||||
static void xmb_frame(void)
|
static void xmb_frame(void)
|
||||||
{
|
{
|
||||||
gl_t *gl = (gl_t*)driver_video_resolve(NULL);
|
gl_t *gl = (gl_t*)driver_video_resolve(NULL);
|
||||||
@ -298,18 +411,41 @@ static void xmb_frame(void)
|
|||||||
&& !driver.menu->msg_force)
|
&& !driver.menu->msg_force)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
update_tweens(0.002);
|
||||||
|
|
||||||
glViewport(0, 0, gl->win_width, gl->win_height);
|
glViewport(0, 0, gl->win_width, gl->win_height);
|
||||||
|
|
||||||
xmb_render_background();
|
xmb_render_background();
|
||||||
|
|
||||||
char title[256];
|
|
||||||
const char *dir = NULL;
|
const char *dir = NULL;
|
||||||
const char *label = NULL;
|
const char *label = NULL;
|
||||||
unsigned menu_type = 0;
|
unsigned menu_type = 0;
|
||||||
file_list_get_last(driver.menu->menu_stack, &dir, &label, &menu_type);
|
file_list_get_last(driver.menu->menu_stack, &dir, &label, &menu_type);
|
||||||
|
|
||||||
get_title(label, dir, menu_type, title, sizeof(title));
|
if (!strcmp(xmb_title, ""))
|
||||||
xmb_draw_text(title, 30, 40, 1, 1);
|
{
|
||||||
|
get_title(label, dir, menu_type, xmb_title, sizeof(xmb_title));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selptr == -1)
|
||||||
|
{
|
||||||
|
selptr = driver.menu->selection_ptr;
|
||||||
|
oldselptr = driver.menu->selection_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
selptr = driver.menu->selection_ptr;
|
||||||
|
|
||||||
|
get_title(label, dir, menu_type, xmb_title, sizeof(xmb_title));
|
||||||
|
if (strcmp(xmb_title, xmb_oldtitle))
|
||||||
|
{
|
||||||
|
xmb_screen_changed();
|
||||||
|
oldselptr = selptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selptr != oldselptr)
|
||||||
|
xmb_selection_pointer_changed();
|
||||||
|
|
||||||
|
xmb_draw_text(xmb_title, 30, 40, 1, 1);
|
||||||
|
|
||||||
char title_msg[64];
|
char title_msg[64];
|
||||||
const char *core_name = g_extern.menu.info.library_name;
|
const char *core_name = g_extern.menu.info.library_name;
|
||||||
@ -328,35 +464,13 @@ static void xmb_frame(void)
|
|||||||
core_name, core_version);
|
core_name, core_version);
|
||||||
xmb_draw_text(title_msg, 30, gl->win_height - 30, 1, 1);
|
xmb_draw_text(title_msg, 30, gl->win_height - 30, 1, 1);
|
||||||
|
|
||||||
unsigned x, y = 0;
|
|
||||||
int selptr = driver.menu->selection_ptr;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < file_list_get_size(driver.menu->selection_buf); i++)
|
for (i = 0; i < file_list_get_size(driver.menu->selection_buf); i++)
|
||||||
{
|
{
|
||||||
char message[PATH_MAX], type_str[PATH_MAX],
|
xmb_node_t *node = (xmb_node_t*)&xmb_nodes[i];
|
||||||
entry_title_buf[PATH_MAX], type_str_buf[PATH_MAX],
|
|
||||||
path_buf[PATH_MAX];
|
|
||||||
const char *path = NULL, *entry_label = NULL;
|
|
||||||
unsigned type = 0, w = 0;
|
|
||||||
|
|
||||||
file_list_get_at_offset(driver.menu->selection_buf, i, &path,
|
/*float iy;
|
||||||
&entry_label, &type);
|
|
||||||
rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(
|
|
||||||
setting_data_get_list(SL_FLAG_ALL_SETTINGS, false),
|
|
||||||
driver.menu->selection_buf->list[i].label);
|
|
||||||
(void)setting;
|
|
||||||
|
|
||||||
disp_set_label(&w, type, i, label,
|
|
||||||
type_str, sizeof(type_str),
|
|
||||||
entry_label, path,
|
|
||||||
path_buf, sizeof(path_buf));
|
|
||||||
|
|
||||||
bool selected = (i == selptr);
|
|
||||||
|
|
||||||
snprintf(message, sizeof(message), "%s", path_buf);
|
|
||||||
|
|
||||||
float iy;
|
|
||||||
float ia = 0.5;
|
float ia = 0.5;
|
||||||
float iz = 0.5;
|
float iz = 0.5;
|
||||||
|
|
||||||
@ -368,26 +482,26 @@ static void xmb_frame(void)
|
|||||||
ia = 1.0;
|
ia = 1.0;
|
||||||
iz = 1.0;
|
iz = 1.0;
|
||||||
iy = xmb_vspacing * xmb_active_item_factor;
|
iy = xmb_vspacing * xmb_active_item_factor;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
xmb_draw_icon(textures[TEXTURE_SETTING].id,
|
xmb_draw_icon(textures[TEXTURE_SETTING].id,
|
||||||
xmb_margin_left + xmb_hspacing - xmb_icon_size/2.0,
|
xmb_margin_left + xmb_hspacing - xmb_icon_size/2.0,
|
||||||
xmb_margin_top + iy + xmb_icon_size/2.0,
|
xmb_margin_top + node->y + xmb_icon_size/2.0,
|
||||||
ia,
|
node->alpha,
|
||||||
0,
|
0,
|
||||||
iz);
|
node->zoom);
|
||||||
|
|
||||||
xmb_draw_text(message,
|
xmb_draw_text(node->name,
|
||||||
xmb_margin_left + xmb_hspacing + xmb_label_margin_left,
|
xmb_margin_left + xmb_hspacing + xmb_label_margin_left,
|
||||||
xmb_margin_top + iy + xmb_label_margin_top,
|
xmb_margin_top + node->y + xmb_label_margin_top,
|
||||||
1,
|
1,
|
||||||
ia);
|
node->alpha);
|
||||||
|
|
||||||
xmb_draw_text(type_str,
|
xmb_draw_text(node->value,
|
||||||
xmb_margin_left + xmb_hspacing + xmb_label_margin_left + xmb_setting_margin_left,
|
xmb_margin_left + xmb_hspacing + xmb_label_margin_left + xmb_setting_margin_left,
|
||||||
xmb_margin_top + iy + xmb_label_margin_top,
|
xmb_margin_top + node->y + xmb_label_margin_top,
|
||||||
1,
|
1,
|
||||||
ia);
|
node->alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
xmb_draw_icon(textures[TEXTURE_SETTINGS].id,
|
xmb_draw_icon(textures[TEXTURE_SETTINGS].id,
|
||||||
@ -549,7 +663,7 @@ static void xmb_context_reset(void *data)
|
|||||||
|
|
||||||
fill_pathname_join(mediapath, g_settings.assets_directory,
|
fill_pathname_join(mediapath, g_settings.assets_directory,
|
||||||
"lakka", sizeof(mediapath));
|
"lakka", sizeof(mediapath));
|
||||||
fill_pathname_join(themepath, mediapath, THEME, sizeof(themepath));
|
fill_pathname_join(themepath, mediapath, XMB_THEME, sizeof(themepath));
|
||||||
fill_pathname_join(iconpath, themepath, icon_dir, sizeof(iconpath));
|
fill_pathname_join(iconpath, themepath, icon_dir, sizeof(iconpath));
|
||||||
fill_pathname_slash(iconpath, sizeof(iconpath));
|
fill_pathname_slash(iconpath, sizeof(iconpath));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user