Merge pull request #1207 from lakkatv/xmb

(RGUI) Fix mouse scrolling
This commit is contained in:
Twinaphex 2014-10-26 23:18:25 +01:00
commit 50e0664753
9 changed files with 65 additions and 31 deletions

View File

@ -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;

View File

@ -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 *);

View File

@ -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,

View File

@ -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();
}

View File

@ -75,6 +75,7 @@ typedef struct
unsigned width;
unsigned height;
size_t begin;
uint16_t *frame_buf;
size_t frame_buf_pitch;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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)

View File

@ -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);