Make playlist sorting optional and consistent

This commit is contained in:
jdgleaver 2019-02-18 15:09:19 +00:00
parent 905f67810c
commit e96b872693
9 changed files with 139 additions and 58 deletions

View File

@ -704,6 +704,9 @@ static const uint16_t network_remote_base_port = 55400;
/* Number of entries that will be kept in content history playlist file. */
static const unsigned default_content_history_size = 100;
/* Sort all playlists (apart from histories) alphabetically */
static const bool playlist_sort_alphabetical = true;
/* File format to use when writing playlists to disk */
static const bool playlist_use_old_format = false;

View File

@ -1576,6 +1576,8 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("playlist_use_old_format", &settings->bools.playlist_use_old_format, true, playlist_use_old_format, false);
SETTING_BOOL("content_runtime_log", &settings->bools.content_runtime_log, true, content_runtime_log, false);
SETTING_BOOL("playlist_sort_alphabetical", &settings->bools.playlist_sort_alphabetical, true, playlist_sort_alphabetical, false);
*size = count;
return tmp;

View File

@ -310,6 +310,7 @@ typedef struct settings
bool content_runtime_log;
bool playlist_show_core_name;
bool playlist_sort_alphabetical;
} bools;
struct

View File

@ -1785,3 +1785,5 @@ MSG_HASH(MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG,
"content_runtime_log")
MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_SHOW_CORE_NAME,
"playlist_show_core_name")
MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL,
"playlist_sort_alphabetical")

View File

@ -8238,6 +8238,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_CORE_NAME,
"Labels each playlist entry with the currently associated core (if any)."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL,
"Sort playlists alphabetically"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_PLAYLIST_SORT_ALPHABETICAL,
"Sorts content playlists in alphabetical order. Note that 'history' playlists of recently used games, images, music and videos are excluded."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MENU_SOUNDS,
"Menu Sounds"

View File

@ -521,6 +521,7 @@ default_sublabel_macro(action_bind_sublabel_menu_rgui_internal_upscale_level,
default_sublabel_macro(action_bind_sublabel_menu_ticker_type, MENU_ENUM_SUBLABEL_MENU_TICKER_TYPE)
default_sublabel_macro(action_bind_sublabel_menu_ticker_speed, MENU_ENUM_SUBLABEL_MENU_TICKER_SPEED)
default_sublabel_macro(action_bind_sublabel_playlist_show_core_name, MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_CORE_NAME)
default_sublabel_macro(action_bind_sublabel_playlist_sort_alphabetical, MENU_ENUM_SUBLABEL_PLAYLIST_SORT_ALPHABETICAL)
static int action_bind_sublabel_systeminfo_controller_entry(
file_list_t *list,
@ -2268,6 +2269,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_PLAYLIST_SHOW_CORE_NAME:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_playlist_show_core_name);
break;
case MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_playlist_sort_alphabetical);
break;
default:
case MSG_UNKNOWN:
return -1;

View File

@ -1350,10 +1350,11 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info,
if (core_name)
strlcpy(fill_buf, core_name, path_size);
/* Note: this function is never called when using RGUI,
* but if it ever were then we must ensure that thumbnail
/* Note: this condition is never met when using RGUI,
* since 'is_history' is always set to 'true'.
* But if it ever were then we must ensure that thumbnail
* updates are omitted (since this functionality is
* handled elsewhere) */
* handled elsewhere). */
if (!is_history && i == selection && !string_is_empty(label) && !string_is_equal(settings->arrays.menu_driver, "rgui"))
{
char *content_basename = strdup(label);
@ -2547,7 +2548,8 @@ static void menu_displaylist_set_new_playlist(
static int menu_displaylist_parse_horizontal_list(
menu_handle_t *menu,
menu_displaylist_info_t *info)
menu_displaylist_info_t *info,
bool sort)
{
menu_ctx_list_t list_info;
menu_ctx_list_t list_horiz_info;
@ -2582,6 +2584,8 @@ static int menu_displaylist_parse_horizontal_list(
fill_pathname_base_noext(lpl_basename, item->path, sizeof(lpl_basename));
menu_driver_set_thumbnail_system(lpl_basename, sizeof(lpl_basename));
/* Note: Redundant, since this function is never used for history lists... */
if (string_is_equal(lpl_basename, "content_history"))
is_historylist = true;
@ -2597,7 +2601,12 @@ static int menu_displaylist_parse_horizontal_list(
if (playlist)
{
playlist_qsort(playlist);
/* Note: If this function were used for history lists, then history
* lists would be sorted alphabetically. This is incorrect behaviour.
* Fortunately it never happens... */
if (sort)
playlist_qsort(playlist);
menu_displaylist_parse_playlist(info,
playlist,
msg_hash_to_str(MENU_ENUM_LABEL_COLLECTION), is_historylist);
@ -4126,6 +4135,7 @@ static void menu_displaylist_parse_playlist_generic(
menu_displaylist_info_t *info,
const char *playlist_name,
const char *playlist_path,
bool sort,
int *ret)
{
playlist_t *playlist = NULL;
@ -4135,8 +4145,13 @@ static void menu_displaylist_parse_playlist_generic(
playlist = playlist_get_cached();
if (playlist)
{
if (sort)
playlist_qsort(playlist);
*ret = menu_displaylist_parse_playlist(info,
playlist, playlist_name, true);
}
}
#ifdef HAVE_NETWORKING
@ -4759,6 +4774,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
#endif
break;
case DISPLAYLIST_PLAYLIST_COLLECTION:
/* Note: This would appear to be legacy code. Cannot find
* a single instance where this case is met... */
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
if (string_is_equal(info->path, file_path_str(FILE_PATH_CONTENT_HISTORY)))
{
@ -4796,7 +4813,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
if (playlist)
{
playlist_qsort(playlist);
if (settings->bools.playlist_sort_alphabetical)
playlist_qsort(playlist);
ret = menu_displaylist_parse_playlist(info,
playlist, path_playlist, false);
@ -4804,7 +4822,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
if (ret == 0)
{
info->need_sort = true;
info->need_sort = settings->bools.playlist_sort_alphabetical;
info->need_refresh = true;
info->need_push = true;
}
@ -4820,6 +4838,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
menu, info,
"history",
settings->paths.path_content_history,
false,
&ret);
else
{
@ -4836,31 +4855,33 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
info->need_push = true;
break;
case DISPLAYLIST_FAVORITES:
info->count = 0;
{
settings_t *settings = config_get_ptr();
info->count = 0;
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
menu_displaylist_parse_playlist_generic(menu, info,
"favorites",
settings->paths.path_content_favorites,
settings->bools.playlist_sort_alphabetical,
&ret);
}
if (info->count == 0)
{
menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_FAVORITES_AVAILABLE),
msg_hash_to_str(MENU_ENUM_LABEL_NO_FAVORITES_AVAILABLE),
MENU_ENUM_LABEL_NO_FAVORITES_AVAILABLE,
MENU_INFO_MESSAGE, 0, 0);
info->need_push_no_playlist_entries = false;
ret = 0;
}
if (info->count == 0)
{
menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_FAVORITES_AVAILABLE),
msg_hash_to_str(MENU_ENUM_LABEL_NO_FAVORITES_AVAILABLE),
MENU_ENUM_LABEL_NO_FAVORITES_AVAILABLE,
MENU_INFO_MESSAGE, 0, 0);
info->need_push_no_playlist_entries = false;
ret = 0;
}
ret = 0;
info->need_refresh = true;
info->need_push = true;
ret = 0;
info->need_sort = settings->bools.playlist_sort_alphabetical;
info->need_refresh = true;
info->need_push = true;
}
break;
case DISPLAYLIST_MUSIC_HISTORY:
{
@ -4871,6 +4892,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
menu_displaylist_parse_playlist_generic(menu, info,
"music_history",
settings->paths.path_content_music_history,
false,
&ret);
if (info->count == 0)
@ -4902,6 +4924,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
menu_displaylist_parse_playlist_generic(menu, info,
"video_history",
settings->paths.path_content_video_history,
false,
&ret);
count++;
}
@ -5264,28 +5287,38 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
info->need_push = true;
break;
case DISPLAYLIST_PLAYLIST_SETTINGS_LIST:
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_HISTORY_LIST_ENABLE,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE,
PARSE_ONLY_UINT, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_ENTRY_RENAME,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_SHOW_CORE_NAME,
PARSE_ONLY_BOOL, false);
{
settings_t *settings = config_get_ptr();
menu_displaylist_parse_playlist_associations(info);
info->need_push = true;
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_HISTORY_LIST_ENABLE,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE,
PARSE_ONLY_UINT, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_ENTRY_RENAME,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL,
PARSE_ONLY_BOOL, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT,
PARSE_ONLY_BOOL, false);
if (string_is_equal(settings->arrays.menu_driver, "rgui"))
{
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_PLAYLIST_SHOW_CORE_NAME,
PARSE_ONLY_BOOL, false);
}
menu_displaylist_parse_playlist_associations(info);
info->need_push = true;
}
break;
case DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST:
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
@ -7182,12 +7215,16 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
info->need_push = true;
break;
case DISPLAYLIST_HORIZONTAL:
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
ret = menu_displaylist_parse_horizontal_list(menu, info);
{
settings_t *settings = config_get_ptr();
info->need_sort = true;
info->need_refresh = true;
info->need_push = true;
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
ret = menu_displaylist_parse_horizontal_list(menu, info, settings->bools.playlist_sort_alphabetical);
info->need_sort = settings->bools.playlist_sort_alphabetical;
info->need_refresh = true;
info->need_push = true;
}
break;
case DISPLAYLIST_HORIZONTAL_CONTENT_ACTIONS:
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
@ -8054,16 +8091,22 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
use_filebrowser = true;
break;
case DISPLAYLIST_PLAYLIST:
menu_displaylist_parse_playlist_generic(menu, info,
path_basename(info->path),
info->path,
&ret);
ret = 0;
if (ret == 0)
{
info->need_refresh = true;
info->need_push = true;
settings_t *settings = config_get_ptr();
menu_displaylist_parse_playlist_generic(menu, info,
path_basename(info->path),
info->path,
settings->bools.playlist_sort_alphabetical,
&ret);
ret = 0; /* Why do we do this...? */
if (ret == 0)
{
info->need_sort = settings->bools.playlist_sort_alphabetical;
info->need_refresh = true;
info->need_push = true;
}
}
break;
case DISPLAYLIST_IMAGES_HISTORY:
@ -8076,6 +8119,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
menu_displaylist_parse_playlist_generic(menu, info,
"images_history",
settings->paths.path_content_image_history,
false,
&ret);
count++;
}

View File

@ -9761,6 +9761,22 @@ static bool setting_append_list(
general_read_handler,
SD_FLAG_NONE);
CONFIG_BOOL(
list, list_info,
&settings->bools.playlist_sort_alphabetical,
MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL,
MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL,
playlist_sort_alphabetical,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE
);
CONFIG_BOOL(
list, list_info,
&settings->bools.playlist_use_old_format,

View File

@ -2273,6 +2273,7 @@ enum msg_hash_enums
MENU_LABEL(CONTENT_RUNTIME_LOG),
MENU_LABEL(PLAYLIST_SHOW_CORE_NAME),
MENU_LABEL(PLAYLIST_SORT_ALPHABETICAL),
MSG_LAST
};