make playlist's stats scrollable, also display remaining time on demand

This commit is contained in:
Andrzej Rybczak
2009-02-20 15:30:30 +01:00
parent 51d4f34cf3
commit 2856d5cd78
7 changed files with 102 additions and 46 deletions

View File

@@ -104,6 +104,8 @@
# #
##### various settings ##### ##### various settings #####
# #
#playlist_show_remaining_time = "no"
#
#playlist_display_mode = "classic" (classic/columns) #playlist_display_mode = "classic" (classic/columns)
# #
#browser_display_mode = "classic" (classic/columns) #browser_display_mode = "classic" (classic/columns)

View File

@@ -206,7 +206,7 @@ int main(int argc, char *argv[])
// header stuff // header stuff
gettimeofday(&past, 0); gettimeofday(&past, 0);
if (((past.tv_sec == now.tv_sec && past.tv_usec >= now.tv_usec+500000) || past.tv_sec > now.tv_sec) if (((past.tv_sec == now.tv_sec && past.tv_usec >= now.tv_usec+500000) || past.tv_sec > now.tv_sec)
&& (myScreen == myBrowser || myScreen == myLyrics) && (myScreen == myPlaylist || myScreen == myBrowser || myScreen == myLyrics)
) )
{ {
redraw_header = 1; redraw_header = 1;
@@ -1451,6 +1451,7 @@ int main(int argc, char *argv[])
{ {
time(&timer); time(&timer);
myPlaylist->Main()->Highlighting(1); myPlaylist->Main()->Highlighting(1);
Playlist::ReloadTotalLength = 1;
redraw_header = 1; redraw_header = 1;
} }
} }

View File

