mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-02-01 17:23:48 +00:00
(GLUI) Cursor navigation
This commit is contained in:
parent
90b7f9b225
commit
fd2745e51e
@ -233,12 +233,8 @@ static int mouse_post_iterate(menu_file_list_cbs_t *cbs, unsigned action)
|
||||
if (!driver.menu->mouse.enable)
|
||||
return 0;
|
||||
|
||||
if (driver.menu->mouse.dy)
|
||||
{
|
||||
unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2 + driver.menu->begin;
|
||||
if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list)-1)
|
||||
menu_navigation_set(driver.menu, mouse_ptr, false);
|
||||
}
|
||||
if (driver.menu->mouse.ptr <= menu_list_get_size(driver.menu->menu_list)-1)
|
||||
menu_navigation_set(driver.menu, driver.menu->mouse.ptr, false);
|
||||
|
||||
if (driver.menu->mouse.left)
|
||||
{
|
||||
|
@ -149,6 +149,67 @@ static void glui_render_background(bool force_transparency)
|
||||
gl->coords.color = gl->white_color_ptr;
|
||||
}
|
||||
|
||||
static void glui_draw_cursor(float x, float y)
|
||||
{
|
||||
gl_t *gl = NULL;
|
||||
glui_handle_t *glui = NULL;
|
||||
|
||||
if (!driver.menu)
|
||||
return;
|
||||
|
||||
glui = (glui_handle_t*)driver.menu->userdata;
|
||||
|
||||
if (!glui)
|
||||
return;
|
||||
|
||||
GLfloat color[] = {
|
||||
1.0f, 1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f,
|
||||
};
|
||||
|
||||
gl = (gl_t*)driver_video_resolve(NULL);
|
||||
|
||||
if (!gl)
|
||||
return;
|
||||
|
||||
glViewport(x - 5, gl->win_height - y, 11, 11);
|
||||
|
||||
static const GLfloat vertex[] = {
|
||||
0, 0,
|
||||
1, 0,
|
||||
0, 1,
|
||||
1, 1,
|
||||
};
|
||||
|
||||
static const GLfloat tex_coord[] = {
|
||||
0, 1,
|
||||
1, 1,
|
||||
0, 0,
|
||||
1, 0,
|
||||
};
|
||||
|
||||
struct gl_coords coords;
|
||||
coords.vertices = 4;
|
||||
coords.vertex = vertex;
|
||||
coords.tex_coord = tex_coord;
|
||||
coords.lut_tex_coord = tex_coord;
|
||||
|
||||
coords.color = color;
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
gl->shader->use(gl, GL_SHADER_STOCK_BLEND);
|
||||
gl->shader->set_coords(&coords);
|
||||
gl->shader->set_mvp(gl, &gl->mvp_no_rot);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
glDisable(GL_BLEND);
|
||||
|
||||
gl->coords.color = gl->white_color_ptr;
|
||||
}
|
||||
|
||||
static void glui_get_message(const char *message)
|
||||
{
|
||||
size_t i;
|
||||
@ -214,7 +275,7 @@ static void glui_frame(void)
|
||||
const char *dir = NULL;
|
||||
const char *label = NULL;
|
||||
unsigned menu_type = 0;
|
||||
size_t begin = 0, end;
|
||||
size_t end;
|
||||
gl_t *gl = (gl_t*)driver_video_resolve(NULL);
|
||||
glui_handle_t *glui = NULL;
|
||||
|
||||
@ -237,22 +298,26 @@ static void glui_frame(void)
|
||||
glui->term_width = (gl->win_width - glui->margin * 2) / glui->glyph_width;
|
||||
glui->term_height = (gl->win_height - glui->margin * 2) / glui->line_height - 2;
|
||||
|
||||
driver.menu->mouse.ptr = (driver.menu->mouse.y - glui->margin) /
|
||||
glui->line_height - 2 + driver.menu->begin;
|
||||
|
||||
glViewport(0, 0, gl->win_width, gl->win_height);
|
||||
|
||||
if (driver.menu->mouse.wheeldown && driver.menu->begin
|
||||
< menu_list_get_size(driver.menu->menu_list) - glui->term_height)
|
||||
driver.menu->begin++;
|
||||
|
||||
if (driver.menu->selection_ptr >= glui->term_height / 2)
|
||||
begin = driver.menu->selection_ptr - glui->term_height / 2;
|
||||
end = (driver.menu->selection_ptr + glui->term_height <=
|
||||
menu_list_get_size(driver.menu->menu_list)) ?
|
||||
driver.menu->selection_ptr + glui->term_height :
|
||||
menu_list_get_size(driver.menu->menu_list);
|
||||
if (driver.menu->mouse.wheelup && driver.menu->begin > 0)
|
||||
driver.menu->begin--;
|
||||
|
||||
/* Do not scroll if all items are visible. */
|
||||
if (menu_list_get_size(driver.menu->menu_list) <= glui->term_height)
|
||||
begin = 0;
|
||||
driver.menu->begin = 0;
|
||||
|
||||
if (end - begin > glui->term_height)
|
||||
end = begin + glui->term_height;
|
||||
end = (driver.menu->begin + glui->term_height <=
|
||||
menu_list_get_size(driver.menu->menu_list)) ?
|
||||
driver.menu->begin + glui->term_height :
|
||||
menu_list_get_size(driver.menu->menu_list);
|
||||
|
||||
glui_render_background(false);
|
||||
|
||||
@ -288,7 +353,7 @@ static void glui_frame(void)
|
||||
x = glui->margin;
|
||||
y = glui->margin + glui->line_height * 2;
|
||||
|
||||
for (i = begin; i < end; i++, y += glui->line_height)
|
||||
for (i = driver.menu->begin; i < end; i++, y += glui->line_height)
|
||||
{
|
||||
char message[PATH_MAX], type_str[PATH_MAX],
|
||||
entry_title_buf[PATH_MAX], type_str_buf[PATH_MAX],
|
||||
@ -356,6 +421,9 @@ static void glui_frame(void)
|
||||
glui->box_message[0] = '\0';
|
||||
}
|
||||
|
||||
if (driver.menu->mouse.enable)
|
||||
glui_draw_cursor(driver.menu->mouse.x, driver.menu->mouse.y);
|
||||
|
||||
gl_set_viewport(gl, gl->win_width, gl->win_height, false, false);
|
||||
}
|
||||
|
||||
@ -497,6 +565,40 @@ static void glui_context_reset(void *data)
|
||||
printf("%d\n", glui->bg);
|
||||
}
|
||||
|
||||
static void glui_navigation_clear(void *data, bool pending_push)
|
||||
{
|
||||
driver.menu->begin = 0;
|
||||
}
|
||||
|
||||
static void glui_navigation_set(void *data, bool scroll)
|
||||
{
|
||||
glui_handle_t *glui = NULL;
|
||||
|
||||
menu_handle_t *menu = (menu_handle_t*)data;
|
||||
|
||||
if (!menu)
|
||||
return;
|
||||
|
||||
glui = (glui_handle_t*)menu->userdata;
|
||||
|
||||
if (!glui)
|
||||
return;
|
||||
|
||||
if (!scroll)
|
||||
return;
|
||||
|
||||
if (driver.menu->selection_ptr < glui->term_height/2)
|
||||
driver.menu->begin = 0;
|
||||
else if (driver.menu->selection_ptr >= glui->term_height/2
|
||||
&& driver.menu->selection_ptr <
|
||||
menu_list_get_size(driver.menu->menu_list) - glui->term_height/2)
|
||||
driver.menu->begin = driver.menu->selection_ptr - glui->term_height/2;
|
||||
else if (driver.menu->selection_ptr >=
|
||||
menu_list_get_size(driver.menu->menu_list) - glui->term_height/2)
|
||||
driver.menu->begin = menu_list_get_size(driver.menu->menu_list)
|
||||
- glui->term_height;
|
||||
}
|
||||
|
||||
menu_ctx_driver_t menu_ctx_glui = {
|
||||
NULL,
|
||||
glui_get_message,
|
||||
@ -510,10 +612,10 @@ menu_ctx_driver_t menu_ctx_glui = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
glui_navigation_clear,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
glui_navigation_set,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -320,6 +320,8 @@ static void rgui_render(void)
|
||||
if (!rgui)
|
||||
return;
|
||||
|
||||
driver.menu->mouse.ptr = driver.menu->mouse.y / 11 - 2 + driver.menu->begin;
|
||||
|
||||
if (driver.menu->mouse.wheeldown && driver.menu->begin
|
||||
< menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT)
|
||||
driver.menu->begin++;
|
||||
|
@ -127,6 +127,7 @@ typedef struct
|
||||
bool oldright;
|
||||
bool wheelup;
|
||||
bool wheeldown;
|
||||
unsigned ptr;
|
||||
} mouse;
|
||||
|
||||
struct
|
||||
|
Loading…
x
Reference in New Issue
Block a user