mirror of
https://github.com/libretro/RetroArch
synced 2025-04-07 13:23:32 +00:00
Add To Playlist functionality (#16386)
* This PR contains Add To Favorite functionality. It allows moving content to another playlist or to Create a new playlist with the selected content. * Update retroarch.c Fixed ISO C90 variable declaration at top of code. * Update menu_cbs_ok.c Fixed variable declaration for ISO requirement.
This commit is contained in:
parent
a54811c79b
commit
87b9d0328e
@ -269,7 +269,9 @@ enum event_command
|
|||||||
CMD_EVENT_MICROPHONE_REINIT,
|
CMD_EVENT_MICROPHONE_REINIT,
|
||||||
#endif
|
#endif
|
||||||
/* Deprecated */
|
/* Deprecated */
|
||||||
CMD_EVENT_SEND_DEBUG_INFO
|
CMD_EVENT_SEND_DEBUG_INFO,
|
||||||
|
/* Add a playlist entry to another playlist. */
|
||||||
|
CMD_EVENT_ADD_TO_PLAYLIST
|
||||||
};
|
};
|
||||||
|
|
||||||
enum cmd_source_t
|
enum cmd_source_t
|
||||||
|
@ -4,6 +4,28 @@ MSG_HASH(
|
|||||||
"switch_cpu_profile"
|
"switch_cpu_profile"
|
||||||
)
|
)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_ADD_TO_PLAYLIST,
|
||||||
|
"playlist_add"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_DEFERRED_ADD_TO_PLAYLIST_LIST,
|
||||||
|
"deferred_add_to_playlist_list"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_ADD_ENTRY_TO_PLAYLIST,
|
||||||
|
"add_entry_to_playlist"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MSG_ADDED_TO_PLAYLIST,
|
||||||
|
"Added to playlist"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MSG_ADD_TO_PLAYLIST_FAILED,
|
||||||
|
"Failed to add to playlist: playlist full"
|
||||||
|
)
|
||||||
|
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_ACCOUNTS_CHEEVOS_USERNAME,
|
MENU_ENUM_LABEL_ACCOUNTS_CHEEVOS_USERNAME,
|
||||||
"accounts_cheevos_username"
|
"accounts_cheevos_username"
|
||||||
|
@ -6658,6 +6658,24 @@ MSG_HASH(
|
|||||||
MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES,
|
MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES,
|
||||||
"Show the 'Add to Favorites' option."
|
"Show the 'Add to Favorites' option."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_ADD_TO_PLAYLIST,
|
||||||
|
"Add to Playlist"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_SUBLABEL_ADD_TO_PLAYLIST,
|
||||||
|
"Add the content to a playlist."
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_CREATE_NEW_PLAYLIST,
|
||||||
|
"Create New Playlist"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_SUBLABEL_CREATE_NEW_PLAYLIST,
|
||||||
|
"Create a new playlist and add the current entry to it."
|
||||||
|
)
|
||||||
|
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION,
|
MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION,
|
||||||
"Show 'Set Core Association'"
|
"Show 'Set Core Association'"
|
||||||
|
@ -672,6 +672,7 @@ GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_input_select_physi
|
|||||||
#ifdef HAVE_NETWORKING
|
#ifdef HAVE_NETWORKING
|
||||||
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_netplay_mitm_server, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_NETPLAY_MITM_SERVER)
|
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_netplay_mitm_server, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_NETPLAY_MITM_SERVER)
|
||||||
#endif
|
#endif
|
||||||
|
GENERIC_DEFERRED_PUSH(deferred_push_add_to_playlist_list, DISPLAYLIST_ADD_TO_PLAYLIST_LIST)
|
||||||
|
|
||||||
static int menu_cbs_init_bind_deferred_push_compare_label(
|
static int menu_cbs_init_bind_deferred_push_compare_label(
|
||||||
menu_file_list_cbs_t *cbs,
|
menu_file_list_cbs_t *cbs,
|
||||||
@ -933,6 +934,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
|
|||||||
#ifdef HAVE_NETWORKING
|
#ifdef HAVE_NETWORKING
|
||||||
{MENU_ENUM_LABEL_DEFERRED_LAKKA_LIST, deferred_push_lakka_list},
|
{MENU_ENUM_LABEL_DEFERRED_LAKKA_LIST, deferred_push_lakka_list},
|
||||||
#endif
|
#endif
|
||||||
|
{MENU_ENUM_LABEL_DEFERRED_ADD_TO_PLAYLIST_LIST, deferred_push_add_to_playlist_list},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!string_is_equal(label, "null"))
|
if (!string_is_equal(label, "null"))
|
||||||
@ -1394,6 +1396,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
|
|||||||
case MENU_ENUM_LABEL_SIDELOAD_CORE_LIST:
|
case MENU_ENUM_LABEL_SIDELOAD_CORE_LIST:
|
||||||
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_file_browser_select_sideload_core);
|
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_file_browser_select_sideload_core);
|
||||||
break;
|
break;
|
||||||
|
case MENU_ENUM_LABEL_DEFERRED_ADD_TO_PLAYLIST_LIST:
|
||||||
|
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_add_to_playlist_list);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -123,6 +123,9 @@ int menu_cbs_init_bind_label(menu_file_list_cbs_t *cbs,
|
|||||||
case MENU_ENUM_LABEL_PLAYLIST_MANAGER_SETTINGS:
|
case MENU_ENUM_LABEL_PLAYLIST_MANAGER_SETTINGS:
|
||||||
BIND_ACTION_LABEL(cbs, action_bind_label_playlist_collection_entry);
|
BIND_ACTION_LABEL(cbs, action_bind_label_playlist_collection_entry);
|
||||||
break;
|
break;
|
||||||
|
case MENU_ENUM_LABEL_CONTENT_SETTINGS:
|
||||||
|
BIND_ACTION_LABEL(cbs, action_bind_label_playlist_collection_entry);
|
||||||
|
break;
|
||||||
case MENU_ENUM_LABEL_CHEAT_BROWSE_MEMORY:
|
case MENU_ENUM_LABEL_CHEAT_BROWSE_MEMORY:
|
||||||
#ifdef HAVE_CHEATS
|
#ifdef HAVE_CHEATS
|
||||||
BIND_ACTION_LABEL(cbs, action_bind_label_cheat_browse_address);
|
BIND_ACTION_LABEL(cbs, action_bind_label_cheat_browse_address);
|
||||||
|
@ -543,6 +543,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl)
|
|||||||
return MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST;
|
return MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST;
|
||||||
case ACTION_OK_DL_REMAP_FILE_MANAGER_LIST:
|
case ACTION_OK_DL_REMAP_FILE_MANAGER_LIST:
|
||||||
return MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST;
|
return MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST;
|
||||||
|
case ACTION_OK_DL_ADD_TO_PLAYLIST:
|
||||||
|
return MENU_ENUM_LABEL_DEFERRED_ADD_TO_PLAYLIST_LIST;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1779,6 +1781,7 @@ int generic_action_ok_displaylist_push(
|
|||||||
#endif
|
#endif
|
||||||
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
|
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
|
||||||
case ACTION_OK_DL_REMAP_FILE_MANAGER_LIST:
|
case ACTION_OK_DL_REMAP_FILE_MANAGER_LIST:
|
||||||
|
case ACTION_OK_DL_ADD_TO_PLAYLIST:
|
||||||
ACTION_OK_DL_LBL(action_ok_dl_to_enum(action_type), DISPLAYLIST_GENERIC);
|
ACTION_OK_DL_LBL(action_ok_dl_to_enum(action_type), DISPLAYLIST_GENERIC);
|
||||||
break;
|
break;
|
||||||
case ACTION_OK_DL_CDROM_INFO_DETAIL_LIST:
|
case ACTION_OK_DL_CDROM_INFO_DETAIL_LIST:
|
||||||
@ -5769,6 +5772,181 @@ static int action_ok_add_to_favorites(const char *path,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int action_ok_add_entry_to_playlist(const char *path,
|
||||||
|
const char *label, unsigned type, size_t idx, size_t entry_idx)
|
||||||
|
{
|
||||||
|
playlist_t *playlist_curr = playlist_get_cached();
|
||||||
|
const struct playlist_entry *entry = NULL;
|
||||||
|
menu_handle_t *menu = menu_state_get_ptr()->driver_data;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!playlist_curr)
|
||||||
|
return 0;
|
||||||
|
if (!menu)
|
||||||
|
return -1;
|
||||||
|
if(!label)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* path = menu entry select. use this to identify the menu item to add the content to
|
||||||
|
* entry->path = The file path of the currently selected content
|
||||||
|
* [INFO] [playlist] = Add to Favorites
|
||||||
|
* [INFO] [content_path] = C:\roms\Arcade - Mame 2003 Plus\aburner2.zip
|
||||||
|
*/
|
||||||
|
/* Read current playlist parameters */
|
||||||
|
playlist_get_index(playlist_curr, menu->rpl_entry_selection_ptr, &entry);
|
||||||
|
|
||||||
|
/* Error checking
|
||||||
|
* > If content path is empty, cannot do anything... */
|
||||||
|
if (!string_is_empty(entry->path))
|
||||||
|
{
|
||||||
|
union string_list_elem_attr attr;
|
||||||
|
char core_display_name[PATH_MAX_LENGTH];
|
||||||
|
char core_path[PATH_MAX_LENGTH];
|
||||||
|
char core_name[PATH_MAX_LENGTH];
|
||||||
|
struct string_list
|
||||||
|
*str_list = NULL;
|
||||||
|
|
||||||
|
core_display_name[0] = '\0';
|
||||||
|
core_path[0] = '\0';
|
||||||
|
core_name[0] = '\0';
|
||||||
|
|
||||||
|
/* Create string list container for playlist parameters */
|
||||||
|
attr.i = 0;
|
||||||
|
if (!(str_list = string_list_new()))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Copy playlist parameters into string list
|
||||||
|
* [0]: content_path
|
||||||
|
* [1]: content_label
|
||||||
|
* [2]: core_path
|
||||||
|
* [3]: core_name
|
||||||
|
* [4]: crc32
|
||||||
|
* [5]: db_name
|
||||||
|
* [6]: playlist*/
|
||||||
|
|
||||||
|
/* > content_path */
|
||||||
|
string_list_append(str_list, entry->path, attr);
|
||||||
|
|
||||||
|
/* > content_label */
|
||||||
|
if (!string_is_empty(entry->label))
|
||||||
|
string_list_append(str_list, entry->label, attr);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Label is empty - use file name instead */
|
||||||
|
char fallback_content_label[PATH_MAX_LENGTH];
|
||||||
|
fallback_content_label[0] = '\0';
|
||||||
|
fill_pathname(fallback_content_label,
|
||||||
|
path_basename(entry->path), "",
|
||||||
|
sizeof(fallback_content_label));
|
||||||
|
string_list_append(str_list, fallback_content_label, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace "DETECT" with default_core_path + name if available */
|
||||||
|
if ( !string_is_empty(entry->core_path)
|
||||||
|
&& !string_is_empty(entry->core_name))
|
||||||
|
{
|
||||||
|
if ( string_is_equal(entry->core_path, FILE_PATH_DETECT)
|
||||||
|
&& string_is_equal(entry->core_name, FILE_PATH_DETECT))
|
||||||
|
{
|
||||||
|
const char *default_core_path = playlist_get_default_core_path(playlist_curr);
|
||||||
|
const char *default_core_name = playlist_get_default_core_name(playlist_curr);
|
||||||
|
|
||||||
|
if ( !string_is_empty(default_core_path)
|
||||||
|
&& !string_is_empty(default_core_name))
|
||||||
|
{
|
||||||
|
strlcpy(core_path, default_core_path, sizeof(core_path));
|
||||||
|
strlcpy(core_name, default_core_name, sizeof(core_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strlcpy(core_path, entry->core_path, sizeof(core_path));
|
||||||
|
strlcpy(core_name, entry->core_name, sizeof(core_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* > core_path + core_name */
|
||||||
|
if ( !string_is_empty(core_path)
|
||||||
|
&& !string_is_empty(core_name))
|
||||||
|
{
|
||||||
|
core_info_t *core_info = NULL;
|
||||||
|
|
||||||
|
/* >> core_path */
|
||||||
|
string_list_append(str_list, core_path, attr);
|
||||||
|
|
||||||
|
/* >> core_name
|
||||||
|
* (always use display name, if available) */
|
||||||
|
if (core_info_find(core_path, &core_info))
|
||||||
|
if (!string_is_empty(core_info->display_name))
|
||||||
|
strlcpy(core_display_name, core_info->display_name, sizeof(core_display_name));
|
||||||
|
|
||||||
|
if (!string_is_empty(core_display_name))
|
||||||
|
string_list_append(str_list, core_display_name, attr);
|
||||||
|
else
|
||||||
|
string_list_append(str_list, core_name, attr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string_list_append(str_list, FILE_PATH_DETECT, attr);
|
||||||
|
string_list_append(str_list, FILE_PATH_DETECT, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* crc32 */
|
||||||
|
string_list_append(str_list, !string_is_empty(entry->crc32) ? entry->crc32 : "", attr);
|
||||||
|
|
||||||
|
/* db_name */
|
||||||
|
string_list_append(str_list, !string_is_empty(entry->db_name) ? entry->db_name : "", attr);
|
||||||
|
|
||||||
|
/* db_name */
|
||||||
|
string_list_append(str_list, label, attr);
|
||||||
|
|
||||||
|
|
||||||
|
/* Trigger 'ADD_TO_FAVORITES' event */
|
||||||
|
if (!command_event(CMD_EVENT_ADD_TO_PLAYLIST, (void*)str_list))
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
|
/* Clean up */
|
||||||
|
string_list_free(str_list);
|
||||||
|
str_list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void action_input_add_entry_to_new_playlist(void *userdata, const char *line)
|
||||||
|
{
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
size_t path_length = 0;
|
||||||
|
char path[PATH_MAX_LENGTH];
|
||||||
|
|
||||||
|
menu_input_dialog_end();
|
||||||
|
|
||||||
|
if(!line)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Create path for new file */
|
||||||
|
path_length = fill_pathname_join_special(path, settings->paths.directory_playlist, line, sizeof(path));
|
||||||
|
strlcat(path, ".lpl", sizeof(path) - path_length);
|
||||||
|
|
||||||
|
action_ok_add_entry_to_playlist(NULL, path, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int action_ok_add_entry_to_new_playlist(const char *path,
|
||||||
|
const char *label, unsigned type, size_t idx, size_t entry_idx)
|
||||||
|
{
|
||||||
|
menu_input_ctx_line_t line;
|
||||||
|
line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CREATE_NEW_PLAYLIST);
|
||||||
|
line.label_setting = NULL;
|
||||||
|
line.type = 0;
|
||||||
|
line.idx = 0;
|
||||||
|
line.cb = action_input_add_entry_to_new_playlist;
|
||||||
|
menu_input_dialog_start(&line);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* This function is called when selecting 'add to favorites'
|
/* This function is called when selecting 'add to favorites'
|
||||||
* while viewing a playlist entry */
|
* while viewing a playlist entry */
|
||||||
static int action_ok_add_to_favorites_playlist(const char *path,
|
static int action_ok_add_to_favorites_playlist(const char *path,
|
||||||
@ -6194,6 +6372,7 @@ STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_core_option_override_list, ACTION_O
|
|||||||
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_remap_file_manager_list, ACTION_OK_DL_REMAP_FILE_MANAGER_LIST)
|
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_remap_file_manager_list, ACTION_OK_DL_REMAP_FILE_MANAGER_LIST)
|
||||||
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_savestate_list, ACTION_OK_DL_SAVESTATE_LIST)
|
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_savestate_list, ACTION_OK_DL_SAVESTATE_LIST)
|
||||||
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_core_options_list, ACTION_OK_DL_CORE_OPTIONS_LIST)
|
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_core_options_list, ACTION_OK_DL_CORE_OPTIONS_LIST)
|
||||||
|
STATIC_DEFAULT_ACTION_OK_FUNC(action_ok_push_add_to_playlist_list, ACTION_OK_DL_ADD_TO_PLAYLIST)
|
||||||
DEFAULT_ACTION_OK_FUNC(action_ok_push_playlist_manager_settings, ACTION_OK_DL_PLAYLIST_MANAGER_SETTINGS)
|
DEFAULT_ACTION_OK_FUNC(action_ok_push_playlist_manager_settings, ACTION_OK_DL_PLAYLIST_MANAGER_SETTINGS)
|
||||||
#ifdef HAVE_CHEEVOS
|
#ifdef HAVE_CHEEVOS
|
||||||
DEFAULT_ACTION_OK_FUNC(action_ok_push_achievements_hardcore_pause_list, ACTION_OK_DL_ACHIEVEMENTS_HARDCORE_PAUSE_LIST)
|
DEFAULT_ACTION_OK_FUNC(action_ok_push_achievements_hardcore_pause_list, ACTION_OK_DL_ACHIEVEMENTS_HARDCORE_PAUSE_LIST)
|
||||||
@ -8536,9 +8715,12 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
|
|||||||
{MENU_ENUM_LABEL_HALT_REPLAY, action_ok_halt_replay},
|
{MENU_ENUM_LABEL_HALT_REPLAY, action_ok_halt_replay},
|
||||||
{MENU_ENUM_LABEL_RESUME_CONTENT, action_ok_resume_content},
|
{MENU_ENUM_LABEL_RESUME_CONTENT, action_ok_resume_content},
|
||||||
{MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, action_ok_add_to_favorites_playlist},
|
{MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, action_ok_add_to_favorites_playlist},
|
||||||
|
{MENU_ENUM_LABEL_ADD_ENTRY_TO_PLAYLIST, action_ok_add_entry_to_playlist},
|
||||||
|
{MENU_ENUM_LABEL_CREATE_NEW_PLAYLIST, action_ok_add_entry_to_new_playlist},
|
||||||
{MENU_ENUM_LABEL_SET_CORE_ASSOCIATION, action_ok_set_core_association},
|
{MENU_ENUM_LABEL_SET_CORE_ASSOCIATION, action_ok_set_core_association},
|
||||||
{MENU_ENUM_LABEL_RESET_CORE_ASSOCIATION, action_ok_reset_core_association},
|
{MENU_ENUM_LABEL_RESET_CORE_ASSOCIATION, action_ok_reset_core_association},
|
||||||
{MENU_ENUM_LABEL_ADD_TO_FAVORITES, action_ok_add_to_favorites},
|
{MENU_ENUM_LABEL_ADD_TO_FAVORITES, action_ok_add_to_favorites},
|
||||||
|
{MENU_ENUM_LABEL_ADD_TO_PLAYLIST, action_ok_push_add_to_playlist_list},
|
||||||
{MENU_ENUM_LABEL_RESTART_CONTENT, action_ok_restart_content},
|
{MENU_ENUM_LABEL_RESTART_CONTENT, action_ok_restart_content},
|
||||||
{MENU_ENUM_LABEL_TAKE_SCREENSHOT, action_ok_screenshot},
|
{MENU_ENUM_LABEL_TAKE_SCREENSHOT, action_ok_screenshot},
|
||||||
{MENU_ENUM_LABEL_RENAME_ENTRY, action_ok_rename_entry},
|
{MENU_ENUM_LABEL_RENAME_ENTRY, action_ok_rename_entry},
|
||||||
|
@ -246,7 +246,8 @@ enum
|
|||||||
ACTION_OK_DL_SAVESTATE_LIST,
|
ACTION_OK_DL_SAVESTATE_LIST,
|
||||||
ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST,
|
ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST,
|
||||||
ACTION_OK_DL_CORE_OPTIONS_LIST,
|
ACTION_OK_DL_CORE_OPTIONS_LIST,
|
||||||
ACTION_OK_DL_REMAP_FILE_MANAGER_LIST
|
ACTION_OK_DL_REMAP_FILE_MANAGER_LIST,
|
||||||
|
ACTION_OK_DL_ADD_TO_PLAYLIST
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function callbacks */
|
/* Function callbacks */
|
||||||
|
@ -3720,6 +3720,13 @@ static int menu_displaylist_parse_load_content_settings(
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( menu_entries_append(list,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_PLAYLIST),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_PLAYLIST),
|
||||||
|
MENU_ENUM_LABEL_ADD_TO_PLAYLIST,
|
||||||
|
MENU_SETTING_ACTION, 0, 0, NULL))
|
||||||
|
count++;
|
||||||
|
|
||||||
if (!settings->bools.kiosk_mode_enable)
|
if (!settings->bools.kiosk_mode_enable)
|
||||||
{
|
{
|
||||||
if (settings->bools.menu_show_overlays)
|
if (settings->bools.menu_show_overlays)
|
||||||
@ -3971,6 +3978,12 @@ static int menu_displaylist_parse_horizontal_content_actions(
|
|||||||
MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, FILE_TYPE_PLAYLIST_ENTRY, 0, 0, NULL);
|
MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, FILE_TYPE_PLAYLIST_ENTRY, 0, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is to add to playlist */
|
||||||
|
menu_entries_append(list,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_PLAYLIST),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_PLAYLIST),
|
||||||
|
MENU_ENUM_LABEL_ADD_TO_PLAYLIST,
|
||||||
|
MENU_SETTING_ACTION, 0, 0, NULL);
|
||||||
if (!settings->bools.kiosk_mode_enable)
|
if (!settings->bools.kiosk_mode_enable)
|
||||||
{
|
{
|
||||||
if (settings->bools.quick_menu_show_set_core_association)
|
if (settings->bools.quick_menu_show_set_core_association)
|
||||||
@ -4507,6 +4520,77 @@ static unsigned menu_displaylist_parse_cores(
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned menu_displaylist_parse_add_to_playlist_list(
|
||||||
|
file_list_t *list, settings_t *settings)
|
||||||
|
{
|
||||||
|
unsigned count = 0;
|
||||||
|
const char *dir_playlist = settings->paths.directory_playlist;
|
||||||
|
bool show_hidden_files = settings->bools.show_hidden_files;
|
||||||
|
char playlist_display_name[PATH_MAX_LENGTH];
|
||||||
|
struct string_list *str_list = dir_list_new_special(
|
||||||
|
dir_playlist, DIR_LIST_COLLECTIONS, NULL, show_hidden_files);
|
||||||
|
|
||||||
|
if (str_list && str_list->size)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
dir_list_sort(str_list, true);
|
||||||
|
|
||||||
|
for (i = 0; i < str_list->size; i++)
|
||||||
|
{
|
||||||
|
const char *path = str_list->elems[i].data;
|
||||||
|
const char *playlist_file = NULL;
|
||||||
|
|
||||||
|
if (str_list->elems[i].attr.i == FILE_TYPE_DIRECTORY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (string_is_empty(path))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
playlist_file = path_basename_nocompression(path);
|
||||||
|
|
||||||
|
if (string_is_empty(playlist_file))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Ignore non-playlist files */
|
||||||
|
if (!string_is_equal_noncase(path_get_extension(playlist_file),
|
||||||
|
"lpl"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Ignore history/favourites
|
||||||
|
* > content_history + favorites are handled separately
|
||||||
|
* > music/video/image_history are ignored */
|
||||||
|
if ( string_ends_with_size(path, "_history.lpl", strlen(path), STRLEN_CONST("_history.lpl"))
|
||||||
|
|| string_is_equal(playlist_file, FILE_PATH_CONTENT_FAVORITES))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
strlcpy(playlist_display_name, playlist_file, sizeof(playlist_display_name));
|
||||||
|
path_remove_extension(playlist_display_name);
|
||||||
|
|
||||||
|
menu_entries_append(list, playlist_display_name, path,
|
||||||
|
MENU_ENUM_LABEL_ADD_ENTRY_TO_PLAYLIST,
|
||||||
|
MENU_SETTING_ACTION, 0, 0, NULL);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not necessary to check for NULL here */
|
||||||
|
string_list_free(str_list);
|
||||||
|
|
||||||
|
/* Add favourites */
|
||||||
|
if (
|
||||||
|
settings->bools.quick_menu_show_add_to_favorites
|
||||||
|
&& settings->bools.menu_content_show_favorites
|
||||||
|
&& menu_entries_append(list,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_FAVORITES),
|
||||||
|
MENU_ENUM_LABEL_ADD_TO_FAVORITES, FILE_TYPE_PLAYLIST_ENTRY, 0, 0, NULL)
|
||||||
|
)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned menu_displaylist_parse_playlist_manager_list(
|
static unsigned menu_displaylist_parse_playlist_manager_list(
|
||||||
file_list_t *list, settings_t *settings)
|
file_list_t *list, settings_t *settings)
|
||||||
{
|
{
|
||||||
@ -13762,6 +13846,27 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
menu_entries_clear(info->list);
|
menu_entries_clear(info->list);
|
||||||
count = menu_displaylist_parse_playlist_manager_list(info->list, settings);
|
count = menu_displaylist_parse_playlist_manager_list(info->list, settings);
|
||||||
|
|
||||||
|
if (count == 0)
|
||||||
|
menu_entries_append(info->list,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY),
|
||||||
|
MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY,
|
||||||
|
FILE_TYPE_NONE, 0, 0, NULL);
|
||||||
|
|
||||||
|
info->flags |= MD_FLAG_NEED_PUSH;
|
||||||
|
break;
|
||||||
|
case DISPLAYLIST_ADD_TO_PLAYLIST_LIST:
|
||||||
|
menu_entries_clear(info->list);
|
||||||
|
|
||||||
|
/* add new list button here */
|
||||||
|
menu_entries_append(info->list,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CREATE_NEW_PLAYLIST),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_CREATE_NEW_PLAYLIST),
|
||||||
|
MENU_ENUM_LABEL_CREATE_NEW_PLAYLIST,
|
||||||
|
MENU_SETTING_ACTION, 0, 0, NULL);
|
||||||
|
|
||||||
|
count = menu_displaylist_parse_add_to_playlist_list(info->list, settings);
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
menu_entries_append(info->list,
|
menu_entries_append(info->list,
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY),
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY),
|
||||||
|
@ -251,6 +251,7 @@ enum menu_displaylist_ctl_state
|
|||||||
DISPLAYLIST_RECORDING_SETTINGS_LIST,
|
DISPLAYLIST_RECORDING_SETTINGS_LIST,
|
||||||
DISPLAYLIST_PLAYLIST_SETTINGS_LIST,
|
DISPLAYLIST_PLAYLIST_SETTINGS_LIST,
|
||||||
DISPLAYLIST_PLAYLIST_MANAGER_LIST,
|
DISPLAYLIST_PLAYLIST_MANAGER_LIST,
|
||||||
|
DISPLAYLIST_ADD_TO_PLAYLIST_LIST,
|
||||||
DISPLAYLIST_PLAYLIST_MANAGER_SETTINGS,
|
DISPLAYLIST_PLAYLIST_MANAGER_SETTINGS,
|
||||||
DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST,
|
DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST,
|
||||||
DISPLAYLIST_ACCOUNTS_YOUTUBE_LIST,
|
DISPLAYLIST_ACCOUNTS_YOUTUBE_LIST,
|
||||||
|
@ -581,6 +581,14 @@ enum msg_hash_enums
|
|||||||
MSG_IOS_TOUCH_MOUSE_ENABLED,
|
MSG_IOS_TOUCH_MOUSE_ENABLED,
|
||||||
MSG_IOS_TOUCH_MOUSE_DISABLED,
|
MSG_IOS_TOUCH_MOUSE_DISABLED,
|
||||||
|
|
||||||
|
/* Add To Playlist*/
|
||||||
|
MSG_ADDED_TO_PLAYLIST,
|
||||||
|
MSG_ADD_TO_PLAYLIST_FAILED,
|
||||||
|
MENU_ENUM_LABEL_ADD_ENTRY_TO_PLAYLIST,
|
||||||
|
MENU_ENUM_LABEL_DEFERRED_ADD_TO_PLAYLIST_LIST,
|
||||||
|
MENU_LABEL(ADD_TO_PLAYLIST),
|
||||||
|
MENU_LABEL(CREATE_NEW_PLAYLIST),
|
||||||
|
|
||||||
MENU_LABEL(MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT),
|
MENU_LABEL(MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT),
|
||||||
MENU_LABEL(MENU_XMB_ANIMATION_MOVE_UP_DOWN),
|
MENU_LABEL(MENU_XMB_ANIMATION_MOVE_UP_DOWN),
|
||||||
MENU_LABEL(MENU_XMB_ANIMATION_OPENING_MAIN_MENU),
|
MENU_LABEL(MENU_XMB_ANIMATION_OPENING_MAIN_MENU),
|
||||||
|
70
retroarch.c
70
retroarch.c
@ -4445,6 +4445,76 @@ bool command_event(enum event_command cmd, void *data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CMD_EVENT_ADD_TO_PLAYLIST:
|
||||||
|
{
|
||||||
|
struct string_list *str_list = (struct string_list*)data;
|
||||||
|
struct menu_state *menu_st = menu_state_get_ptr();
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
|
if (str_list)
|
||||||
|
{
|
||||||
|
if (str_list->size >= 7)
|
||||||
|
{
|
||||||
|
playlist_config_t playlist_config;
|
||||||
|
playlist_t * playlist;
|
||||||
|
|
||||||
|
struct playlist_entry entry = {0};
|
||||||
|
bool playlist_sort_alphabetical = settings->bools.playlist_sort_alphabetical;
|
||||||
|
|
||||||
|
entry.path = str_list->elems[0].data; /* content_path */
|
||||||
|
entry.label = str_list->elems[1].data; /* content_label */
|
||||||
|
entry.core_path = str_list->elems[2].data; /* core_path */
|
||||||
|
entry.core_name = str_list->elems[3].data; /* core_name */
|
||||||
|
entry.crc32 = str_list->elems[4].data; /* crc32 */
|
||||||
|
entry.db_name = str_list->elems[5].data; /* db_name */
|
||||||
|
|
||||||
|
/* load the playlist */
|
||||||
|
playlist_config.capacity = COLLECTION_SIZE;
|
||||||
|
playlist_config.old_format = settings->bools.playlist_use_old_format;
|
||||||
|
playlist_config.compress = settings->bools.playlist_compression;
|
||||||
|
playlist_config.fuzzy_archive_match = settings->bools.playlist_fuzzy_archive_match;
|
||||||
|
playlist_config_set_base_content_directory(&playlist_config,
|
||||||
|
settings->bools.playlist_portable_paths
|
||||||
|
? settings->paths.directory_menu_content
|
||||||
|
: NULL);
|
||||||
|
playlist_config_set_path(&playlist_config, str_list->elems[6].data);
|
||||||
|
playlist = playlist_init(&playlist_config);
|
||||||
|
|
||||||
|
/* Check whether favourties playlist is at capacity */
|
||||||
|
if (playlist_size(playlist) >=
|
||||||
|
playlist_capacity(playlist))
|
||||||
|
{
|
||||||
|
runloop_msg_queue_push(
|
||||||
|
msg_hash_to_str(MSG_ADD_TO_PLAYLIST_FAILED), 1, 180, true, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_ERROR);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write playlist entry */
|
||||||
|
if (playlist_push(playlist, &entry))
|
||||||
|
{
|
||||||
|
enum playlist_sort_mode current_sort_mode =
|
||||||
|
playlist_get_sort_mode(playlist);
|
||||||
|
|
||||||
|
/* New addition - need to resort if option is enabled */
|
||||||
|
if ( (playlist_sort_alphabetical
|
||||||
|
&& (current_sort_mode == PLAYLIST_SORT_MODE_DEFAULT))
|
||||||
|
|| (current_sort_mode == PLAYLIST_SORT_MODE_ALPHABETICAL))
|
||||||
|
playlist_qsort(playlist);
|
||||||
|
|
||||||
|
playlist_write_file(playlist);
|
||||||
|
runloop_msg_queue_push(
|
||||||
|
msg_hash_to_str(MSG_ADDED_TO_PLAYLIST), 1, 180, true, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
}
|
||||||
|
menu_st->flags |= MENU_ST_FLAG_ENTRIES_NEED_REFRESH;
|
||||||
|
if (menu_st->driver_ctx->environ_cb)
|
||||||
|
menu_st->driver_ctx->environ_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST,
|
||||||
|
NULL, menu_st->userdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CMD_EVENT_RESET_CORE_ASSOCIATION:
|
case CMD_EVENT_RESET_CORE_ASSOCIATION:
|
||||||
{
|
{
|
||||||
const char *core_name = "DETECT";
|
const char *core_name = "DETECT";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user