move code responsible for marking song as now playing to display functions

This commit is contained in:
Andrzej Rybczak
2009-09-20 23:52:43 +02:00
parent b47ad169dc
commit 5a887861d7
4 changed files with 61 additions and 38 deletions

View File

@@ -19,7 +19,6 @@
***************************************************************************/ ***************************************************************************/
#include "display.h" #include "display.h"
#include "global.h"
#include "helpers.h" #include "helpers.h"
#include "playlist.h" #include "playlist.h"
@@ -106,6 +105,10 @@ void Display::SongsInColumns(const MPD::Song &s, void *, Menu<MPD::Song> *menu)
if (!s.Localized()) if (!s.Localized())
const_cast<MPD::Song *>(&s)->Localize(); const_cast<MPD::Song *>(&s)->Localize();
bool is_now_playing = menu == myPlaylist->Items && menu->CurrentlyDrawedPosition() == myPlaylist->NowPlaying;
if (is_now_playing)
*menu << fmtBold;
if (Config.columns.empty()) if (Config.columns.empty())
return; return;
@@ -205,6 +208,8 @@ void Display::SongsInColumns(const MPD::Song &s, void *, Menu<MPD::Song> *menu)
} }
if ((--it)->color != clDefault) if ((--it)->color != clDefault)
*menu << clEnd; *menu << clEnd;
if (is_now_playing)
*menu << fmtBoldEnd;
} }
void Display::Songs(const MPD::Song &s, void *data, Menu<MPD::Song> *menu) void Display::Songs(const MPD::Song &s, void *data, Menu<MPD::Song> *menu)
@@ -212,6 +217,10 @@ void Display::Songs(const MPD::Song &s, void *data, Menu<MPD::Song> *menu)
if (!s.Localized()) if (!s.Localized())
const_cast<MPD::Song *>(&s)->Localize(); const_cast<MPD::Song *>(&s)->Localize();
bool is_now_playing = menu == myPlaylist->Items && menu->CurrentlyDrawedPosition() == myPlaylist->NowPlaying;
if (is_now_playing)
*menu << fmtBold;
std::string line = s.toString(*static_cast<std::string *>(data)); std::string line = s.toString(*static_cast<std::string *>(data));
for (std::string::const_iterator it = line.begin(); it != line.end(); ++it) for (std::string::const_iterator it = line.begin(); it != line.end(); ++it)
{ {
@@ -235,6 +244,8 @@ void Display::Songs(const MPD::Song &s, void *data, Menu<MPD::Song> *menu)
else else
*menu << *it; *menu << *it;
} }
if (is_now_playing)
*menu << fmtBoldEnd;
} }
void Display::Tags(const MPD::Song &s, void *data, Menu<MPD::Song> *menu) void Display::Tags(const MPD::Song &s, void *data, Menu<MPD::Song> *menu)

View File

