mirror of
https://github.com/libretro/RetroArch.git
synced 2025-02-24 11:52:52 +00:00
(Ozone) Get rid of some forward declarations
This commit is contained in:
parent
e45d04b826
commit
bafeebcd50
@ -63,12 +63,473 @@ static const char *OZONE_TAB_TEXTURES_FILES[OZONE_TAB_TEXTURE_LAST] = {
|
||||
"add"
|
||||
};
|
||||
|
||||
/* Forward declaration */
|
||||
static void ozone_set_thumbnail_content(void *data, const char *s);
|
||||
static void ozone_set_thumbnail_content(void *data, const char *s)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*)data;
|
||||
|
||||
if (!ozone)
|
||||
return;
|
||||
|
||||
if (ozone->is_playlist)
|
||||
{
|
||||
/* Playlist content */
|
||||
if (string_is_empty(s))
|
||||
{
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
size_t list_size = menu_entries_get_size();
|
||||
file_list_t *list = menu_entries_get_selection_buf_ptr(0);
|
||||
bool playlist_valid = false;
|
||||
size_t playlist_index = selection;
|
||||
|
||||
/* Get playlist index corresponding
|
||||
* to the selected entry */
|
||||
if (list &&
|
||||
(selection < list_size) &&
|
||||
(list->list[selection].type == FILE_TYPE_RPL_ENTRY))
|
||||
{
|
||||
playlist_valid = true;
|
||||
playlist_index = list->list[selection].entry_idx;
|
||||
}
|
||||
|
||||
gfx_thumbnail_set_content_playlist(ozone->thumbnail_path_data,
|
||||
playlist_valid ? playlist_get_cached() : NULL, playlist_index);
|
||||
}
|
||||
}
|
||||
else if (ozone->is_db_manager_list)
|
||||
{
|
||||
/* Database list content */
|
||||
if (string_is_empty(s))
|
||||
{
|
||||
menu_entry_t entry;
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
|
||||
menu_entry_init(&entry);
|
||||
entry.label_enabled = false;
|
||||
entry.rich_label_enabled = false;
|
||||
entry.value_enabled = false;
|
||||
entry.sublabel_enabled = false;
|
||||
menu_entry_get(&entry, 0, selection, NULL, true);
|
||||
|
||||
if (!string_is_empty(entry.path))
|
||||
gfx_thumbnail_set_content(ozone->thumbnail_path_data, entry.path);
|
||||
}
|
||||
}
|
||||
else if (string_is_equal(s, "imageviewer"))
|
||||
{
|
||||
/* Filebrowser image updates */
|
||||
menu_entry_t entry;
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
|
||||
ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(selection_buf, selection);
|
||||
|
||||
if (node)
|
||||
{
|
||||
menu_entry_init(&entry);
|
||||
entry.label_enabled = false;
|
||||
entry.rich_label_enabled = false;
|
||||
entry.value_enabled = false;
|
||||
entry.sublabel_enabled = false;
|
||||
menu_entry_get(&entry, 0, selection, NULL, true);
|
||||
if (!string_is_empty(entry.path) && !string_is_empty(node->fullpath))
|
||||
gfx_thumbnail_set_content_image(ozone->thumbnail_path_data, node->fullpath, entry.path);
|
||||
}
|
||||
}
|
||||
else if (!string_is_empty(s))
|
||||
{
|
||||
/* Annoying leftovers...
|
||||
* This is required to ensure that thumbnails are
|
||||
* updated correctly when navigating deeply through
|
||||
* the sublevels of database manager lists.
|
||||
* Showing thumbnails on database entries is a
|
||||
* pointless nuisance and a waste of CPU cycles, IMHO... */
|
||||
gfx_thumbnail_set_content(ozone->thumbnail_path_data, s);
|
||||
}
|
||||
|
||||
ozone_update_content_metadata(ozone);
|
||||
}
|
||||
|
||||
/* Returns true if specified category is currently
|
||||
* displayed on screen */
|
||||
static bool INLINE ozone_category_onscreen(
|
||||
ozone_handle_t *ozone, size_t idx)
|
||||
{
|
||||
return (idx >= ozone->first_onscreen_category) &&
|
||||
(idx <= ozone->last_onscreen_category);
|
||||
}
|
||||
|
||||
/* If current category is on screen, returns its
|
||||
* index. If current category is off screen, returns
|
||||
* index of centremost on screen category. */
|
||||
static size_t ozone_get_onscreen_category_selection(
|
||||
ozone_handle_t *ozone)
|
||||
{
|
||||
/* Check whether selected category is already on screen */
|
||||
if (ozone_category_onscreen(ozone, ozone->categories_selection_ptr))
|
||||
return ozone->categories_selection_ptr;
|
||||
|
||||
/* Return index of centremost category */
|
||||
return (ozone->first_onscreen_category >> 1) +
|
||||
(ozone->last_onscreen_category >> 1);
|
||||
}
|
||||
|
||||
/* Returns true if specified entry is currently
|
||||
* displayed on screen */
|
||||
static bool INLINE ozone_entry_onscreen(
|
||||
ozone_handle_t *ozone, size_t idx)
|
||||
{
|
||||
return (idx >= ozone->first_onscreen_entry) &&
|
||||
(idx <= ozone->last_onscreen_entry);
|
||||
}
|
||||
|
||||
/* If currently selected entry is off screen,
|
||||
* moves selection to specified on screen target
|
||||
* > Does nothing if currently selected item is
|
||||
* already on screen */
|
||||
static void ozone_auto_select_onscreen_entry(
|
||||
ozone_handle_t *ozone,
|
||||
enum ozone_onscreen_entry_position_type target_entry)
|
||||
{
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
|
||||
/* Check whether selected item is already on screen */
|
||||
if (ozone_entry_onscreen(ozone, selection))
|
||||
return;
|
||||
|
||||
/* Update selection index */
|
||||
switch (target_entry)
|
||||
{
|
||||
case OZONE_ONSCREEN_ENTRY_FIRST:
|
||||
selection = ozone->first_onscreen_entry;
|
||||
break;
|
||||
case OZONE_ONSCREEN_ENTRY_LAST:
|
||||
selection = ozone->last_onscreen_entry;
|
||||
break;
|
||||
case OZONE_ONSCREEN_ENTRY_CENTRE:
|
||||
default:
|
||||
selection = (ozone->first_onscreen_entry >> 1) +
|
||||
(ozone->last_onscreen_entry >> 1);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Apply new selection */
|
||||
menu_navigation_set_selection(selection);
|
||||
}
|
||||
|
||||
static bool INLINE ozone_metadata_override_available(ozone_handle_t *ozone)
|
||||
{
|
||||
/* Ugly construct...
|
||||
* Content metadata display override may be
|
||||
* toggled if the following are true:
|
||||
* - We are viewing playlist thumbnails
|
||||
* - This is *not* an image viewer playlist
|
||||
* - Both right and left thumbnails are
|
||||
* enabled/available
|
||||
* Short circuiting means that in most cases
|
||||
* only 'ozone->is_playlist' will be evaluated,
|
||||
* so this isn't too much of a performance hog... */
|
||||
return ozone->is_playlist &&
|
||||
ozone->show_thumbnail_bar &&
|
||||
!ozone->selection_core_is_viewer &&
|
||||
(ozone->thumbnails.left.status != GFX_THUMBNAIL_STATUS_MISSING) &&
|
||||
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT) &&
|
||||
(ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_MISSING) &&
|
||||
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static enum menu_action ozone_parse_menu_entry_action(
|
||||
ozone_handle_t *ozone, enum menu_action action)
|
||||
{
|
||||
uintptr_t tag;
|
||||
int new_selection;
|
||||
enum menu_action new_action = action;
|
||||
file_list_t *selection_buf = NULL;
|
||||
unsigned horizontal_list_size = 0;
|
||||
|
||||
/* If fullscreen thumbnail view is active, any
|
||||
* valid menu action will disable it... */
|
||||
if (ozone->show_fullscreen_thumbnails)
|
||||
{
|
||||
if (action != MENU_ACTION_NOOP)
|
||||
{
|
||||
ozone_hide_fullscreen_thumbnails(ozone, true);
|
||||
|
||||
/* ...and any action other than Select/OK
|
||||
* is ignored
|
||||
* > We allow pass-through of Select/OK since
|
||||
* users may want to run content directly
|
||||
* after viewing fullscreen thumbnails,
|
||||
* and having to press RetroPad A or the Return
|
||||
* key twice is navigationally confusing
|
||||
* > Note that we can only do this for non-pointer
|
||||
* input
|
||||
* > Note that we don't do this when viewing a
|
||||
* file list, since there is no quick menu
|
||||
* in this case - i.e. content loads directly,
|
||||
* and a sudden transition from fullscreen
|
||||
* thumbnail to content is jarring...
|
||||
* > We also don't do this when viewing a database
|
||||
* manager list, because the menu transition
|
||||
* detection becomes too cumbersome... */
|
||||
if (ozone->is_file_list ||
|
||||
ozone->is_db_manager_list ||
|
||||
((action != MENU_ACTION_SELECT) &&
|
||||
(action != MENU_ACTION_OK)))
|
||||
return MENU_ACTION_NOOP;
|
||||
}
|
||||
}
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
horizontal_list_size = (unsigned)ozone->horizontal_list->size;
|
||||
|
||||
ozone->messagebox_state = false || menu_input_dialog_get_display_kb();
|
||||
selection_buf = menu_entries_get_selection_buf_ptr(0);
|
||||
tag = (uintptr_t)selection_buf;
|
||||
|
||||
/* Scan user inputs */
|
||||
switch (action)
|
||||
{
|
||||
case MENU_ACTION_START:
|
||||
ozone->cursor_mode = false;
|
||||
/* If this is a menu with thumbnails and cursor
|
||||
* is not in the sidebar, attempt to show
|
||||
* fullscreen thumbnail view */
|
||||
if (ozone->fullscreen_thumbnails_available &&
|
||||
!ozone->cursor_in_sidebar)
|
||||
{
|
||||
ozone_show_fullscreen_thumbnails(ozone);
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
}
|
||||
break;
|
||||
case MENU_ACTION_DOWN:
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
/* If cursor is active, ensure we target
|
||||
* an on screen category */
|
||||
size_t selection = (ozone->cursor_mode) ?
|
||||
ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr;
|
||||
|
||||
new_selection = (int)(selection + 1);
|
||||
|
||||
if (new_selection >= (int)(ozone->system_tab_end + horizontal_list_size + 1))
|
||||
new_selection = 0;
|
||||
|
||||
ozone_sidebar_goto(ozone, new_selection);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *centre* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone,
|
||||
OZONE_ONSCREEN_ENTRY_CENTRE);
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
case MENU_ACTION_UP:
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
/* If cursor is active, ensure we target
|
||||
* an on screen category */
|
||||
size_t selection = (ozone->cursor_mode) ?
|
||||
ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr;
|
||||
|
||||
new_selection = (int)selection - 1;
|
||||
|
||||
if (new_selection < 0)
|
||||
new_selection = horizontal_list_size + ozone->system_tab_end;
|
||||
|
||||
ozone_sidebar_goto(ozone, new_selection);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *centre* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone,
|
||||
OZONE_ONSCREEN_ENTRY_CENTRE);
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
case MENU_ACTION_LEFT:
|
||||
ozone->cursor_mode = false;
|
||||
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
else if (ozone->depth > 1)
|
||||
break;
|
||||
|
||||
ozone_go_to_sidebar(ozone, tag);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
case MENU_ACTION_RIGHT:
|
||||
ozone->cursor_mode = false;
|
||||
if (!ozone->cursor_in_sidebar)
|
||||
{
|
||||
if (ozone->depth == 1)
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
break;
|
||||
}
|
||||
|
||||
ozone_leave_sidebar(ozone, tag);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL;
|
||||
break;
|
||||
case MENU_ACTION_OK:
|
||||
ozone->cursor_mode = false;
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
ozone_leave_sidebar(ozone, tag);
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MENU_ACTION_CANCEL:
|
||||
ozone->cursor_mode = false;
|
||||
|
||||
/* If this is a playlist, handle 'backing out'
|
||||
* of a search, if required */
|
||||
if (ozone->is_playlist)
|
||||
{
|
||||
struct string_list *menu_search_terms = menu_driver_search_get_terms();
|
||||
|
||||
if (menu_search_terms &&
|
||||
(menu_search_terms->size > 0))
|
||||
break;
|
||||
}
|
||||
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
/* Go back to main menu tab */
|
||||
if (ozone->categories_selection_ptr != 0)
|
||||
ozone_sidebar_goto(ozone, 0);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (menu_entries_get_stack_size(0) == 1)
|
||||
{
|
||||
ozone_go_to_sidebar(ozone, tag);
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_ACTION_SCROLL_UP:
|
||||
/* Descend alphabet (Z towards A) */
|
||||
|
||||
/* Ignore if cursor is in sidebar */
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *last* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone,
|
||||
OZONE_ONSCREEN_ENTRY_LAST);
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
case MENU_ACTION_SCROLL_DOWN:
|
||||
/* Ascend alphabet (A towards Z) */
|
||||
|
||||
/* > Ignore if cursor is in sidebar */
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *first* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone,
|
||||
OZONE_ONSCREEN_ENTRY_FIRST);
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
|
||||
case MENU_ACTION_INFO:
|
||||
/* If we currently viewing a playlist with
|
||||
* dual thumbnails, toggle the content metadata
|
||||
* override */
|
||||
if (ozone_metadata_override_available(ozone))
|
||||
{
|
||||
ozone_toggle_metadata_override(ozone);
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
}
|
||||
/* ...and since the user is likely to trigger
|
||||
* 'INFO' actions on invalid playlist entries,
|
||||
* suppress this action entirely when viewing
|
||||
* playlists under all other conditions
|
||||
* > Playlists have no 'INFO' entries - the
|
||||
* user is just greeted with a useless
|
||||
* 'no information available' message
|
||||
* > It is incredibly annoying to inadvertently
|
||||
* trigger this message when you just want to
|
||||
* toggle metadata... */
|
||||
else if (ozone->is_playlist && ozone->show_thumbnail_bar)
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* In all other cases, pass through input
|
||||
* menu action without intervention */
|
||||
break;
|
||||
}
|
||||
|
||||
return new_action;
|
||||
}
|
||||
|
||||
|
||||
/* Menu entry action callback */
|
||||
static int ozone_menu_entry_action(
|
||||
void *userdata, menu_entry_t *entry,
|
||||
size_t i, enum menu_action action);
|
||||
static bool INLINE ozone_metadata_override_available(ozone_handle_t *ozone);
|
||||
size_t i, enum menu_action action)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*)userdata;
|
||||
menu_entry_t *entry_ptr = entry;
|
||||
size_t selection = i;
|
||||
size_t new_selection;
|
||||
menu_entry_t new_entry;
|
||||
/* Process input action */
|
||||
enum menu_action new_action = ozone_parse_menu_entry_action(ozone, action);
|
||||
|
||||
/* Check whether current selection has changed
|
||||
* (due to automatic on screen entry selection...) */
|
||||
new_selection = menu_navigation_get_selection();
|
||||
|
||||
if (new_selection != selection)
|
||||
{
|
||||
/* Selection has changed - must update
|
||||
* entry pointer */
|
||||
menu_entry_init(&new_entry);
|
||||
new_entry.path_enabled = false;
|
||||
new_entry.label_enabled = false;
|
||||
new_entry.rich_label_enabled = false;
|
||||
new_entry.value_enabled = false;
|
||||
new_entry.sublabel_enabled = false;
|
||||
menu_entry_get(&new_entry, 0, new_selection, NULL, true);
|
||||
entry_ptr = &new_entry;
|
||||
}
|
||||
|
||||
/* Call standard generic_menu_entry_action() function */
|
||||
return generic_menu_entry_action(userdata, entry_ptr,
|
||||
new_selection, new_action);
|
||||
}
|
||||
|
||||
|
||||
static void ozone_free_node(ozone_node_t *node)
|
||||
{
|
||||
@ -1979,91 +2440,6 @@ static void ozone_draw_footer(ozone_handle_t *ozone,
|
||||
}
|
||||
}
|
||||
|
||||
static void ozone_set_thumbnail_content(void *data, const char *s)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*)data;
|
||||
|
||||
if (!ozone)
|
||||
return;
|
||||
|
||||
if (ozone->is_playlist)
|
||||
{
|
||||
/* Playlist content */
|
||||
if (string_is_empty(s))
|
||||
{
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
size_t list_size = menu_entries_get_size();
|
||||
file_list_t *list = menu_entries_get_selection_buf_ptr(0);
|
||||
bool playlist_valid = false;
|
||||
size_t playlist_index = selection;
|
||||
|
||||
/* Get playlist index corresponding
|
||||
* to the selected entry */
|
||||
if (list &&
|
||||
(selection < list_size) &&
|
||||
(list->list[selection].type == FILE_TYPE_RPL_ENTRY))
|
||||
{
|
||||
playlist_valid = true;
|
||||
playlist_index = list->list[selection].entry_idx;
|
||||
}
|
||||
|
||||
gfx_thumbnail_set_content_playlist(ozone->thumbnail_path_data,
|
||||
playlist_valid ? playlist_get_cached() : NULL, playlist_index);
|
||||
}
|
||||
}
|
||||
else if (ozone->is_db_manager_list)
|
||||
{
|
||||
/* Database list content */
|
||||
if (string_is_empty(s))
|
||||
{
|
||||
menu_entry_t entry;
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
|
||||
menu_entry_init(&entry);
|
||||
entry.label_enabled = false;
|
||||
entry.rich_label_enabled = false;
|
||||
entry.value_enabled = false;
|
||||
entry.sublabel_enabled = false;
|
||||
menu_entry_get(&entry, 0, selection, NULL, true);
|
||||
|
||||
if (!string_is_empty(entry.path))
|
||||
gfx_thumbnail_set_content(ozone->thumbnail_path_data, entry.path);
|
||||
}
|
||||
}
|
||||
else if (string_is_equal(s, "imageviewer"))
|
||||
{
|
||||
/* Filebrowser image updates */
|
||||
menu_entry_t entry;
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
|
||||
ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(selection_buf, selection);
|
||||
|
||||
if (node)
|
||||
{
|
||||
menu_entry_init(&entry);
|
||||
entry.label_enabled = false;
|
||||
entry.rich_label_enabled = false;
|
||||
entry.value_enabled = false;
|
||||
entry.sublabel_enabled = false;
|
||||
menu_entry_get(&entry, 0, selection, NULL, true);
|
||||
if (!string_is_empty(entry.path) && !string_is_empty(node->fullpath))
|
||||
gfx_thumbnail_set_content_image(ozone->thumbnail_path_data, node->fullpath, entry.path);
|
||||
}
|
||||
}
|
||||
else if (!string_is_empty(s))
|
||||
{
|
||||
/* Annoying leftovers...
|
||||
* This is required to ensure that thumbnails are
|
||||
* updated correctly when navigating deeply through
|
||||
* the sublevels of database manager lists.
|
||||
* Showing thumbnails on database entries is a
|
||||
* pointless nuisance and a waste of CPU cycles, IMHO... */
|
||||
gfx_thumbnail_set_content(ozone->thumbnail_path_data, s);
|
||||
}
|
||||
|
||||
ozone_update_content_metadata(ozone);
|
||||
}
|
||||
|
||||
static void ozone_set_thumbnail_system(void *data, char*s, size_t len)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*)data;
|
||||
@ -3011,27 +3387,6 @@ static int ozone_list_bind_init(menu_file_list_cbs_t *cbs,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static bool INLINE ozone_metadata_override_available(ozone_handle_t *ozone)
|
||||
{
|
||||
/* Ugly construct...
|
||||
* Content metadata display override may be
|
||||
* toggled if the following are true:
|
||||
* - We are viewing playlist thumbnails
|
||||
* - This is *not* an image viewer playlist
|
||||
* - Both right and left thumbnails are
|
||||
* enabled/available
|
||||
* Short circuiting means that in most cases
|
||||
* only 'ozone->is_playlist' will be evaluated,
|
||||
* so this isn't too much of a performance hog... */
|
||||
return ozone->is_playlist &&
|
||||
ozone->show_thumbnail_bar &&
|
||||
!ozone->selection_core_is_viewer &&
|
||||
(ozone->thumbnails.left.status != GFX_THUMBNAIL_STATUS_MISSING) &&
|
||||
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_LEFT) &&
|
||||
(ozone->thumbnails.right.status != GFX_THUMBNAIL_STATUS_MISSING) &&
|
||||
gfx_thumbnail_is_enabled(ozone->thumbnail_path_data, GFX_THUMBNAIL_RIGHT);
|
||||
}
|
||||
|
||||
static int ozone_pointer_up(void *userdata,
|
||||
unsigned x, unsigned y, unsigned ptr,
|
||||
enum menu_input_pointer_gesture gesture,
|
||||
@ -3087,10 +3442,8 @@ static int ozone_pointer_up(void *userdata,
|
||||
if (ptr != selection)
|
||||
menu_navigation_set_selection(ptr);
|
||||
|
||||
/* If we are currently in the sidebar, leave it */
|
||||
if (ozone->cursor_in_sidebar)
|
||||
ozone_leave_sidebar(ozone, sidebar_tag);
|
||||
/* Otherwise perform a MENU_ACTION_SELECT on currently
|
||||
/* If we are not currently in the sidebar,
|
||||
* perform a MENU_ACTION_SELECT on currently
|
||||
* active item
|
||||
* > NOTE 1: Cannot perform a 'leave sidebar' operation
|
||||
* and a MENU_ACTION_SELECT at the same time...
|
||||
@ -3099,8 +3452,12 @@ static int ozone_pointer_up(void *userdata,
|
||||
* registers any change due to the above automatic
|
||||
* 'pointer item' activation, and thus operates
|
||||
* on the correct target entry */
|
||||
else
|
||||
return ozone_menu_entry_action(ozone, entry, selection, MENU_ACTION_SELECT);
|
||||
if (!ozone->cursor_in_sidebar)
|
||||
return ozone_menu_entry_action(ozone, entry,
|
||||
selection, MENU_ACTION_SELECT);
|
||||
|
||||
/* If we currently in the sidebar, leave it */
|
||||
ozone_leave_sidebar(ozone, sidebar_tag);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3194,364 +3551,6 @@ static int ozone_pointer_up(void *userdata,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns true if specified entry is currently
|
||||
* displayed on screen */
|
||||
static bool INLINE ozone_entry_onscreen(
|
||||
ozone_handle_t *ozone, size_t idx)
|
||||
{
|
||||
return (idx >= ozone->first_onscreen_entry) &&
|
||||
(idx <= ozone->last_onscreen_entry);
|
||||
}
|
||||
|
||||
/* If currently selected entry is off screen,
|
||||
* moves selection to specified on screen target
|
||||
* > Does nothing if currently selected item is
|
||||
* already on screen */
|
||||
static void ozone_auto_select_onscreen_entry(
|
||||
ozone_handle_t *ozone,
|
||||
enum ozone_onscreen_entry_position_type target_entry)
|
||||
{
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
|
||||
/* Check whether selected item is already on screen */
|
||||
if (ozone_entry_onscreen(ozone, selection))
|
||||
return;
|
||||
|
||||
/* Update selection index */
|
||||
switch (target_entry)
|
||||
{
|
||||
case OZONE_ONSCREEN_ENTRY_FIRST:
|
||||
selection = ozone->first_onscreen_entry;
|
||||
break;
|
||||
case OZONE_ONSCREEN_ENTRY_LAST:
|
||||
selection = ozone->last_onscreen_entry;
|
||||
break;
|
||||
case OZONE_ONSCREEN_ENTRY_CENTRE:
|
||||
default:
|
||||
selection = (ozone->first_onscreen_entry >> 1) +
|
||||
(ozone->last_onscreen_entry >> 1);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Apply new selection */
|
||||
menu_navigation_set_selection(selection);
|
||||
}
|
||||
|
||||
/* Returns true if specified category is currently
|
||||
* displayed on screen */
|
||||
static bool INLINE ozone_category_onscreen(
|
||||
ozone_handle_t *ozone, size_t idx)
|
||||
{
|
||||
return (idx >= ozone->first_onscreen_category) &&
|
||||
(idx <= ozone->last_onscreen_category);
|
||||
}
|
||||
|
||||
/* If current category is on screen, returns its
|
||||
* index. If current category is off screen, returns
|
||||
* index of centremost on screen category. */
|
||||
static size_t ozone_get_onscreen_category_selection(
|
||||
ozone_handle_t *ozone)
|
||||
{
|
||||
/* Check whether selected category is already on screen */
|
||||
if (ozone_category_onscreen(ozone, ozone->categories_selection_ptr))
|
||||
return ozone->categories_selection_ptr;
|
||||
|
||||
/* Return index of centremost category */
|
||||
return (ozone->first_onscreen_category >> 1) +
|
||||
(ozone->last_onscreen_category >> 1);
|
||||
}
|
||||
|
||||
static enum menu_action ozone_parse_menu_entry_action(
|
||||
ozone_handle_t *ozone, enum menu_action action)
|
||||
{
|
||||
uintptr_t tag;
|
||||
int new_selection;
|
||||
enum menu_action new_action = action;
|
||||
file_list_t *selection_buf = NULL;
|
||||
unsigned horizontal_list_size = 0;
|
||||
|
||||
/* If fullscreen thumbnail view is active, any
|
||||
* valid menu action will disable it... */
|
||||
if (ozone->show_fullscreen_thumbnails)
|
||||
{
|
||||
if (action != MENU_ACTION_NOOP)
|
||||
{
|
||||
ozone_hide_fullscreen_thumbnails(ozone, true);
|
||||
|
||||
/* ...and any action other than Select/OK
|
||||
* is ignored
|
||||
* > We allow pass-through of Select/OK since
|
||||
* users may want to run content directly
|
||||
* after viewing fullscreen thumbnails,
|
||||
* and having to press RetroPad A or the Return
|
||||
* key twice is navigationally confusing
|
||||
* > Note that we can only do this for non-pointer
|
||||
* input
|
||||
* > Note that we don't do this when viewing a
|
||||
* file list, since there is no quick menu
|
||||
* in this case - i.e. content loads directly,
|
||||
* and a sudden transition from fullscreen
|
||||
* thumbnail to content is jarring...
|
||||
* > We also don't do this when viewing a database
|
||||
* manager list, because the menu transition
|
||||
* detection becomes too cumbersome... */
|
||||
if (ozone->is_file_list ||
|
||||
ozone->is_db_manager_list ||
|
||||
((action != MENU_ACTION_SELECT) &&
|
||||
(action != MENU_ACTION_OK)))
|
||||
return MENU_ACTION_NOOP;
|
||||
}
|
||||
}
|
||||
|
||||
if (ozone->horizontal_list)
|
||||
horizontal_list_size = (unsigned)ozone->horizontal_list->size;
|
||||
|
||||
ozone->messagebox_state = false || menu_input_dialog_get_display_kb();
|
||||
selection_buf = menu_entries_get_selection_buf_ptr(0);
|
||||
tag = (uintptr_t)selection_buf;
|
||||
|
||||
/* Scan user inputs */
|
||||
switch (action)
|
||||
{
|
||||
case MENU_ACTION_START:
|
||||
ozone->cursor_mode = false;
|
||||
/* If this is a menu with thumbnails and cursor
|
||||
* is not in the sidebar, attempt to show
|
||||
* fullscreen thumbnail view */
|
||||
if (ozone->fullscreen_thumbnails_available &&
|
||||
!ozone->cursor_in_sidebar)
|
||||
{
|
||||
ozone_show_fullscreen_thumbnails(ozone);
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
}
|
||||
break;
|
||||
case MENU_ACTION_DOWN:
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
/* If cursor is active, ensure we target
|
||||
* an on screen category */
|
||||
size_t selection = (ozone->cursor_mode) ?
|
||||
ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr;
|
||||
|
||||
new_selection = (int)(selection + 1);
|
||||
|
||||
if (new_selection >= (int)(ozone->system_tab_end + horizontal_list_size + 1))
|
||||
new_selection = 0;
|
||||
|
||||
ozone_sidebar_goto(ozone, new_selection);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *centre* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone, OZONE_ONSCREEN_ENTRY_CENTRE);
|
||||
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
case MENU_ACTION_UP:
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
/* If cursor is active, ensure we target
|
||||
* an on screen category */
|
||||
size_t selection = (ozone->cursor_mode) ?
|
||||
ozone_get_onscreen_category_selection(ozone) : ozone->categories_selection_ptr;
|
||||
|
||||
new_selection = (int)selection - 1;
|
||||
|
||||
if (new_selection < 0)
|
||||
new_selection = horizontal_list_size + ozone->system_tab_end;
|
||||
|
||||
ozone_sidebar_goto(ozone, new_selection);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *centre* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone, OZONE_ONSCREEN_ENTRY_CENTRE);
|
||||
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
case MENU_ACTION_LEFT:
|
||||
ozone->cursor_mode = false;
|
||||
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
else if (ozone->depth > 1)
|
||||
break;
|
||||
|
||||
ozone_go_to_sidebar(ozone, tag);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
case MENU_ACTION_RIGHT:
|
||||
ozone->cursor_mode = false;
|
||||
if (!ozone->cursor_in_sidebar)
|
||||
{
|
||||
if (ozone->depth == 1)
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
break;
|
||||
}
|
||||
|
||||
ozone_leave_sidebar(ozone, tag);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL;
|
||||
break;
|
||||
case MENU_ACTION_OK:
|
||||
ozone->cursor_mode = false;
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
ozone_leave_sidebar(ozone, tag);
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_LABEL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MENU_ACTION_CANCEL:
|
||||
ozone->cursor_mode = false;
|
||||
|
||||
/* If this is a playlist, handle 'backing out'
|
||||
* of a search, if required */
|
||||
if (ozone->is_playlist)
|
||||
{
|
||||
struct string_list *menu_search_terms = menu_driver_search_get_terms();
|
||||
|
||||
if (menu_search_terms &&
|
||||
(menu_search_terms->size > 0))
|
||||
break;
|
||||
}
|
||||
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
/* Go back to main menu tab */
|
||||
if (ozone->categories_selection_ptr != 0)
|
||||
ozone_sidebar_goto(ozone, 0);
|
||||
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (menu_entries_get_stack_size(0) == 1)
|
||||
{
|
||||
ozone_go_to_sidebar(ozone, tag);
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_ACTION_SCROLL_UP:
|
||||
/* Descend alphabet (Z towards A) */
|
||||
|
||||
/* Ignore if cursor is in sidebar */
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *last* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone, OZONE_ONSCREEN_ENTRY_LAST);
|
||||
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
case MENU_ACTION_SCROLL_DOWN:
|
||||
/* Ascend alphabet (A towards Z) */
|
||||
|
||||
/* > Ignore if cursor is in sidebar */
|
||||
if (ozone->cursor_in_sidebar)
|
||||
{
|
||||
new_action = MENU_ACTION_ACCESSIBILITY_SPEAK_TITLE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If pointer is active and current selection
|
||||
* is off screen, auto select *first* item */
|
||||
if (ozone->cursor_mode)
|
||||
ozone_auto_select_onscreen_entry(ozone, OZONE_ONSCREEN_ENTRY_FIRST);
|
||||
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
|
||||
case MENU_ACTION_INFO:
|
||||
/* If we currently viewing a playlist with
|
||||
* dual thumbnails, toggle the content metadata
|
||||
* override */
|
||||
if (ozone_metadata_override_available(ozone))
|
||||
{
|
||||
ozone_toggle_metadata_override(ozone);
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
}
|
||||
/* ...and since the user is likely to trigger
|
||||
* 'INFO' actions on invalid playlist entries,
|
||||
* suppress this action entirely when viewing
|
||||
* playlists under all other conditions
|
||||
* > Playlists have no 'INFO' entries - the
|
||||
* user is just greeted with a useless
|
||||
* 'no information available' message
|
||||
* > It is incredibly annoying to inadvertently
|
||||
* trigger this message when you just want to
|
||||
* toggle metadata... */
|
||||
else if (ozone->is_playlist && ozone->show_thumbnail_bar)
|
||||
new_action = MENU_ACTION_NOOP;
|
||||
|
||||
ozone->cursor_mode = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* In all other cases, pass through input
|
||||
* menu action without intervention */
|
||||
break;
|
||||
}
|
||||
|
||||
return new_action;
|
||||
}
|
||||
|
||||
/* Menu entry action callback */
|
||||
static int ozone_menu_entry_action(
|
||||
void *userdata, menu_entry_t *entry,
|
||||
size_t i, enum menu_action action)
|
||||
{
|
||||
ozone_handle_t *ozone = (ozone_handle_t*)userdata;
|
||||
menu_entry_t *entry_ptr = entry;
|
||||
size_t selection = i;
|
||||
size_t new_selection;
|
||||
menu_entry_t new_entry;
|
||||
/* Process input action */
|
||||
enum menu_action new_action = ozone_parse_menu_entry_action(ozone, action);
|
||||
|
||||
/* Check whether current selection has changed
|
||||
* (due to automatic on screen entry selection...) */
|
||||
new_selection = menu_navigation_get_selection();
|
||||
|
||||
if (new_selection != selection)
|
||||
{
|
||||
/* Selection has changed - must update
|
||||
* entry pointer */
|
||||
menu_entry_init(&new_entry);
|
||||
new_entry.path_enabled = false;
|
||||
new_entry.label_enabled = false;
|
||||
new_entry.rich_label_enabled = false;
|
||||
new_entry.value_enabled = false;
|
||||
new_entry.sublabel_enabled = false;
|
||||
menu_entry_get(&new_entry, 0, new_selection, NULL, true);
|
||||
entry_ptr = &new_entry;
|
||||
}
|
||||
|
||||
/* Call standard generic_menu_entry_action() function */
|
||||
return generic_menu_entry_action(userdata, entry_ptr,
|
||||
new_selection, new_action);
|
||||
}
|
||||
|
||||
ozone_node_t *ozone_alloc_node(void)
|
||||
{
|
||||
ozone_node_t *node = (ozone_node_t*)malloc(sizeof(*node));
|
||||
|
@ -280,15 +280,11 @@ ozone_theme_t *ozone_themes[] = {
|
||||
&ozone_theme_gruvbox_dark
|
||||
};
|
||||
|
||||
/* TODO/FIXME - all of the public global variables below are
|
||||
* referenced outside */
|
||||
|
||||
/* TODO/FIXME - global variables referenced outside */
|
||||
unsigned ozone_themes_count = sizeof(ozone_themes) / sizeof(ozone_themes[0]);
|
||||
unsigned last_color_theme = 0;
|
||||
|
||||
bool last_use_preferred_system_color_theme = false;
|
||||
ozone_theme_t *ozone_default_theme = &ozone_theme_dark; /* also used as a tag for cursor animation */
|
||||
|
||||
/* Enable runtime configuration of framebuffer
|
||||
* opacity */
|
||||
float last_framebuffer_opacity = -1.0f;
|
||||
@ -361,7 +357,8 @@ void ozone_set_background_running_opacity(
|
||||
if (!ozone || !ozone->theme->background_libretro_running)
|
||||
return;
|
||||
|
||||
background = ozone->theme->background_libretro_running;
|
||||
background =
|
||||
ozone->theme->background_libretro_running;
|
||||
|
||||
/* When content is running, background is a
|
||||
* gradient that from top to bottom transitions
|
||||
@ -370,8 +367,8 @@ void ozone_set_background_running_opacity(
|
||||
* is 0.900. At this setting:
|
||||
* - Background top has an alpha of 1.0
|
||||
* - Background bottom has an alpha of 0.75 */
|
||||
background_running_alpha_top = framebuffer_opacity / 0.9f;
|
||||
background_running_alpha_top = (background_running_alpha_top > 1.0f) ?
|
||||
background_running_alpha_top = framebuffer_opacity / 0.9f;
|
||||
background_running_alpha_top = (background_running_alpha_top > 1.0f) ?
|
||||
1.0f : (background_running_alpha_top < 0.0f) ?
|
||||
0.0f : background_running_alpha_top;
|
||||
|
||||
@ -380,10 +377,10 @@ void ozone_set_background_running_opacity(
|
||||
1.0f : (background_running_alpha_bottom < 0.0f) ?
|
||||
0.0f : background_running_alpha_bottom;
|
||||
|
||||
background[11] = background_running_alpha_top;
|
||||
background[15] = background_running_alpha_top;
|
||||
background[3] = background_running_alpha_bottom;
|
||||
background[7] = background_running_alpha_bottom;
|
||||
background[11] = background_running_alpha_top;
|
||||
background[15] = background_running_alpha_top;
|
||||
background[3] = background_running_alpha_bottom;
|
||||
background[7] = background_running_alpha_bottom;
|
||||
|
||||
last_framebuffer_opacity = framebuffer_opacity;
|
||||
last_framebuffer_opacity = framebuffer_opacity;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user