From 5a887861d7fe9d67ee32f0f009ede1db6ea7a85f Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Sun, 20 Sep 2009 23:52:43 +0200 Subject: [PATCH] move code responsible for marking song as now playing to display functions --- src/display.cpp | 13 ++++++++++- src/ncmpcpp.cpp | 62 ++++++++++++++++++++++++++++++++++++------------- src/playlist.h | 3 +-- src/status.cpp | 21 ++--------------- 4 files changed, 61 insertions(+), 38 deletions(-) diff --git a/src/display.cpp b/src/display.cpp index 197ca366..d96a18d1 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -19,7 +19,6 @@ ***************************************************************************/ #include "display.h" -#include "global.h" #include "helpers.h" #include "playlist.h" @@ -106,6 +105,10 @@ void Display::SongsInColumns(const MPD::Song &s, void *, Menu *menu) if (!s.Localized()) const_cast(&s)->Localize(); + bool is_now_playing = menu == myPlaylist->Items && menu->CurrentlyDrawedPosition() == myPlaylist->NowPlaying; + if (is_now_playing) + *menu << fmtBold; + if (Config.columns.empty()) return; @@ -205,6 +208,8 @@ void Display::SongsInColumns(const MPD::Song &s, void *, Menu *menu) } if ((--it)->color != clDefault) *menu << clEnd; + if (is_now_playing) + *menu << fmtBoldEnd; } void Display::Songs(const MPD::Song &s, void *data, Menu *menu) @@ -212,6 +217,10 @@ void Display::Songs(const MPD::Song &s, void *data, Menu *menu) if (!s.Localized()) const_cast(&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(data)); 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 *menu) else *menu << *it; } + if (is_now_playing) + *menu << fmtBoldEnd; } void Display::Tags(const MPD::Song &s, void *data, Menu *menu) diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index f9367814..b4c4f195 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -806,18 +806,32 @@ int main(int argc, char *argv[]) { std::vector list; myPlaylist->Items->GetSelected(list); - - for (std::vector::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 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::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) { TraceMpdStatus(); Playlist::BlockUpdate = 1; myPlaylist->UpdateTimer(); + if (modify_now_playing) + --myPlaylist->NowPlaying; for (std::vector::iterator it = list.begin(); it != list.end(); ++it) { --*it; @@ -829,6 +843,7 @@ int main(int argc, char *argv[]) myPlaylist->Items->Refresh(); myPlaylist->Items->ReadKey(input); } + Playlist::BlockNowPlayingUpdate = 0; Mpd.StartCommandsList(); for (size_t i = 0; i < list.size(); ++i) Mpd.Move(origs[i], list[i]); @@ -838,14 +853,16 @@ int main(int argc, char *argv[]) { size_t from, to; from = to = myPlaylist->Items->Choice(); - // unbold now playing as if song changes during move, this won't be unbolded. - if (to == size_t(myPlaylist->NowPlaying) && to > 0) - myPlaylist->Items->Bold(myPlaylist->NowPlaying, 0); + bool modify_now_playing = from == size_t(myPlaylist->NowPlaying); + if (modify_now_playing) + Playlist::BlockNowPlayingUpdate = 1; while (Keypressed(input, Key.MvSongUp) && to > 0) { TraceMpdStatus(); Playlist::BlockUpdate = 1; myPlaylist->UpdateTimer(); + if (modify_now_playing) + --myPlaylist->NowPlaying; --to; myPlaylist->Items->at(from).SetPosition(to); myPlaylist->Items->at(to).SetPosition(from); @@ -855,6 +872,7 @@ int main(int argc, char *argv[]) myPlaylist->Items->ReadKey(input); } Mpd.Move(from, to); + Playlist::BlockNowPlayingUpdate = 0; UpdateStatusImmediately = 1; } myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout); @@ -920,18 +938,26 @@ int main(int argc, char *argv[]) { std::vector list; myPlaylist->Items->GetSelected(list); - - for (std::vector::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 origs(list); + bool modify_now_playing = 0; + for (std::vector::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) { TraceMpdStatus(); Playlist::BlockUpdate = 1; myPlaylist->UpdateTimer(); + if (modify_now_playing) + ++myPlaylist->NowPlaying; for (std::vector::reverse_iterator it = list.rbegin(); it != list.rend(); ++it) { ++*it; @@ -943,6 +969,7 @@ int main(int argc, char *argv[]) myPlaylist->Items->Refresh(); myPlaylist->Items->ReadKey(input); } + Playlist::BlockNowPlayingUpdate = 0; Mpd.StartCommandsList(); for (int i = list.size()-1; i >= 0; --i) Mpd.Move(origs[i], list[i]); @@ -952,14 +979,16 @@ int main(int argc, char *argv[]) { size_t from, to; from = to = myPlaylist->Items->Choice(); - // unbold now playing as if song changes during move, this won't be unbolded. - if (to == size_t(myPlaylist->NowPlaying) && to < myPlaylist->Items->Size()-1) - myPlaylist->Items->Bold(myPlaylist->NowPlaying, 0); + bool modify_now_playing = from == size_t(myPlaylist->NowPlaying); + if (modify_now_playing) + Playlist::BlockNowPlayingUpdate = 1; while (Keypressed(input, Key.MvSongDown) && to < myPlaylist->Items->Size()-1) { TraceMpdStatus(); Playlist::BlockUpdate = 1; myPlaylist->UpdateTimer(); + if (modify_now_playing) + ++myPlaylist->NowPlaying; ++to; myPlaylist->Items->at(from).SetPosition(to); myPlaylist->Items->at(to).SetPosition(from); @@ -969,6 +998,7 @@ int main(int argc, char *argv[]) myPlaylist->Items->ReadKey(input); } Mpd.Move(from, to); + Playlist::BlockNowPlayingUpdate = 0; UpdateStatusImmediately = 1; } myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout); diff --git a/src/playlist.h b/src/playlist.h index d61518fe..a2c17451 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -30,7 +30,7 @@ class Playlist : public Screen { public: - Playlist() : NowPlaying(-1), OldPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { } + Playlist() : NowPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { } ~Playlist() { } virtual void SwitchTo(); @@ -73,7 +73,6 @@ class Playlist : public Screen Menu< MPD::Song > *Items; int NowPlaying; - int OldPlaying; static bool ReloadTotalLength; static bool ReloadRemaining; diff --git a/src/status.cpp b/src/status.cpp index 0c1d9478..66b282d3 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -185,25 +185,8 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) *wFooter << fmtBold; wFooter->GetXY(sx, sy); - if ((myPlaylist->NowPlaying != Mpd.GetCurrentSongPos() || changed.SongID) && !Playlist::BlockNowPlayingUpdate) - { - myPlaylist->OldPlaying = myPlaylist->NowPlaying; + if (!Playlist::BlockNowPlayingUpdate) 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) { @@ -234,7 +217,7 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) else { // otherwise just add it to playlist - myPlaylist->Items->AddOption(**it, myPlaylist->NowPlaying == pos); + myPlaylist->Items->AddOption(**it); } myPlaylist->Items->at(pos).CopyPtr(0); (*it)->NullMe();