@@ -34,6 +34,9 @@ using std::vector;
Playlist *myPlaylist = new Playlist; Playlist *myPlaylist = new Playlist;
bool Playlist::ReloadTotalLength = 0;
bool Playlist::ReloadRemaining = 0;
bool Playlist::BlockNowPlayingUpdate = 0; bool Playlist::BlockNowPlayingUpdate = 0;
bool Playlist::BlockUpdate = 0; bool Playlist::BlockUpdate = 0;
bool Playlist::BlockRefreshing = 0; bool Playlist::BlockRefreshing = 0;
@@ -81,6 +84,8 @@ void Playlist::SwitchTo()
if (myScreen == this) if (myScreen == this)
return; return;
itsScrollBegin = 0;
if (hasToBeResized) if (hasToBeResized)
Resize(); Resize();
@@ -101,7 +106,9 @@ void Playlist::Resize()
std::string Playlist::Title() std::string Playlist::Title()
{ {
std::string result = "Playlist "; std::string result = "Playlist ";
result += TotalLength(); if (ReloadTotalLength || ReloadRemaining)
itsBufferedStats = TotalLength();
result += TO_STRING(Scroller(itsBufferedStats, w->GetWidth()-result.length()-volume_state.length(), itsScrollBegin));
return result; return result;
} }
@@ -266,14 +273,20 @@ std::string Playlist::TotalLength()
{ {
std::ostringstream result; std::ostringstream result;
const int MINUTE = 60; if (ReloadTotalLength)
const int HOUR = 60*MINUTE; {
const int DAY = 24*HOUR; itsTotalLength = 0;
const int YEAR = 365*DAY; for (size_t i = 0; i < w->Size(); i++)
int length = 0; itsTotalLength += (*w)[i].GetTotalLength();
ReloadTotalLength = 0;
for (size_t i = 0; i < w->Size(); i++) }
length += w->at(i).GetTotalLength(); if (Config.playlist_show_remaining_time && ReloadRemaining && !w->isFiltered())
{
itsRemainingTime = 0;
for (size_t i = NowPlaying; i < w->Size(); i++)
itsRemainingTime += (*w)[i].GetTotalLength();
ReloadRemaining = 0;
}
result << '(' << w->Size() << (w->Size() == 1 ? " item" : " items"); result << '(' << w->Size() << (w->Size() == 1 ? " item" : " items");
@@ -286,48 +299,63 @@ std::string Playlist::TotalLength()
result << " (out of " << Mpd->GetPlaylistLength() << ")"; result << " (out of " << Mpd->GetPlaylistLength() << ")";
} }
if (length) if (itsTotalLength)
{ {
result << ", length: "; result << ", length: ";
int years = length/YEAR; ShowTime(result, itsTotalLength);
if (years) }
{ if (Config.playlist_show_remaining_time && itsRemainingTime && !w->isFiltered() && w->Size() > 1)
result << years << (years == 1 ? " year" : " years"); {
length -= years*YEAR; result << " :: remaining: ";
if (length) ShowTime(result, itsRemainingTime);
result << ", ";
}
int days = length/DAY;
if (days)
{
result << days << (days == 1 ? " day" : " days");
length -= days*DAY;
if (length)
result << ", ";
}
int hours = length/HOUR;
if (hours)
{
result << hours << (hours == 1 ? " hour" : " hours");
length -= hours*HOUR;
if (length)
result << ", ";
}
int minutes = length/MINUTE;
if (minutes)
{
result << minutes << (minutes == 1 ? " minute" : " minutes");
length -= minutes*MINUTE;
if (length)
result << ", ";
}
if (length)
result << length << (length == 1 ? " second" : " seconds");
} }
result << ')'; result << ')';
return result.str(); return result.str();
} }
void Playlist::ShowTime(std::ostringstream &result, size_t length)
{
const int MINUTE = 60;
const int HOUR = 60*MINUTE;
const int DAY = 24*HOUR;
const int YEAR = 365*DAY;
int years = length/YEAR;
if (years)
{
result << years << (years == 1 ? " year" : " years");
length -= years*YEAR;
if (length)
result << ", ";
}
int days = length/DAY;
if (days)
{
result << days << (days == 1 ? " day" : " days");
length -= days*DAY;
if (length)
result << ", ";
}
int hours = length/HOUR;
if (hours)
{
result << hours << (hours == 1 ? " hour" : " hours");
length -= hours*HOUR;
if (length)
result << ", ";
}
int minutes = length/MINUTE;
if (minutes)
{
result << minutes << (minutes == 1 ? " minute" : " minutes");
length -= minutes*MINUTE;
if (length)
result << ", ";
}
if (length)
result << length << (length == 1 ? " second" : " seconds");
}
const MPD::Song *Playlist::NowPlayingSong() const MPD::Song *Playlist::NowPlayingSong()
{ {
bool was_filtered = w->isFiltered(); bool was_filtered = w->isFiltered();

View File

@@ -21,6 +21,8 @@
#ifndef _PLAYLIST_H #ifndef _PLAYLIST_H
#define _PLAYLIST_H #define _PLAYLIST_H
#include <sstream>
#include "ncmpcpp.h" #include "ncmpcpp.h"
#include "screen.h" #include "screen.h"
#include "song.h" #include "song.h"
@@ -28,7 +30,7 @@
class Playlist : public Screen< Menu<MPD::Song> > class Playlist : public Screen< Menu<MPD::Song> >
{ {
public: public:
Playlist() : NowPlaying(-1), OldPlaying(-1) { } Playlist() : NowPlaying(-1), OldPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { }
~Playlist() { } ~Playlist() { }
virtual void Init(); virtual void Init();
@@ -61,6 +63,9 @@ class Playlist : public Screen< Menu<MPD::Song> >
int NowPlaying; int NowPlaying;
int OldPlaying; int OldPlaying;
static bool ReloadTotalLength;
static bool ReloadRemaining;
static bool BlockNowPlayingUpdate; static bool BlockNowPlayingUpdate;
static bool BlockUpdate; static bool BlockUpdate;
static bool BlockRefreshing; static bool BlockRefreshing;
@@ -68,6 +73,13 @@ class Playlist : public Screen< Menu<MPD::Song> >
protected: protected:
std::string TotalLength(); std::string TotalLength();
std::string itsBufferedStats;
size_t itsTotalLength;
size_t itsRemainingTime;
size_t itsScrollBegin;
static void ShowTime(std::ostringstream &, size_t);
static bool Sorting(MPD::Song *a, MPD::Song *b); static bool Sorting(MPD::Song *a, MPD::Song *b);
static Menu< std::pair<std::string, MPD::Song::GetFunction> > *SortDialog; static Menu< std::pair<std::string, MPD::Song::GetFunction> > *SortDialog;

View File

@@ -247,6 +247,7 @@ void DefaultConfiguration(ncmpcpp_config &conf)
conf.media_lib_primary_tag = MPD_TAG_ITEM_ARTIST; conf.media_lib_primary_tag = MPD_TAG_ITEM_ARTIST;
conf.colors_enabled = true; conf.colors_enabled = true;
conf.fancy_scrolling = true; conf.fancy_scrolling = true;
conf.playlist_show_remaining_time = false;
conf.columns_in_playlist = false; conf.columns_in_playlist = false;
conf.columns_in_browser = false; conf.columns_in_browser = false;
conf.columns_in_search_engine = false; conf.columns_in_search_engine = false;
@@ -564,6 +565,10 @@ void ReadConfiguration(ncmpcpp_config &conf)
{ {
conf.fancy_scrolling = v == "yes"; conf.fancy_scrolling = v == "yes";
} }
else if (cl.find("playlist_show_remaining_time") != string::npos)
{
conf.playlist_show_remaining_time = v == "yes";
}
else if (cl.find("playlist_display_mode") != string::npos) else if (cl.find("playlist_display_mode") != string::npos)
{ {
conf.columns_in_playlist = v == "columns"; conf.columns_in_playlist = v == "columns";

View File

@@ -138,6 +138,7 @@ struct ncmpcpp_config
bool colors_enabled; bool colors_enabled;
bool fancy_scrolling; bool fancy_scrolling;
bool playlist_show_remaining_time;
bool columns_in_playlist; bool columns_in_playlist;
bool columns_in_browser; bool columns_in_browser;
bool columns_in_search_engine; bool columns_in_search_engine;

View File

@@ -231,6 +231,9 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
FreeSongList(list); FreeSongList(list);
} }
Playlist::ReloadTotalLength = 1;
Playlist::ReloadRemaining = 1;
if (myScreen == myPlaylist) if (myScreen == myPlaylist)
redraw_header = 1; redraw_header = 1;
@@ -284,6 +287,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
{ {
player_state = "Playing: "; player_state = "Playing: ";
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 1); myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 1);
Playlist::ReloadRemaining = 1;
changed.ElapsedTime = 1; changed.ElapsedTime = 1;
break; break;
} }
@@ -303,6 +307,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
myPlaylist->Main()->BoldOption(myPlaylist->OldPlaying, 0); myPlaylist->Main()->BoldOption(myPlaylist->OldPlaying, 0);
} }
catch (std::out_of_range) { } catch (std::out_of_range) { }
Playlist::ReloadRemaining = 1;
myPlaylist->NowPlaying = -1; myPlaylist->NowPlaying = -1;
player_state.clear(); player_state.clear();
break; break;
@@ -342,6 +347,8 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
if (Config.now_playing_lyrics && !Config.repeat_one_mode && myScreen == myLyrics && myOldScreen == myPlaylist) if (Config.now_playing_lyrics && !Config.repeat_one_mode && myScreen == myLyrics && myOldScreen == myPlaylist)
Lyrics::Reload = 1; Lyrics::Reload = 1;
} }
Playlist::ReloadRemaining = 1;
playing_song_scroll_begin = 0; playing_song_scroll_begin = 0;
if (Mpd->GetState() == psPlay) if (Mpd->GetState() == psPlay)