Update selection on playlist changes
This commit is contained in:
parent
6298235e22
commit
0691c533b4
55
nncmpp.c
55
nncmpp.c
|
@ -2280,6 +2280,8 @@ static void
|
||||||
current_tab_update (void)
|
current_tab_update (void)
|
||||||
{
|
{
|
||||||
g_current_tab.item_count = g.playlist.len;
|
g_current_tab.item_count = g.playlist.len;
|
||||||
|
g_current_tab.item_mark =
|
||||||
|
MIN ((int) g.playlist.len - 1, g_current_tab.item_mark);
|
||||||
app_invalidate ();
|
app_invalidate ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3364,7 +3366,7 @@ mpd_update_playback_state (void)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mpd_process_info (const struct strv *data)
|
mpd_process_info_data (const struct strv *data)
|
||||||
{
|
{
|
||||||
struct str_map *map = &g.playback_info;
|
struct str_map *map = &g.playback_info;
|
||||||
|
|
||||||
|
@ -3398,6 +3400,57 @@ mpd_process_info (const struct strv *data)
|
||||||
str_map_free (&item);
|
str_map_free (&item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Find a song by its id in the current playlist. Expensive, rarely called.
|
||||||
|
static ssize_t
|
||||||
|
mpd_find_pos_of_id (const char *desired_id)
|
||||||
|
{
|
||||||
|
compact_map_t map;
|
||||||
|
const char *id;
|
||||||
|
for (size_t i = 0; i < g.playlist.len; i++)
|
||||||
|
{
|
||||||
|
if ((map = item_list_get (&g.playlist, i))
|
||||||
|
&& (id = compact_map_find (map, "id"))
|
||||||
|
&& !strcmp (id, desired_id))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
mpd_id_of_pos (int pos)
|
||||||
|
{
|
||||||
|
compact_map_t map = item_list_get (&g.playlist, pos);
|
||||||
|
return map ? compact_map_find (map, "id") : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mpd_process_info (const struct strv *data)
|
||||||
|
{
|
||||||
|
int *selected = &g_current_tab.item_selected;
|
||||||
|
int *marked = &g_current_tab.item_mark;
|
||||||
|
char *prev_sel_id = mpd_id_of_pos (*selected);
|
||||||
|
char *prev_mark_id = mpd_id_of_pos (*marked);
|
||||||
|
if (prev_sel_id) prev_sel_id = xstrdup (prev_sel_id);
|
||||||
|
if (prev_mark_id) prev_mark_id = xstrdup (prev_mark_id);
|
||||||
|
|
||||||
|
mpd_process_info_data (data);
|
||||||
|
|
||||||
|
const char *sel_id = mpd_id_of_pos (*selected);
|
||||||
|
const char *mark_id = mpd_id_of_pos (*marked);
|
||||||
|
|
||||||
|
if (prev_mark_id && (!mark_id || strcmp (prev_mark_id, mark_id)))
|
||||||
|
*marked = mpd_find_pos_of_id (prev_mark_id);
|
||||||
|
if (prev_sel_id && (!sel_id || strcmp (prev_sel_id, sel_id)))
|
||||||
|
{
|
||||||
|
if ((*selected = mpd_find_pos_of_id (prev_sel_id)) < 0)
|
||||||
|
*marked = -1;
|
||||||
|
app_move_selection (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
free (prev_sel_id);
|
||||||
|
free (prev_mark_id);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mpd_on_info_response (const struct mpd_response *response,
|
mpd_on_info_response (const struct mpd_response *response,
|
||||||
const struct strv *data, void *user_data)
|
const struct strv *data, void *user_data)
|
||||||
|
|
Loading…
Reference in New Issue