Show playlist length time
Now we look distinctly Sonata-like.
This commit is contained in:
parent
0541b7e179
commit
b050113eed
67
nncmpp.c
67
nncmpp.c
|
@ -612,6 +612,7 @@ static struct app_context
|
|||
|
||||
struct item_list playlist; ///< Current playlist
|
||||
uint32_t playlist_version; ///< Playlist version
|
||||
int playlist_time; ///< Play time in seconds
|
||||
|
||||
// Data:
|
||||
|
||||
|
@ -1289,21 +1290,45 @@ app_draw_view (void)
|
|||
app_draw_scrollbar ();
|
||||
}
|
||||
|
||||
static void
|
||||
app_write_mpd_status_playlist (struct row_buffer *buf)
|
||||
{
|
||||
struct str stats;
|
||||
str_init (&stats);
|
||||
|
||||
if (g.playlist.len == 1)
|
||||
str_append_printf (&stats, "1 song ");
|
||||
else
|
||||
str_append_printf (&stats, "%zu songs ", g.playlist.len);
|
||||
|
||||
int hours = g.playlist_time / 3600;
|
||||
int minutes = g.playlist_time % 3600 / 60;
|
||||
if (hours || minutes)
|
||||
{
|
||||
str_append_c (&stats, ' ');
|
||||
|
||||
if (hours == 1)
|
||||
str_append_printf (&stats, " 1 hour");
|
||||
else if (hours)
|
||||
str_append_printf (&stats, " %d hours", hours);
|
||||
|
||||
if (minutes == 1)
|
||||
str_append_printf (&stats, " 1 minute");
|
||||
else if (minutes)
|
||||
str_append_printf (&stats, " %d minutes", minutes);
|
||||
}
|
||||
row_buffer_append (buf, stats.str, APP_ATTR (NORMAL));
|
||||
str_free (&stats);
|
||||
}
|
||||
|
||||
static void
|
||||
app_write_mpd_status (struct row_buffer *buf)
|
||||
{
|
||||
struct str_map *map = &g.playback_info;
|
||||
|
||||
// TODO: "N hours N minutes" ("stats" -> "playtime" or count in code)
|
||||
char *stats;
|
||||
if (str_map_find (map, "updating_db"))
|
||||
stats = xstrdup ("Updating database...");
|
||||
else if (g.playlist.len == 1)
|
||||
stats = xstrdup_printf ("%zu song", g.playlist.len);
|
||||
row_buffer_append (buf, "Updating database...", APP_ATTR (NORMAL));
|
||||
else
|
||||
stats = xstrdup_printf ("%zu songs", g.playlist.len);
|
||||
row_buffer_append (buf, stats, APP_ATTR (NORMAL));
|
||||
free (stats);
|
||||
app_write_mpd_status_playlist (buf);
|
||||
|
||||
struct row_buffer right;
|
||||
row_buffer_init (&right);
|
||||
|
@ -2733,11 +2758,28 @@ mpd_read_time (const char *value, int *sec, int *optional_msec)
|
|||
*sec = MIN (INT_MAX, n);
|
||||
}
|
||||
|
||||
static void
|
||||
mpd_update_playlist_time (void)
|
||||
{
|
||||
g.playlist_time = 0;
|
||||
|
||||
// It would also be possible to retrieve this from "stats" -> "playtime"
|
||||
unsigned long n;
|
||||
for (size_t i = 0; i < g.playlist.len; i++)
|
||||
{
|
||||
compact_map_t map = item_list_get (&g.playlist, i);
|
||||
const char *time = compact_map_find (map, "time");
|
||||
if (time && xstrtoul (&n, time, 10))
|
||||
g.playlist_time += n;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mpd_update_playback_state (void)
|
||||
{
|
||||
struct str_map *map = &g.playback_info;
|
||||
g.song_elapsed = g.song_duration = g.volume = g.song = -1;
|
||||
uint32_t last_playlist_version = g.playlist_version;
|
||||
g.playlist_version = 0;
|
||||
|
||||
const char *state;
|
||||
|
@ -2784,6 +2826,9 @@ mpd_update_playback_state (void)
|
|||
if (xstrtoul_map (map, "playlist", &n)) g.playlist_version = n;
|
||||
if (xstrtoul_map (map, "song", &n)) g.song = n;
|
||||
|
||||
if (g.playlist_version != last_playlist_version)
|
||||
mpd_update_playlist_time ();
|
||||
|
||||
app_invalidate ();
|
||||
}
|
||||
|
||||
|
@ -2949,10 +2994,10 @@ mpd_on_failure (void *user_data)
|
|||
print_debug ("connection to MPD failed");
|
||||
mpd_queue_reconnect ();
|
||||
|
||||
item_list_resize (&g.playlist, 0);
|
||||
str_map_clear (&g.playback_info);
|
||||
mpd_update_playback_state ();
|
||||
item_list_resize (&g.playlist, 0);
|
||||
|
||||
mpd_update_playback_state ();
|
||||
current_tab_update ();
|
||||
info_tab_update ();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue