mirror of
https://github.com/libretro/RetroArch
synced 2025-03-22 16:20:58 +00:00
(Ozone) Sidebar multiline scrolling (#15242)
This commit is contained in:
parent
d446f39c63
commit
b2ff445531
@ -621,6 +621,8 @@ struct ozone_handle
|
|||||||
uint8_t selection_lastplayed_lines;
|
uint8_t selection_lastplayed_lines;
|
||||||
uint8_t system_tab_end;
|
uint8_t system_tab_end;
|
||||||
uint8_t tabs[OZONE_SYSTEM_TAB_LAST];
|
uint8_t tabs[OZONE_SYSTEM_TAB_LAST];
|
||||||
|
uint8_t sidebar_index_list[SCROLL_INDEX_SIZE];
|
||||||
|
uint8_t sidebar_index_size;
|
||||||
|
|
||||||
char title[PATH_MAX_LENGTH];
|
char title[PATH_MAX_LENGTH];
|
||||||
|
|
||||||
@ -4591,6 +4593,35 @@ static void ozone_sidebar_goto(
|
|||||||
ozone_change_tab(ozone, ozone_system_tabs_idx[ozone->tabs[new_selection]], ozone_system_tabs_type[ozone->tabs[new_selection]]);
|
ozone_change_tab(ozone, ozone_system_tabs_idx[ozone->tabs[new_selection]], ozone_system_tabs_type[ozone->tabs[new_selection]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ozone_sidebar_entries_build_scroll_indices(ozone_handle_t *ozone)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
int current = menu_entries_elem_get_first_char(&ozone->horizontal_list, 0);
|
||||||
|
|
||||||
|
ozone->sidebar_index_list[0] = 0;
|
||||||
|
ozone->sidebar_index_size = 1;
|
||||||
|
|
||||||
|
for (i = 1; i < ozone->horizontal_list.size; i++)
|
||||||
|
{
|
||||||
|
int first = menu_entries_elem_get_first_char(&ozone->horizontal_list, (unsigned)i);
|
||||||
|
|
||||||
|
if (first != current)
|
||||||
|
{
|
||||||
|
/* Add scroll index */
|
||||||
|
ozone->sidebar_index_list[ozone->sidebar_index_size] = i + ozone->system_tab_end + 1;
|
||||||
|
if (!((ozone->sidebar_index_size + 1) >= SCROLL_INDEX_SIZE))
|
||||||
|
ozone->sidebar_index_size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
current = first;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add scroll index */
|
||||||
|
ozone->sidebar_index_list[ozone->sidebar_index_size] = ozone->horizontal_list.size - 1;
|
||||||
|
if (!((ozone->sidebar_index_size + 1) >= SCROLL_INDEX_SIZE))
|
||||||
|
ozone->sidebar_index_size++;
|
||||||
|
}
|
||||||
|
|
||||||
static void ozone_refresh_sidebars(
|
static void ozone_refresh_sidebars(
|
||||||
ozone_handle_t *ozone,
|
ozone_handle_t *ozone,
|
||||||
bool ozone_collapse_sidebar,
|
bool ozone_collapse_sidebar,
|
||||||
@ -4670,6 +4701,9 @@ static void ozone_refresh_sidebars(
|
|||||||
ozone->animations.cursor_alpha = 1.0f;
|
ozone->animations.cursor_alpha = 1.0f;
|
||||||
ozone->animations.scroll_y_sidebar = ozone_sidebar_get_scroll_y(ozone, video_height);
|
ozone->animations.scroll_y_sidebar = ozone_sidebar_get_scroll_y(ozone, video_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ozone->horizontal_list.size)
|
||||||
|
ozone_sidebar_entries_build_scroll_indices(ozone);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t ozone_list_get_size(void *data, enum menu_list_type type)
|
static size_t ozone_list_get_size(void *data, enum menu_list_type type)
|
||||||
@ -7984,15 +8018,14 @@ static enum menu_action ozone_parse_menu_entry_action(
|
|||||||
new_selection = 0;
|
new_selection = 0;
|
||||||
|
|
||||||
ozone_sidebar_goto(ozone, new_selection);
|
ozone_sidebar_goto(ozone, new_selection);
|
||||||
|
|
||||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||||
ozone->flags &= ~OZONE_FLAG_CURSOR_MODE;
|
ozone->flags &= ~OZONE_FLAG_CURSOR_MODE;
|
||||||
|
|
||||||
#ifdef HAVE_AUDIOMIXER
|
#ifdef HAVE_AUDIOMIXER
|
||||||
if (new_selection != selection)
|
if (new_selection != selection)
|
||||||
audio_driver_mixer_play_scroll_sound(false);
|
audio_driver_mixer_play_scroll_sound(false);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!menu_navigation_wraparound_enable && selection == selection_total - 1)
|
else if (!menu_navigation_wraparound_enable && selection == selection_total - 1)
|
||||||
ozone_start_cursor_wiggle(ozone, MENU_ACTION_DOWN);
|
ozone_start_cursor_wiggle(ozone, MENU_ACTION_DOWN);
|
||||||
@ -8017,6 +8050,7 @@ static enum menu_action ozone_parse_menu_entry_action(
|
|||||||
size_t selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE)
|
size_t selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE)
|
||||||
? ozone_get_onscreen_category_selection(ozone)
|
? ozone_get_onscreen_category_selection(ozone)
|
||||||
: ozone->categories_selection_ptr;
|
: ozone->categories_selection_ptr;
|
||||||
|
|
||||||
if ((new_selection = (int)selection - 1) < 0)
|
if ((new_selection = (int)selection - 1) < 0)
|
||||||
new_selection = horizontal_list_size + ozone->system_tab_end;
|
new_selection = horizontal_list_size + ozone->system_tab_end;
|
||||||
|
|
||||||
@ -8204,10 +8238,49 @@ static enum menu_action ozone_parse_menu_entry_action(
|
|||||||
case MENU_ACTION_SCROLL_UP:
|
case MENU_ACTION_SCROLL_UP:
|
||||||
/* Descend 10 items or to previous alphabet (Z towards A) */
|
/* Descend 10 items or to previous alphabet (Z towards A) */
|
||||||
|
|
||||||
/* Ignore if cursor is in sidebar */
|
/* Scroll sidebar tabs */
|
||||||
if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR)
|
if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR)
|
||||||
{
|
{
|
||||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
struct menu_state *menu_st = menu_state_get_ptr();
|
||||||
|
|
||||||
|
/* If cursor is active, ensure we target
|
||||||
|
* an on screen category */
|
||||||
|
size_t selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE)
|
||||||
|
? ozone_get_onscreen_category_selection(ozone)
|
||||||
|
: ozone->categories_selection_ptr;
|
||||||
|
|
||||||
|
new_selection = selection;
|
||||||
|
|
||||||
|
if (menu_st->scroll.mode == MENU_SCROLL_PAGE)
|
||||||
|
new_selection = (int)(selection - 10);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Alphabetical scroll */
|
||||||
|
size_t l = ozone->sidebar_index_size - 1;
|
||||||
|
|
||||||
|
while (l
|
||||||
|
&& ozone->sidebar_index_list[l - 1] >= selection)
|
||||||
|
l--;
|
||||||
|
|
||||||
|
if (l > 0)
|
||||||
|
new_selection = ozone->sidebar_index_list[l - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selection < ozone->system_tab_end + 1)
|
||||||
|
new_selection = 0;
|
||||||
|
else if (selection > ozone->system_tab_end - new_selection)
|
||||||
|
new_selection = (int)(ozone->system_tab_end + 1);
|
||||||
|
|
||||||
|
if (new_selection != selection)
|
||||||
|
ozone_sidebar_goto(ozone, new_selection);
|
||||||
|
|
||||||
|
new_action = MENU_ACTION_NOOP;
|
||||||
|
ozone->flags &= ~OZONE_FLAG_CURSOR_MODE;
|
||||||
|
|
||||||
|
#ifdef HAVE_AUDIOMIXER
|
||||||
|
if (new_selection != selection)
|
||||||
|
audio_driver_mixer_play_scroll_sound(true);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ( (ozone->flags2 & OZONE_FLAG2_SHOW_FULLSCREEN_THUMBNAILS)
|
if ( (ozone->flags2 & OZONE_FLAG2_SHOW_FULLSCREEN_THUMBNAILS)
|
||||||
@ -8224,10 +8297,52 @@ static enum menu_action ozone_parse_menu_entry_action(
|
|||||||
case MENU_ACTION_SCROLL_DOWN:
|
case MENU_ACTION_SCROLL_DOWN:
|
||||||
/* Ascend 10 items or to next alphabet (A towards Z) */
|
/* Ascend 10 items or to next alphabet (A towards Z) */
|
||||||
|
|
||||||
/* > Ignore if cursor is in sidebar */
|
/* Scroll sidebar tabs */
|
||||||
if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR)
|
if (ozone->flags & OZONE_FLAG_CURSOR_IN_SIDEBAR)
|
||||||
{
|
{
|
||||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
struct menu_state *menu_st = menu_state_get_ptr();
|
||||||
|
|
||||||
|
/* If cursor is active, ensure we target
|
||||||
|
* an on screen category */
|
||||||
|
size_t selection = (ozone->flags & OZONE_FLAG_CURSOR_MODE)
|
||||||
|
? ozone_get_onscreen_category_selection(ozone)
|
||||||
|
: ozone->categories_selection_ptr;
|
||||||
|
|
||||||
|
new_selection = selection;
|
||||||
|
|
||||||
|
if (menu_st->scroll.mode == MENU_SCROLL_PAGE)
|
||||||
|
new_selection = (int)(selection + 10);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Alphabetical scroll */
|
||||||
|
size_t l = 0;
|
||||||
|
|
||||||
|
while (l < ozone->sidebar_index_size - 1
|
||||||
|
&& ozone->sidebar_index_list[l + 1] <= selection)
|
||||||
|
l++;
|
||||||
|
|
||||||
|
if (l < ozone->sidebar_index_size - 1)
|
||||||
|
new_selection = ozone->sidebar_index_list[l + 1];
|
||||||
|
else if (l == ozone->sidebar_index_size - 1)
|
||||||
|
new_selection = ozone->system_tab_end + horizontal_list_size;
|
||||||
|
|
||||||
|
if (selection < ozone->system_tab_end + 1)
|
||||||
|
new_selection = ozone->system_tab_end + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_selection > (int)(ozone->system_tab_end + horizontal_list_size))
|
||||||
|
new_selection = (int)(ozone->system_tab_end + horizontal_list_size);
|
||||||
|
|
||||||
|
if (new_selection != selection)
|
||||||
|
ozone_sidebar_goto(ozone, new_selection);
|
||||||
|
|
||||||
|
new_action = MENU_ACTION_NOOP;
|
||||||
|
ozone->flags &= ~OZONE_FLAG_CURSOR_MODE;
|
||||||
|
|
||||||
|
#ifdef HAVE_AUDIOMIXER
|
||||||
|
if (new_selection != selection)
|
||||||
|
audio_driver_mixer_play_scroll_sound(false);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ( (ozone->flags2 & OZONE_FLAG2_SHOW_FULLSCREEN_THUMBNAILS)
|
if ( (ozone->flags2 & OZONE_FLAG2_SHOW_FULLSCREEN_THUMBNAILS)
|
||||||
|
@ -3975,7 +3975,7 @@ void menu_entries_build_scroll_indices(
|
|||||||
if (type == FILE_TYPE_DIRECTORY)
|
if (type == FILE_TYPE_DIRECTORY)
|
||||||
is_dir = true;
|
is_dir = true;
|
||||||
|
|
||||||
if ((current_is_dir && !is_dir) || (first > current))
|
if ((current_is_dir && !is_dir) || (first != current))
|
||||||
{
|
{
|
||||||
/* Add scroll index */
|
/* Add scroll index */
|
||||||
menu_st->scroll.index_list[menu_st->scroll.index_size] = i;
|
menu_st->scroll.index_list[menu_st->scroll.index_size] = i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user