diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index c52d14095f..0683a92656 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -2788,6 +2788,7 @@ menu_ctx_driver_t menu_ctx_mui = { NULL, NULL, NULL, + NULL, menu_display_osk_ptr_at_pos, NULL, /* update_savestate_thumbnail_path */ NULL, /* update_savestate_thumbnail_image */ diff --git a/menu/drivers/null.c b/menu/drivers/null.c index 30dd9a88d7..5066738ebd 100644 --- a/menu/drivers/null.c +++ b/menu/drivers/null.c @@ -91,6 +91,7 @@ menu_ctx_driver_t menu_ctx_null = { NULL, /* pointer_tap */ NULL, /* update_thumbnail_path */ NULL, /* update_thumbnail_image */ + NULL, /* refresh_thumbnail_image */ NULL, /* set_thumbnail_system */ NULL, /* get_thumbnail_system */ NULL, /* set_thumbnail_content */ diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 53d538cc04..1a1f58fc3a 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -423,6 +423,20 @@ static void ozone_update_thumbnail_image(void *data) video_driver_texture_unload(&ozone->left_thumbnail); } +static void ozone_refresh_thumbnail_image(void *data) +{ + ozone_handle_t *ozone = (ozone_handle_t*)data; + + if (!ozone) + return; + + /* Only refresh thumbnails if thumbnails are enabled + * and we are currently viewing a playlist */ + if ((menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) && + (ozone->is_playlist && ozone->depth == 1)) + ozone_update_thumbnail_image(ozone); +} + /* TODO: Scale text */ static void ozone_context_reset(void *data, bool is_threaded) { @@ -2338,6 +2352,7 @@ menu_ctx_driver_t menu_ctx_ozone = { ozone_pointer_tap, ozone_update_thumbnail_path, ozone_update_thumbnail_image, + ozone_refresh_thumbnail_image, ozone_set_thumbnail_system, ozone_get_thumbnail_system, ozone_set_thumbnail_content, diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 34074be586..bda865ba1a 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -4271,6 +4271,44 @@ static void rgui_update_thumbnail_image(void *userdata) rgui_scan_selected_entry_thumbnail(rgui, true); } +static void rgui_refresh_thumbnail_image(void *userdata) +{ + rgui_t *rgui = (rgui_t*)userdata; + settings_t *settings = config_get_ptr(); + if (!rgui || !settings) + return; + + /* Only refresh thumbnails if thumbnails are enabled */ + if ((rgui->show_fs_thumbnail || settings->bools.menu_rgui_inline_thumbnails) && + (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT))) + { + /* In all cases, reset current thumbnails */ + fs_thumbnail.width = 0; + fs_thumbnail.height = 0; + fs_thumbnail.is_valid = false; + free(fs_thumbnail.path); + fs_thumbnail.path = NULL; + + mini_thumbnail.width = 0; + mini_thumbnail.height = 0; + mini_thumbnail.is_valid = false; + free(mini_thumbnail.path); + mini_thumbnail.path = NULL; + + mini_left_thumbnail.width = 0; + mini_left_thumbnail.height = 0; + mini_left_thumbnail.is_valid = false; + free(mini_left_thumbnail.path); + mini_left_thumbnail.path = NULL; + + /* Only load thumbnails if currently viewing a + * playlist (note that thumbnails are loaded + * immediately, for an optimal user experience) */ + if (rgui->is_playlist) + rgui_scan_selected_entry_thumbnail(rgui, true); + } +} + static void rgui_update_menu_sublabel(rgui_t *rgui) { size_t selection = menu_navigation_get_selection(); @@ -4689,6 +4727,7 @@ menu_ctx_driver_t menu_ctx_rgui = { rgui_pointer_tap, NULL, /* update_thumbnail_path */ rgui_update_thumbnail_image, + rgui_refresh_thumbnail_image, rgui_set_thumbnail_system, rgui_get_thumbnail_system, NULL, /* set_thumbnail_content */ diff --git a/menu/drivers/stripes.c b/menu/drivers/stripes.c index d699ae0985..faec12ccae 100644 --- a/menu/drivers/stripes.c +++ b/menu/drivers/stripes.c @@ -1090,6 +1090,11 @@ static void stripes_update_thumbnail_image(void *data) } } +static void stripes_refresh_thumbnail_image(void *data) +{ + stripes_update_thumbnail_image(data); +} + static void stripes_set_thumbnail_system(void *data, char*s, size_t len) { stripes_handle_t *stripes = (stripes_handle_t*)data; @@ -4451,6 +4456,7 @@ menu_ctx_driver_t menu_ctx_stripes = { stripes_pointer_tap, stripes_update_thumbnail_path, stripes_update_thumbnail_image, + stripes_refresh_thumbnail_image, stripes_set_thumbnail_system, stripes_get_thumbnail_system, stripes_set_thumbnail_content, diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 5ac5c1ac00..3f7758fd4f 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -248,6 +248,7 @@ typedef struct xmb_handle bool assets_missing; bool is_playlist; bool is_db_manager_list; + bool is_quick_menu; uint8_t system_tab_end; uint8_t tabs[XMB_SYSTEM_TAB_MAX_LENGTH]; @@ -1035,6 +1036,59 @@ static void xmb_update_thumbnail_image(void *data) video_driver_texture_unload(&xmb->left_thumbnail); } +static unsigned xmb_get_system_tab(xmb_handle_t *xmb, unsigned i) +{ + if (i <= xmb->system_tab_end) + { + return xmb->tabs[i]; + } + return UINT_MAX; +} + +static void xmb_refresh_thumbnail_image(void *data) +{ + xmb_handle_t *xmb = (xmb_handle_t*)data; + + if (!xmb) + return; + + /* Only refresh thumbnails if thumbnails are enabled */ + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + { + unsigned depth = (unsigned)xmb_list_get_size(xmb, MENU_LIST_PLAIN); + unsigned xmb_system_tab = xmb_get_system_tab(xmb, (unsigned)xmb->categories_selection_ptr); + + /* Only refresh thumbnails if we are viewing a playlist or + * the quick menu... */ + + /* If we are currently viewing a playlist, then it's almost inevitable + * that we've just gone up a level from the quick menu. In this case, + * xmb_set_thumbnail_system() will have been called, which resets + * thumbnail path data. We therefore have to regenerate the thumbnail + * paths... */ + if (((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS && depth == 1) || + (xmb_system_tab < XMB_SYSTEM_TAB_SETTINGS && depth == 4)) && + xmb->is_playlist) + { + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + xmb_update_thumbnail_path(xmb, 0 /* will be ignored */, 'R'); + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + xmb_update_thumbnail_path(xmb, 0 /* will be ignored */, 'L'); + + xmb_update_thumbnail_image(xmb); + } + else if (xmb->is_quick_menu) + { + /* If this is the quick menu (most likely, since this is + * where the 'download thumbnails' option is located), + * then thumbnail paths are already valid - just need to + * update images */ + xmb_update_thumbnail_image(xmb); + } + } +} + static void xmb_set_thumbnail_system(void *data, char*s, size_t len) { xmb_handle_t *xmb = (xmb_handle_t*)data; @@ -1139,15 +1193,6 @@ static void xmb_update_savestate_thumbnail_image(void *data) video_driver_texture_unload(&xmb->savestate_thumbnail); } -static unsigned xmb_get_system_tab(xmb_handle_t *xmb, unsigned i) -{ - if (i <= xmb->system_tab_end) - { - return xmb->tabs[i]; - } - return UINT_MAX; -} - static void xmb_selection_pointer_changed( xmb_handle_t *xmb, bool allow_animations) { @@ -2192,6 +2237,9 @@ static void xmb_populate_entries(void *data, /* Determine whether this is a database manager list */ xmb->is_db_manager_list = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DATABASE_MANAGER_LIST)); + /* Determine whether this is the quick menu */ + xmb->is_quick_menu = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS)); + if (menu_driver_ctl(RARCH_MENU_CTL_IS_PREVENT_POPULATE, NULL)) { xmb_selection_pointer_changed(xmb, false); @@ -5768,6 +5816,7 @@ menu_ctx_driver_t menu_ctx_xmb = { xmb_pointer_tap, xmb_update_thumbnail_path, xmb_update_thumbnail_image, + xmb_refresh_thumbnail_image, xmb_set_thumbnail_system, xmb_get_thumbnail_system, xmb_set_thumbnail_content, diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index 6954261648..7de4a69a5b 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -735,6 +735,7 @@ menu_ctx_driver_t menu_ctx_xui = { NULL, /* pointer_tap */ NULL, /* update_thumbnail_path */ NULL, /* update_thumbnail_image */ + NULL, /* refresh_thumbnail_image */ NULL, /* set_thumbnail_system */ NULL, /* get_thumbnail_system */ NULL, /* set_thumbnail_content */ diff --git a/menu/menu_defines.h b/menu/menu_defines.h index 9fe47bbfa4..b3c67ce1ad 100644 --- a/menu/menu_defines.h +++ b/menu/menu_defines.h @@ -79,6 +79,7 @@ enum rarch_menu_ctl_state RARCH_MENU_CTL_BIND_INIT, RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, + RARCH_MENU_CTL_REFRESH_THUMBNAIL_IMAGE, RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH, RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE, MENU_NAVIGATION_CTL_CLEAR, diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 89217b35fd..17a1559f4a 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -2553,6 +2553,13 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) menu_driver_ctx->update_thumbnail_image(menu_userdata); } break; + case RARCH_MENU_CTL_REFRESH_THUMBNAIL_IMAGE: + { + if (!menu_driver_ctx || !menu_driver_ctx->refresh_thumbnail_image) + return false; + menu_driver_ctx->refresh_thumbnail_image(menu_userdata); + } + break; case RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH: { size_t selection = menu_navigation_get_selection(); diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 7bf1808a01..dcdfa94c78 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -384,6 +384,7 @@ typedef struct menu_ctx_driver menu_entry_t *entry, unsigned action); void (*update_thumbnail_path)(void *data, unsigned i, char pos); void (*update_thumbnail_image)(void *data); + void (*refresh_thumbnail_image)(void *data); void (*set_thumbnail_system)(void *data, char* s, size_t len); void (*get_thumbnail_system)(void *data, char* s, size_t len); void (*set_thumbnail_content)(void *data, const char *s); diff --git a/tasks/task_pl_thumbnail_download.c b/tasks/task_pl_thumbnail_download.c index 5639bfc6af..7c2dd10664 100644 --- a/tasks/task_pl_thumbnail_download.c +++ b/tasks/task_pl_thumbnail_download.c @@ -232,16 +232,7 @@ static void cb_task_pl_thumbnail_refresh_menu( retro_task_t *task, void *task_data, void *user_data, const char *err) { - settings_t *settings = config_get_ptr(); - - if (!settings) - return; - - /* RGUI is a special case where update_thumbnail_image() - * toggles fullscreen thumbnails - it should therefore - * never be 'refreshed' like this */ - if(!string_is_equal(settings->arrays.menu_driver, "rgui")) - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); + menu_driver_ctl(RARCH_MENU_CTL_REFRESH_THUMBNAIL_IMAGE, NULL); } /*******************************/