@@ -806,18 +806,32 @@ int main(int argc, char *argv[])
{ {
std::vector<size_t> list; std::vector<size_t> list;
myPlaylist->Items->GetSelected(list); myPlaylist->Items->GetSelected(list);
for (std::vector<size_t>::iterator it = list.begin(); it != list.end(); ++it)
if (*it == size_t(myPlaylist->NowPlaying) && list.front() > 0)
myPlaylist->Items->Bold(myPlaylist->NowPlaying, 0);
std::vector<size_t> origs(list); std::vector<size_t> origs(list);
// NOTICE: since ncmpcpp only pretends to move the songs until the key is
// released, mpd doesn't know about the change while the songs are moved
// so wee need to block playlist update for this time and also if one of
// the songs being moved is currently playing, now playing update to prevent
// mpd from 'updating' and thus showing wrong position
bool modify_now_playing = 0;
for (std::vector<size_t>::iterator it = list.begin(); it != list.end(); ++it)
{
if (*it == size_t(myPlaylist->NowPlaying) && list.front() > 0)
{
modify_now_playing = 1;
Playlist::BlockNowPlayingUpdate = 1;
break;
}
}
while (Keypressed(input, Key.MvSongUp) && list.front() > 0) while (Keypressed(input, Key.MvSongUp) && list.front() > 0)
{ {
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
if (modify_now_playing)
--myPlaylist->NowPlaying;
for (std::vector<size_t>::iterator it = list.begin(); it != list.end(); ++it) for (std::vector<size_t>::iterator it = list.begin(); it != list.end(); ++it)
{ {
--*it; --*it;
@@ -829,6 +843,7 @@ int main(int argc, char *argv[])
myPlaylist->Items->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Items->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Playlist::BlockNowPlayingUpdate = 0;
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (size_t i = 0; i < list.size(); ++i) for (size_t i = 0; i < list.size(); ++i)
Mpd.Move(origs[i], list[i]); Mpd.Move(origs[i], list[i]);
@@ -838,14 +853,16 @@ int main(int argc, char *argv[])
{ {
size_t from, to; size_t from, to;
from = to = myPlaylist->Items->Choice(); from = to = myPlaylist->Items->Choice();
// unbold now playing as if song changes during move, this won't be unbolded. bool modify_now_playing = from == size_t(myPlaylist->NowPlaying);
if (to == size_t(myPlaylist->NowPlaying) && to > 0) if (modify_now_playing)
myPlaylist->Items->Bold(myPlaylist->NowPlaying, 0); Playlist::BlockNowPlayingUpdate = 1;
while (Keypressed(input, Key.MvSongUp) && to > 0) while (Keypressed(input, Key.MvSongUp) && to > 0)
{ {
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
if (modify_now_playing)
--myPlaylist->NowPlaying;
--to; --to;
myPlaylist->Items->at(from).SetPosition(to); myPlaylist->Items->at(from).SetPosition(to);
myPlaylist->Items->at(to).SetPosition(from); myPlaylist->Items->at(to).SetPosition(from);
@@ -855,6 +872,7 @@ int main(int argc, char *argv[])
myPlaylist->Items->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Mpd.Move(from, to); Mpd.Move(from, to);
Playlist::BlockNowPlayingUpdate = 0;
UpdateStatusImmediately = 1; UpdateStatusImmediately = 1;
} }
myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout); myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout);
@@ -920,18 +938,26 @@ int main(int argc, char *argv[])
{ {
std::vector<size_t> list; std::vector<size_t> list;
myPlaylist->Items->GetSelected(list); myPlaylist->Items->GetSelected(list);
for (std::vector<size_t>::iterator it = list.begin(); it != list.end(); ++it)
if (*it == size_t(myPlaylist->NowPlaying) && list.back() < myPlaylist->Items->Size()-1)
myPlaylist->Items->Bold(myPlaylist->NowPlaying, 0);
std::vector<size_t> origs(list); std::vector<size_t> origs(list);
bool modify_now_playing = 0;
for (std::vector<size_t>::iterator it = list.begin(); it != list.end(); ++it)
{
if (*it == size_t(myPlaylist->NowPlaying) && list.back() < myPlaylist->Items->Size()-1)
{
modify_now_playing = 1;
Playlist::BlockNowPlayingUpdate = 1;
break;
}
}
while (Keypressed(input, Key.MvSongDown) && list.back() < myPlaylist->Items->Size()-1) while (Keypressed(input, Key.MvSongDown) && list.back() < myPlaylist->Items->Size()-1)
{ {
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
if (modify_now_playing)
++myPlaylist->NowPlaying;
for (std::vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); ++it) for (std::vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); ++it)
{ {
++*it; ++*it;
@@ -943,6 +969,7 @@ int main(int argc, char *argv[])
myPlaylist->Items->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Items->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Playlist::BlockNowPlayingUpdate = 0;
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (int i = list.size()-1; i >= 0; --i) for (int i = list.size()-1; i >= 0; --i)
Mpd.Move(origs[i], list[i]); Mpd.Move(origs[i], list[i]);
@@ -952,14 +979,16 @@ int main(int argc, char *argv[])
{ {
size_t from, to; size_t from, to;
from = to = myPlaylist->Items->Choice(); from = to = myPlaylist->Items->Choice();
// unbold now playing as if song changes during move, this won't be unbolded. bool modify_now_playing = from == size_t(myPlaylist->NowPlaying);
if (to == size_t(myPlaylist->NowPlaying) && to < myPlaylist->Items->Size()-1) if (modify_now_playing)
myPlaylist->Items->Bold(myPlaylist->NowPlaying, 0); Playlist::BlockNowPlayingUpdate = 1;
while (Keypressed(input, Key.MvSongDown) && to < myPlaylist->Items->Size()-1) while (Keypressed(input, Key.MvSongDown) && to < myPlaylist->Items->Size()-1)
{ {
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
if (modify_now_playing)
++myPlaylist->NowPlaying;
++to; ++to;
myPlaylist->Items->at(from).SetPosition(to); myPlaylist->Items->at(from).SetPosition(to);
myPlaylist->Items->at(to).SetPosition(from); myPlaylist->Items->at(to).SetPosition(from);
@@ -969,6 +998,7 @@ int main(int argc, char *argv[])
myPlaylist->Items->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Mpd.Move(from, to); Mpd.Move(from, to);
Playlist::BlockNowPlayingUpdate = 0;
UpdateStatusImmediately = 1; UpdateStatusImmediately = 1;
} }
myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout); myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout);

View File

@@ -30,7 +30,7 @@
class Playlist : public Screen<Window> class Playlist : public Screen<Window>
{ {
public: public:
Playlist() : NowPlaying(-1), OldPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { } Playlist() : NowPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { }
~Playlist() { } ~Playlist() { }
virtual void SwitchTo(); virtual void SwitchTo();
@@ -73,7 +73,6 @@ class Playlist : public Screen<Window>
Menu< MPD::Song > *Items; Menu< MPD::Song > *Items;
int NowPlaying; int NowPlaying;
int OldPlaying;
static bool ReloadTotalLength; static bool ReloadTotalLength;
static bool ReloadRemaining; static bool ReloadRemaining;

View File

@@ -185,25 +185,8 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
*wFooter << fmtBold; *wFooter << fmtBold;
wFooter->GetXY(sx, sy); wFooter->GetXY(sx, sy);
if ((myPlaylist->NowPlaying != Mpd.GetCurrentSongPos() || changed.SongID) && !Playlist::BlockNowPlayingUpdate) if (!Playlist::BlockNowPlayingUpdate)
{
myPlaylist->OldPlaying = myPlaylist->NowPlaying;
myPlaylist->NowPlaying = Mpd.GetCurrentSongPos(); myPlaylist->NowPlaying = Mpd.GetCurrentSongPos();
bool was_filtered = myPlaylist->Items->isFiltered();
myPlaylist->Items->ShowAll();
try
{
myPlaylist->Items->Bold(myPlaylist->OldPlaying, 0);
}
catch (std::out_of_range) { }
try
{
myPlaylist->Items->Bold(myPlaylist->NowPlaying, 1);
}
catch (std::out_of_range) { }
if (was_filtered)
myPlaylist->Items->ShowFiltered();
}
if (changed.Playlist) if (changed.Playlist)
{ {
@@ -234,7 +217,7 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
else else
{ {
// otherwise just add it to playlist // otherwise just add it to playlist
myPlaylist->Items->AddOption(**it, myPlaylist->NowPlaying == pos); myPlaylist->Items->AddOption(**it);
} }
myPlaylist->Items->at(pos).CopyPtr(0); myPlaylist->Items->at(pos).CopyPtr(0);
(*it)->NullMe(); (*it)->NullMe();