mirror of
https://github.com/libretro/RetroArch
synced 2025-02-02 05:54:16 +00:00
commit
50e0664753
@ -217,6 +217,14 @@ static int mouse_iterate(unsigned action)
|
||||
driver.menu->mouse.right = driver.input->input_state(driver.input_data,
|
||||
binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT);
|
||||
|
||||
driver.menu->mouse.wheelup = driver.input->input_state(driver.input_data,
|
||||
binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP)
|
||||
|| driver.menu->mouse.y == 5;
|
||||
|
||||
driver.menu->mouse.wheeldown = driver.input->input_state(driver.input_data,
|
||||
binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN)
|
||||
|| driver.menu->mouse.y == driver.menu->height - 5;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -227,9 +235,9 @@ static int mouse_post_iterate(menu_file_list_cbs_t *cbs, unsigned action)
|
||||
|
||||
if (driver.menu->mouse.dy)
|
||||
{
|
||||
unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2;
|
||||
if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list))
|
||||
menu_navigation_set(driver.menu, mouse_ptr);
|
||||
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.left)
|
||||
@ -279,16 +287,16 @@ static int menu_settings_iterate(unsigned action,
|
||||
case MENU_ACTION_UP:
|
||||
if (driver.menu->selection_ptr >= scroll_speed)
|
||||
menu_navigation_set(driver.menu,
|
||||
driver.menu->selection_ptr - scroll_speed);
|
||||
driver.menu->selection_ptr - scroll_speed, true);
|
||||
else
|
||||
menu_navigation_set(driver.menu,
|
||||
menu_list_get_size(driver.menu->menu_list) - 1);
|
||||
menu_list_get_size(driver.menu->menu_list) - 1, true);
|
||||
break;
|
||||
|
||||
case MENU_ACTION_DOWN:
|
||||
if (driver.menu->selection_ptr + scroll_speed < (menu_list_get_size(driver.menu->menu_list)))
|
||||
menu_navigation_set(driver.menu,
|
||||
driver.menu->selection_ptr + scroll_speed);
|
||||
driver.menu->selection_ptr + scroll_speed, true);
|
||||
else
|
||||
menu_navigation_clear(driver.menu, false);
|
||||
break;
|
||||
@ -670,16 +678,16 @@ static int menu_common_iterate(unsigned action)
|
||||
case MENU_ACTION_UP:
|
||||
if (driver.menu->selection_ptr >= scroll_speed)
|
||||
menu_navigation_set(driver.menu,
|
||||
driver.menu->selection_ptr - scroll_speed);
|
||||
driver.menu->selection_ptr - scroll_speed, true);
|
||||
else
|
||||
menu_navigation_set(driver.menu,
|
||||
menu_list_get_size(driver.menu->menu_list) - 1);
|
||||
menu_list_get_size(driver.menu->menu_list) - 1, true);
|
||||
break;
|
||||
|
||||
case MENU_ACTION_DOWN:
|
||||
if (driver.menu->selection_ptr + scroll_speed < (menu_list_get_size(driver.menu->menu_list)))
|
||||
menu_navigation_set(driver.menu,
|
||||
driver.menu->selection_ptr + scroll_speed);
|
||||
driver.menu->selection_ptr + scroll_speed, true);
|
||||
else
|
||||
menu_navigation_clear(driver.menu, false);
|
||||
break;
|
||||
@ -687,7 +695,7 @@ static int menu_common_iterate(unsigned action)
|
||||
case MENU_ACTION_LEFT:
|
||||
if (driver.menu->selection_ptr > fast_scroll_speed)
|
||||
menu_navigation_set(driver.menu,
|
||||
driver.menu->selection_ptr - fast_scroll_speed);
|
||||
driver.menu->selection_ptr - fast_scroll_speed, true);
|
||||
else
|
||||
menu_navigation_clear(driver.menu, false);
|
||||
break;
|
||||
@ -695,7 +703,7 @@ static int menu_common_iterate(unsigned action)
|
||||
case MENU_ACTION_RIGHT:
|
||||
if (driver.menu->selection_ptr + fast_scroll_speed < (menu_list_get_size(driver.menu->menu_list)))
|
||||
menu_navigation_set(driver.menu,
|
||||
driver.menu->selection_ptr + fast_scroll_speed);
|
||||
driver.menu->selection_ptr + fast_scroll_speed, true);
|
||||
else
|
||||
menu_navigation_set_last(driver.menu);
|
||||
break;
|
||||
|
@ -23,7 +23,7 @@ typedef struct menu_ctx_driver
|
||||
void (*navigation_clear)(void *, bool);
|
||||
void (*navigation_decrement)(void *);
|
||||
void (*navigation_increment)(void *);
|
||||
void (*navigation_set)(void *);
|
||||
void (*navigation_set)(void *, bool);
|
||||
void (*navigation_set_last)(void *);
|
||||
void (*navigation_descend_alphabet)(void *, size_t *);
|
||||
void (*navigation_ascend_alphabet)(void *, size_t *);
|
||||
|
@ -291,7 +291,6 @@ static void blit_cursor(void)
|
||||
|
||||
static void rgui_render(void)
|
||||
{
|
||||
size_t begin = 0;
|
||||
size_t end;
|
||||
|
||||
if (driver.menu->need_refresh
|
||||
@ -299,19 +298,21 @@ static void rgui_render(void)
|
||||
&& !driver.menu->msg_force)
|
||||
return;
|
||||
|
||||
if (driver.menu->selection_ptr >= RGUI_TERM_HEIGHT / 2)
|
||||
begin = driver.menu->selection_ptr - RGUI_TERM_HEIGHT / 2;
|
||||
end = (driver.menu->selection_ptr + RGUI_TERM_HEIGHT <=
|
||||
menu_list_get_size(driver.menu->menu_list)) ?
|
||||
driver.menu->selection_ptr + RGUI_TERM_HEIGHT :
|
||||
menu_list_get_size(driver.menu->menu_list);
|
||||
if (driver.menu->mouse.wheeldown && driver.menu->begin
|
||||
< menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT)
|
||||
driver.menu->begin++;
|
||||
|
||||
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) <= RGUI_TERM_HEIGHT)
|
||||
begin = 0;
|
||||
driver.menu->begin = 0;
|
||||
|
||||
if (end - begin > RGUI_TERM_HEIGHT)
|
||||
end = begin + RGUI_TERM_HEIGHT;
|
||||
end = (driver.menu->begin + RGUI_TERM_HEIGHT <=
|
||||
menu_list_get_size(driver.menu->menu_list)) ?
|
||||
driver.menu->begin + RGUI_TERM_HEIGHT :
|
||||
menu_list_get_size(driver.menu->menu_list);
|
||||
|
||||
rgui_render_background();
|
||||
|
||||
@ -359,7 +360,7 @@ static void rgui_render(void)
|
||||
x = RGUI_TERM_START_X;
|
||||
y = RGUI_TERM_START_Y;
|
||||
|
||||
for (i = begin; i < end; i++, y += FONT_HEIGHT_STRIDE)
|
||||
for (i = driver.menu->begin; i < end; i++, y += FONT_HEIGHT_STRIDE)
|
||||
{
|
||||
char message[PATH_MAX], type_str[PATH_MAX],
|
||||
entry_title_buf[PATH_MAX], type_str_buf[PATH_MAX],
|
||||
@ -452,6 +453,7 @@ static void *rgui_init(void)
|
||||
|
||||
menu->width = 320;
|
||||
menu->height = 240;
|
||||
menu->begin = 0;
|
||||
menu->frame_buf_pitch = menu->width * sizeof(uint16_t);
|
||||
|
||||
bool ret = rguidisp_init_font(menu);
|
||||
@ -504,6 +506,28 @@ static void rgui_set_texture(void *data)
|
||||
menu->frame_buf, false, menu->width, menu->height, 1.0f);
|
||||
}
|
||||
|
||||
static void rgui_navigation_clear(void *data, bool pending_push)
|
||||
{
|
||||
driver.menu->begin = 0;
|
||||
}
|
||||
|
||||
static void rgui_navigation_set(void *data, bool scroll)
|
||||
{
|
||||
if (!scroll)
|
||||
return;
|
||||
|
||||
if (driver.menu->selection_ptr < RGUI_TERM_HEIGHT/2)
|
||||
driver.menu->begin = 0;
|
||||
else if (driver.menu->selection_ptr >= RGUI_TERM_HEIGHT/2
|
||||
&& driver.menu->selection_ptr <
|
||||
menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT/2)
|
||||
driver.menu->begin = driver.menu->selection_ptr - RGUI_TERM_HEIGHT/2;
|
||||
else if (driver.menu->selection_ptr >=
|
||||
menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT/2)
|
||||
driver.menu->begin = menu_list_get_size(driver.menu->menu_list)
|
||||
- RGUI_TERM_HEIGHT;
|
||||
}
|
||||
|
||||
menu_ctx_driver_t menu_ctx_rgui = {
|
||||
rgui_set_texture,
|
||||
rgui_render_messagebox,
|
||||
@ -517,10 +541,10 @@ menu_ctx_driver_t menu_ctx_rgui = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
rgui_navigation_clear,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
rgui_navigation_set,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -974,9 +974,10 @@ static void xmb_navigation_increment(void *data)
|
||||
xmb_selection_pointer_changed();
|
||||
}
|
||||
|
||||
static void xmb_navigation_set(void *data)
|
||||
static void xmb_navigation_set(void *data, bool scroll)
|
||||
{
|
||||
(void)data;
|
||||
(void)scroll;
|
||||
|
||||
xmb_selection_pointer_changed();
|
||||
}
|
||||
|
@ -75,6 +75,7 @@ typedef struct
|
||||
|
||||
unsigned width;
|
||||
unsigned height;
|
||||
size_t begin;
|
||||
|
||||
uint16_t *frame_buf;
|
||||
size_t frame_buf_pitch;
|
||||
|
@ -37,7 +37,7 @@ void menu_entries_refresh(file_list_t *list)
|
||||
|
||||
if (driver.menu->selection_ptr >= menu_list_get_size(driver.menu->menu_list)
|
||||
&& menu_list_get_size(driver.menu->menu_list))
|
||||
menu_navigation_set(driver.menu, menu_list_get_size(driver.menu->menu_list) - 1);
|
||||
menu_navigation_set(driver.menu, menu_list_get_size(driver.menu->menu_list) - 1, true);
|
||||
else if (!menu_list_get_size(driver.menu->menu_list))
|
||||
menu_navigation_clear(driver.menu, true);
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ static void menu_search_callback(void *userdata, const char *str)
|
||||
size_t idx;
|
||||
|
||||
if (str && *str && file_list_search(menu->menu_list->selection_buf, str, &idx))
|
||||
menu_navigation_set(menu, idx);
|
||||
menu_navigation_set(menu, idx, true);
|
||||
|
||||
menu_key_end_line(menu);
|
||||
}
|
||||
|
@ -48,12 +48,12 @@ void menu_navigation_increment(menu_handle_t *menu)
|
||||
driver.menu_ctx->navigation_increment(menu);
|
||||
}
|
||||
|
||||
void menu_navigation_set(menu_handle_t *menu, size_t i)
|
||||
void menu_navigation_set(menu_handle_t *menu, size_t i, bool scroll)
|
||||
{
|
||||
menu->selection_ptr = i;
|
||||
|
||||
if (driver.menu_ctx && driver.menu_ctx->navigation_set)
|
||||
driver.menu_ctx->navigation_set(menu);
|
||||
driver.menu_ctx->navigation_set(menu, scroll);
|
||||
}
|
||||
|
||||
void menu_navigation_set_last(menu_handle_t *menu)
|
||||
|
@ -29,7 +29,7 @@ void menu_navigation_decrement(menu_handle_t *menu);
|
||||
|
||||
void menu_navigation_increment(menu_handle_t *menu);
|
||||
|
||||
void menu_navigation_set(menu_handle_t *menu, size_t i);
|
||||
void menu_navigation_set(menu_handle_t *menu, size_t i, bool scroll);
|
||||
|
||||
void menu_navigation_set_last(menu_handle_t *menu);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user