make sorting window use main ncmpcpp loop

This commit is contained in:
Andrzej Rybczak
2009-08-30 02:47:46 +02:00
parent 62ba4ce343
commit 18e611bee2
11 changed files with 355 additions and 356 deletions

View File

@@ -417,9 +417,9 @@ void Browser::GetDirectory(std::string dir, std::string subdir)
case itSong: case itSong:
{ {
bool bold = 0; bool bold = 0;
for (size_t i = 0; i < myPlaylist->Main()->Size(); ++i) for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
{ {
if (myPlaylist->Main()->at(i).GetHash() == it->song->GetHash()) if (myPlaylist->Items->at(i).GetHash() == it->song->GetHash())
{ {
bold = 1; bold = 1;
break; break;
@@ -492,9 +492,9 @@ void Browser::UpdateItemList()
{ {
if (w->at(i).type == itSong) if (w->at(i).type == itSong)
{ {
for (size_t j = 0; j < myPlaylist->Main()->Size(); ++j) for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
{ {
if (myPlaylist->Main()->at(j).GetHash() == w->at(i).song->GetHash()) if (myPlaylist->Items->at(j).GetHash() == w->at(i).song->GetHash())
{ {
bold = 1; bold = 1;
break; break;

View File

@@ -65,7 +65,7 @@ void Clock::Resize()
{ {
if (myPlaylist->hasToBeResized) if (myPlaylist->hasToBeResized)
myPlaylist->Resize(); myPlaylist->Resize();
myPlaylist->Main()->Hide(); myPlaylist->Items->Hide();
w->Display(); w->Display();
} }
} }
@@ -88,7 +88,7 @@ void Clock::SwitchTo()
Resize(); Resize();
myScreen = this; myScreen = this;
myPlaylist->Main()->Hide(); myPlaylist->Items->Hide();
RedrawHeader = 1; RedrawHeader = 1;
Prepare(); Prepare();
// clearing screen apparently fixes the problem with last digits being misrendered // clearing screen apparently fixes the problem with last digits being misrendered

View File

@@ -245,9 +245,9 @@ void UpdateSongList(Menu<Song> *menu)
bool bold = 0; bool bold = 0;
for (size_t i = 0; i < menu->Size(); ++i) for (size_t i = 0; i < menu->Size(); ++i)
{ {
for (size_t j = 0; j < myPlaylist->Main()->Size(); ++j) for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
{ {
if (myPlaylist->Main()->at(j).GetHash() == menu->at(i).GetHash()) if (myPlaylist->Items->at(j).GetHash() == menu->at(i).GetHash())
{ {
bold = 1; bold = 1;
break; break;

View File

@@ -303,9 +303,9 @@ void MediaLibrary::Update()
for (SongList::const_iterator it = list.begin(); it != list.end(); ++it) for (SongList::const_iterator it = list.begin(); it != list.end(); ++it)
{ {
for (size_t j = 0; j < myPlaylist->Main()->Size(); ++j) for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
{ {
if ((*it)->GetHash() == myPlaylist->Main()->at(j).GetHash()) if ((*it)->GetHash() == myPlaylist->Items->at(j).GetHash())
{ {
bold = 1; bold = 1;
break; break;

View File

@@ -52,7 +52,7 @@
#include "visualizer.h" #include "visualizer.h"
#define CHECK_PLAYLIST_FOR_FILTERING \ #define CHECK_PLAYLIST_FOR_FILTERING \
if (myPlaylist->Main()->isFiltered()) \ if (myPlaylist->Items->isFiltered()) \
{ \ { \
ShowMessage("%s", MPD::Message::FunctionDisabledFilteringEnabled); \ ShowMessage("%s", MPD::Message::FunctionDisabledFilteringEnabled); \
continue; \ continue; \
@@ -188,7 +188,7 @@ int main(int argc, char *argv[])
{ {
TraceMpdStatus(); TraceMpdStatus();
if (myPlaylist->isPlaying()) if (myPlaylist->isPlaying())
myPlaylist->Main()->Highlight(myPlaylist->NowPlaying); myPlaylist->Items->Highlight(myPlaylist->NowPlaying);
} }
while (!main_exit) while (!main_exit)
@@ -545,18 +545,18 @@ int main(int argc, char *argv[])
} }
else if (Keypressed(input, Key.Delete)) else if (Keypressed(input, Key.Delete))
{ {
if (!myPlaylist->Main()->Empty() && myScreen == myPlaylist) if (!myPlaylist->Items->Empty() && myScreen == myPlaylist)
{ {
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
if (myPlaylist->Main()->hasSelected()) if (myPlaylist->Items->hasSelected())
{ {
std::vector<size_t> list; std::vector<size_t> list;
myPlaylist->Main()->GetSelected(list); myPlaylist->Items->GetSelected(list);
Mpd.StartCommandsList(); Mpd.StartCommandsList();
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)
{ {
Mpd.DeleteID((*myPlaylist->Main())[*it].GetID()); Mpd.DeleteID((*myPlaylist->Items)[*it].GetID());
myPlaylist->Main()->DeleteOption(*it); myPlaylist->Items->DeleteOption(*it);
} }
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();
myPlaylist->FixPositions(list.front()); myPlaylist->FixPositions(list.front());
@@ -565,11 +565,11 @@ int main(int argc, char *argv[])
else else
{ {
Playlist::BlockNowPlayingUpdate = 1; Playlist::BlockNowPlayingUpdate = 1;
myPlaylist->Main()->SetTimeout(50); myPlaylist->Items->SetTimeout(50);
int del_counter = 0; int del_counter = 0;
while (!myPlaylist->Main()->Empty() && Keypressed(input, Key.Delete)) while (!myPlaylist->Items->Empty() && Keypressed(input, Key.Delete))
{ {
size_t id = myPlaylist->Main()->Choice(); size_t id = myPlaylist->Items->Choice();
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
@@ -577,13 +577,13 @@ int main(int argc, char *argv[])
if (myPlaylist->NowPlaying > myPlaylist->CurrentSong()->GetPosition()-del_counter) if (myPlaylist->NowPlaying > myPlaylist->CurrentSong()->GetPosition()-del_counter)
myPlaylist->NowPlaying--; myPlaylist->NowPlaying--;
Mpd.DeleteID(myPlaylist->CurrentSong()->GetID()); Mpd.DeleteID(myPlaylist->CurrentSong()->GetID());
myPlaylist->Main()->DeleteOption(id); myPlaylist->Items->DeleteOption(id);
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Main()->ReadKey(input); myPlaylist->Items->ReadKey(input);
del_counter++; del_counter++;
} }
myPlaylist->FixPositions(myPlaylist->Main()->Choice()); myPlaylist->FixPositions(myPlaylist->Items->Choice());
myPlaylist->Main()->SetTimeout(ncmpcpp_window_timeout); myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout);
Playlist::BlockNowPlayingUpdate = 0; Playlist::BlockNowPlayingUpdate = 0;
} }
} }
@@ -738,11 +738,11 @@ int main(int argc, char *argv[])
} }
if (!playlist_name.empty()) if (!playlist_name.empty())
{ {
if (myPlaylist->Main()->isFiltered()) if (myPlaylist->Items->isFiltered())
{ {
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (size_t i = 0; i < myPlaylist->Main()->Size(); ++i) for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
Mpd.AddToPlaylist(real_playlist_name, (*myPlaylist->Main())[i]); Mpd.AddToPlaylist(real_playlist_name, (*myPlaylist->Items)[i]);
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();
if (Mpd.GetErrorMessage().empty()) if (Mpd.GetErrorMessage().empty())
ShowMessage("Filtered items added to playlist \"%s\"", playlist_name.c_str()); ShowMessage("Filtered items added to playlist \"%s\"", playlist_name.c_str());
@@ -796,18 +796,20 @@ int main(int argc, char *argv[])
} }
else if (Keypressed(input, Key.MvSongUp)) else if (Keypressed(input, Key.MvSongUp))
{ {
if (myScreen == myPlaylist && !myPlaylist->Main()->Empty()) if (myScreen == myPlaylist && myPlaylist->SortingInProgress())
myPlaylist->AdjustSortOrder(input);
else if (myScreen == myPlaylist && !myPlaylist->Items->Empty())
{ {
CHECK_PLAYLIST_FOR_FILTERING; CHECK_PLAYLIST_FOR_FILTERING;
myPlaylist->Main()->SetTimeout(50); myPlaylist->Items->SetTimeout(50);
if (myPlaylist->Main()->hasSelected()) if (myPlaylist->Items->hasSelected())
{ {
std::vector<size_t> list; std::vector<size_t> list;
myPlaylist->Main()->GetSelected(list); myPlaylist->Items->GetSelected(list);
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)
if (*it == size_t(myPlaylist->NowPlaying) && list.front() > 0) if (*it == size_t(myPlaylist->NowPlaying) && list.front() > 0)
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 0); myPlaylist->Items->BoldOption(myPlaylist->NowPlaying, 0);
std::vector<size_t> origs(list); std::vector<size_t> origs(list);
@@ -819,13 +821,13 @@ int main(int argc, char *argv[])
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;
myPlaylist->Main()->at((*it)+1).SetPosition(*it); myPlaylist->Items->at((*it)+1).SetPosition(*it);
myPlaylist->Main()->at(*it).SetPosition((*it)+1); myPlaylist->Items->at(*it).SetPosition((*it)+1);
myPlaylist->Main()->Swap(*it, (*it)+1); myPlaylist->Items->Swap(*it, (*it)+1);
} }
myPlaylist->Main()->Highlight(list[(list.size()-1)/2]); myPlaylist->Items->Highlight(list[(list.size()-1)/2]);
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Main()->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (size_t i = 0; i < list.size(); ++i) for (size_t i = 0; i < list.size(); ++i)
@@ -835,27 +837,27 @@ int main(int argc, char *argv[])
else else
{ {
size_t from, to; size_t from, to;
from = to = myPlaylist->Main()->Choice(); from = to = myPlaylist->Items->Choice();
// unbold now playing as if song changes during move, this won't be unbolded. // unbold now playing as if song changes during move, this won't be unbolded.
if (to == size_t(myPlaylist->NowPlaying) && to > 0) if (to == size_t(myPlaylist->NowPlaying) && to > 0)
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 0); myPlaylist->Items->BoldOption(myPlaylist->NowPlaying, 0);
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();
--to; --to;
myPlaylist->Main()->at(from).SetPosition(to); myPlaylist->Items->at(from).SetPosition(to);
myPlaylist->Main()->at(to).SetPosition(from); myPlaylist->Items->at(to).SetPosition(from);
myPlaylist->Main()->Swap(to, to+1); myPlaylist->Items->Swap(to, to+1);
myPlaylist->Main()->Scroll(wUp); myPlaylist->Items->Scroll(wUp);
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Main()->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Mpd.Move(from, to); Mpd.Move(from, to);
UpdateStatusImmediately = 1; UpdateStatusImmediately = 1;
} }
myPlaylist->Main()->SetTimeout(ncmpcpp_window_timeout); myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout);
} }
else if (myScreen->ActiveWindow() == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) else if (myScreen->ActiveWindow() == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
{ {
@@ -908,22 +910,24 @@ int main(int argc, char *argv[])
} }
else if (Keypressed(input, Key.MvSongDown)) else if (Keypressed(input, Key.MvSongDown))
{ {
if (myScreen == myPlaylist && !myPlaylist->Main()->Empty()) if (myScreen == myPlaylist && myPlaylist->SortingInProgress())
myPlaylist->AdjustSortOrder(input);
else if (myScreen == myPlaylist && !myPlaylist->Items->Empty())
{ {
CHECK_PLAYLIST_FOR_FILTERING; CHECK_PLAYLIST_FOR_FILTERING;
myPlaylist->Main()->SetTimeout(50); myPlaylist->Items->SetTimeout(50);
if (myPlaylist->Main()->hasSelected()) if (myPlaylist->Items->hasSelected())
{ {
std::vector<size_t> list; std::vector<size_t> list;
myPlaylist->Main()->GetSelected(list); myPlaylist->Items->GetSelected(list);
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)
if (*it == size_t(myPlaylist->NowPlaying) && list.back() < myPlaylist->Main()->Size()-1) if (*it == size_t(myPlaylist->NowPlaying) && list.back() < myPlaylist->Items->Size()-1)
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 0); myPlaylist->Items->BoldOption(myPlaylist->NowPlaying, 0);
std::vector<size_t> origs(list); std::vector<size_t> origs(list);
while (Keypressed(input, Key.MvSongDown) && list.back() < myPlaylist->Main()->Size()-1) while (Keypressed(input, Key.MvSongDown) && list.back() < myPlaylist->Items->Size()-1)
{ {
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
@@ -931,13 +935,13 @@ int main(int argc, char *argv[])
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;
myPlaylist->Main()->at((*it)-1).SetPosition(*it); myPlaylist->Items->at((*it)-1).SetPosition(*it);
myPlaylist->Main()->at(*it).SetPosition((*it)-1); myPlaylist->Items->at(*it).SetPosition((*it)-1);
myPlaylist->Main()->Swap(*it, (*it)-1); myPlaylist->Items->Swap(*it, (*it)-1);
} }
myPlaylist->Main()->Highlight(list[(list.size()-1)/2]); myPlaylist->Items->Highlight(list[(list.size()-1)/2]);
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Main()->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (int i = list.size()-1; i >= 0; --i) for (int i = list.size()-1; i >= 0; --i)
@@ -947,27 +951,27 @@ int main(int argc, char *argv[])
else else
{ {
size_t from, to; size_t from, to;
from = to = myPlaylist->Main()->Choice(); from = to = myPlaylist->Items->Choice();
// unbold now playing as if song changes during move, this won't be unbolded. // unbold now playing as if song changes during move, this won't be unbolded.
if (to == size_t(myPlaylist->NowPlaying) && to < myPlaylist->Main()->Size()-1) if (to == size_t(myPlaylist->NowPlaying) && to < myPlaylist->Items->Size()-1)
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 0); myPlaylist->Items->BoldOption(myPlaylist->NowPlaying, 0);
while (Keypressed(input, Key.MvSongDown) && to < myPlaylist->Main()->Size()-1) while (Keypressed(input, Key.MvSongDown) && to < myPlaylist->Items->Size()-1)
{ {
TraceMpdStatus(); TraceMpdStatus();
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
++to; ++to;
myPlaylist->Main()->at(from).SetPosition(to); myPlaylist->Items->at(from).SetPosition(to);
myPlaylist->Main()->at(to).SetPosition(from); myPlaylist->Items->at(to).SetPosition(from);
myPlaylist->Main()->Swap(to, to-1); myPlaylist->Items->Swap(to, to-1);
myPlaylist->Main()->Scroll(wDown); myPlaylist->Items->Scroll(wDown);
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
myPlaylist->Main()->ReadKey(input); myPlaylist->Items->ReadKey(input);
} }
Mpd.Move(from, to); Mpd.Move(from, to);
UpdateStatusImmediately = 1; UpdateStatusImmediately = 1;
} }
myPlaylist->Main()->SetTimeout(ncmpcpp_window_timeout); myPlaylist->Items->SetTimeout(ncmpcpp_window_timeout);
} }
else if (myScreen->ActiveWindow() == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) else if (myScreen->ActiveWindow() == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
@@ -1022,18 +1026,18 @@ int main(int argc, char *argv[])
else if (Keypressed(input, Key.MoveTo) && myScreen == myPlaylist) else if (Keypressed(input, Key.MoveTo) && myScreen == myPlaylist)
{ {
CHECK_PLAYLIST_FOR_FILTERING; CHECK_PLAYLIST_FOR_FILTERING;
if (!myPlaylist->Main()->hasSelected()) if (!myPlaylist->Items->hasSelected())
{ {
ShowMessage("No selected items to move!"); ShowMessage("No selected items to move!");
continue; continue;
} }
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
size_t pos = myPlaylist->Main()->Choice(); size_t pos = myPlaylist->Items->Choice();
// if cursor is at the last item, break convention and move at the end of playlist // if cursor is at the last item, break convention and move at the end of playlist
if (pos == myPlaylist->Main()->Size()-1) if (pos == myPlaylist->Items->Size()-1)
pos++; pos++;
std::vector<size_t> list; std::vector<size_t> list;
myPlaylist->Main()->GetSelected(list); myPlaylist->Items->GetSelected(list);
if (pos >= list.front() && pos <= list.back()) if (pos >= list.front() && pos <= list.back())
continue; continue;
int diff = pos-list.front(); int diff = pos-list.front();
@@ -1045,7 +1049,7 @@ int main(int argc, char *argv[])
for (std::vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); ++it, --i) for (std::vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); ++it, --i)
{ {
Mpd.Move(*it, pos+i); Mpd.Move(*it, pos+i);
myPlaylist->Main()->Move(*it, pos+i); myPlaylist->Items->Move(*it, pos+i);
} }
} }
else if (diff < 0) else if (diff < 0)
@@ -1054,11 +1058,11 @@ int main(int argc, char *argv[])
for (std::vector<size_t>::const_iterator it = list.begin(); it != list.end(); ++it, ++i) for (std::vector<size_t>::const_iterator it = list.begin(); it != list.end(); ++it, ++i)
{ {
Mpd.Move(*it, pos+i); Mpd.Move(*it, pos+i);
myPlaylist->Main()->Move(*it, pos+i); myPlaylist->Items->Move(*it, pos+i);
} }
} }
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();
myPlaylist->Main()->Highlight(pos); myPlaylist->Items->Highlight(pos);
myPlaylist->FixPositions(); myPlaylist->FixPositions();
} }
else if (Keypressed(input, Key.Add)) else if (Keypressed(input, Key.Add))
@@ -1105,7 +1109,7 @@ int main(int argc, char *argv[])
{ {
TraceMpdStatus(); TraceMpdStatus();
myPlaylist->UpdateTimer(); myPlaylist->UpdateTimer();
myPlaylist->Main()->ReadKey(input); myPlaylist->Items->ReadKey(input);
int howmuch = Config.incremental_seeking ? (myPlaylist->Timer()-t)/2+Config.seek_time : Config.seek_time; int howmuch = Config.incremental_seeking ? (myPlaylist->Timer()-t)/2+Config.seek_time : Config.seek_time;
@@ -1179,15 +1183,15 @@ int main(int argc, char *argv[])
if (Config.columns_in_playlist) if (Config.columns_in_playlist)
{ {
myPlaylist->Main()->SetItemDisplayer(Display::SongsInColumns); myPlaylist->Items->SetItemDisplayer(Display::SongsInColumns);
myPlaylist->Main()->SetTitle(Display::Columns()); myPlaylist->Items->SetTitle(Display::Columns());
myPlaylist->Main()->SetGetStringFunction(Playlist::SongInColumnsToString); myPlaylist->Items->SetGetStringFunction(Playlist::SongInColumnsToString);
} }
else else
{ {
myPlaylist->Main()->SetItemDisplayer(Display::Songs); myPlaylist->Items->SetItemDisplayer(Display::Songs);
myPlaylist->Main()->SetTitle(""); myPlaylist->Items->SetTitle("");
myPlaylist->Main()->SetGetStringFunction(Playlist::SongToString); myPlaylist->Items->SetGetStringFunction(Playlist::SongToString);
} }
} }
else if (myScreen == myBrowser) else if (myScreen == myBrowser)
@@ -1220,8 +1224,8 @@ int main(int argc, char *argv[])
{ {
Config.autocenter_mode = !Config.autocenter_mode; Config.autocenter_mode = !Config.autocenter_mode;
ShowMessage("Auto center mode: %s", Config.autocenter_mode ? "On" : "Off"); ShowMessage("Auto center mode: %s", Config.autocenter_mode ? "On" : "Off");
if (Config.autocenter_mode && myPlaylist->isPlaying() && !myPlaylist->Main()->isFiltered()) if (Config.autocenter_mode && myPlaylist->isPlaying() && !myPlaylist->Items->isFiltered())
myPlaylist->Main()->Highlight(myPlaylist->NowPlaying); myPlaylist->Items->Highlight(myPlaylist->NowPlaying);
} }
else if (Keypressed(input, Key.UpdateDB)) else if (Keypressed(input, Key.UpdateDB))
{ {
@@ -1239,7 +1243,7 @@ int main(int argc, char *argv[])
if (myScreen == myPlaylist && myPlaylist->isPlaying()) if (myScreen == myPlaylist && myPlaylist->isPlaying())
{ {
CHECK_PLAYLIST_FOR_FILTERING; CHECK_PLAYLIST_FOR_FILTERING;
myPlaylist->Main()->Highlight(myPlaylist->NowPlaying); myPlaylist->Items->Highlight(myPlaylist->NowPlaying);
} }
else if (myScreen == myBrowser) else if (myScreen == myBrowser)
{ {
@@ -1552,17 +1556,17 @@ int main(int argc, char *argv[])
else if (Keypressed(input, Key.Crop)) else if (Keypressed(input, Key.Crop))
{ {
CHECK_PLAYLIST_FOR_FILTERING; CHECK_PLAYLIST_FOR_FILTERING;
if (myPlaylist->Main()->hasSelected()) if (myPlaylist->Items->hasSelected())
{ {
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (int i = myPlaylist->Main()->Size()-1; i >= 0; --i) for (int i = myPlaylist->Items->Size()-1; i >= 0; --i)
{ {
if (!myPlaylist->Main()->isSelected(i) && i != myPlaylist->NowPlaying) if (!myPlaylist->Items->isSelected(i) && i != myPlaylist->NowPlaying)
Mpd.Delete(i); Mpd.Delete(i);
} }
// if mpd deletes now playing song deletion will be sluggishly slow // if mpd deletes now playing song deletion will be sluggishly slow
// then so we have to assure it will be deleted at the very end. // then so we have to assure it will be deleted at the very end.
if (myPlaylist->isPlaying() && !myPlaylist->Main()->isSelected(myPlaylist->NowPlaying)) if (myPlaylist->isPlaying() && !myPlaylist->Items->isSelected(myPlaylist->NowPlaying))
Mpd.DeleteID(myPlaylist->NowPlayingSong()->GetID()); Mpd.DeleteID(myPlaylist->NowPlayingSong()->GetID());
ShowMessage("Deleting all items but selected..."); ShowMessage("Deleting all items but selected...");
@@ -1577,7 +1581,7 @@ int main(int argc, char *argv[])
continue; continue;
} }
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (int i = myPlaylist->Main()->Size()-1; i >= 0; --i) for (int i = myPlaylist->Items->Size()-1; i >= 0; --i)
if (i != myPlaylist->NowPlaying) if (i != myPlaylist->NowPlaying)
Mpd.Delete(i); Mpd.Delete(i);
ShowMessage("Deleting all items except now playing one..."); ShowMessage("Deleting all items except now playing one...");
@@ -1616,12 +1620,12 @@ int main(int argc, char *argv[])
} }
} }
if (myPlaylist->Main()->isFiltered()) if (myPlaylist->Items->isFiltered())
{ {
ShowMessage("Deleting filtered items..."); ShowMessage("Deleting filtered items...");
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (int i = myPlaylist->Main()->Size()-1; i >= 0; --i) for (int i = myPlaylist->Items->Size()-1; i >= 0; --i)
Mpd.Delete((*myPlaylist->Main())[i].GetPosition()); Mpd.Delete((*myPlaylist->Items)[i].GetPosition());
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();
ShowMessage("Filtered items deleted!"); ShowMessage("Filtered items deleted!");
} }

View File

@@ -37,49 +37,52 @@ bool Playlist::ReloadRemaining = 0;
bool Playlist::BlockNowPlayingUpdate = 0; bool Playlist::BlockNowPlayingUpdate = 0;
bool Playlist::BlockUpdate = 0; bool Playlist::BlockUpdate = 0;
bool Playlist::BlockRefreshing = 0;
Menu< std::pair<std::string, MPD::Song::GetFunction> > *Playlist::SortDialog;
const size_t Playlist::SortOptions = 10; const size_t Playlist::SortOptions = 10;
const size_t Playlist::SortDialogWidth = 30; const size_t Playlist::SortDialogWidth = 30;
size_t Playlist::SortDialogHeight; size_t Playlist::SortDialogHeight;
Menu< std::pair<std::string, MPD::Song::GetFunction> > *Playlist::SortDialog = 0;
void Playlist::Init() void Playlist::Init()
{ {
w = new Menu<MPD::Song>(0, MainStartY, COLS, MainHeight, Config.columns_in_playlist ? Display::Columns() : "", Config.main_color, brNone); Items = new Menu<MPD::Song>(0, MainStartY, COLS, MainHeight, Config.columns_in_playlist ? Display::Columns() : "", Config.main_color, brNone);
w->SetTimeout(ncmpcpp_window_timeout); Items->SetTimeout(ncmpcpp_window_timeout);
w->CyclicScrolling(Config.use_cyclic_scrolling); Items->CyclicScrolling(Config.use_cyclic_scrolling);
w->HighlightColor(Config.main_highlight_color); Items->HighlightColor(Config.main_highlight_color);
w->SetSelectPrefix(&Config.selected_item_prefix); Items->SetSelectPrefix(&Config.selected_item_prefix);
w->SetSelectSuffix(&Config.selected_item_suffix); Items->SetSelectSuffix(&Config.selected_item_suffix);
w->SetItemDisplayer(Config.columns_in_playlist ? Display::SongsInColumns : Display::Songs); Items->SetItemDisplayer(Config.columns_in_playlist ? Display::SongsInColumns : Display::Songs);
w->SetItemDisplayerUserData(&Config.song_list_format); Items->SetItemDisplayerUserData(&Config.song_list_format);
w->SetGetStringFunction(Config.columns_in_playlist ? SongInColumnsToString : SongToString); Items->SetGetStringFunction(Config.columns_in_playlist ? SongInColumnsToString : SongToString);
w->SetGetStringFunctionUserData(&Config.song_list_format); Items->SetGetStringFunctionUserData(&Config.song_list_format);
SortDialogHeight = std::min(int(MainHeight-2), 18); if (!SortDialog)
{
SortDialog = new Menu< std::pair<std::string, MPD::Song::GetFunction> >((COLS-SortDialogWidth)/2, (MainHeight-SortDialogHeight)/2+MainStartY, SortDialogWidth, SortDialogHeight, "Sort songs by...", Config.main_color, Config.window_border); SortDialogHeight = std::min(int(MainHeight), 18);
SortDialog->SetTimeout(ncmpcpp_window_timeout);
SortDialog->CyclicScrolling(Config.use_cyclic_scrolling); SortDialog = new Menu< std::pair<std::string, MPD::Song::GetFunction> >((COLS-SortDialogWidth)/2, (MainHeight-SortDialogHeight)/2+MainStartY, SortDialogWidth, SortDialogHeight, "Sort songs by...", Config.main_color, Config.window_border);
SortDialog->SetItemDisplayer(Display::Pairs); SortDialog->SetTimeout(ncmpcpp_window_timeout);
SortDialog->CyclicScrolling(Config.use_cyclic_scrolling);
SortDialog->AddOption(std::make_pair("Artist", &MPD::Song::GetArtist)); SortDialog->SetItemDisplayer(Display::Pairs);
SortDialog->AddOption(std::make_pair("Album", &MPD::Song::GetAlbum));
SortDialog->AddOption(std::make_pair("Disc", &MPD::Song::GetDisc)); SortDialog->AddOption(std::make_pair("Artist", &MPD::Song::GetArtist));
SortDialog->AddOption(std::make_pair("Track", &MPD::Song::GetTrack)); SortDialog->AddOption(std::make_pair("Album", &MPD::Song::GetAlbum));
SortDialog->AddOption(std::make_pair("Genre", &MPD::Song::GetGenre)); SortDialog->AddOption(std::make_pair("Disc", &MPD::Song::GetDisc));
SortDialog->AddOption(std::make_pair("Year", &MPD::Song::GetDate)); SortDialog->AddOption(std::make_pair("Track", &MPD::Song::GetTrack));
SortDialog->AddOption(std::make_pair("Composer", &MPD::Song::GetComposer)); SortDialog->AddOption(std::make_pair("Genre", &MPD::Song::GetGenre));
SortDialog->AddOption(std::make_pair("Performer", &MPD::Song::GetPerformer)); SortDialog->AddOption(std::make_pair("Year", &MPD::Song::GetDate));
SortDialog->AddOption(std::make_pair("Title", &MPD::Song::GetTitle)); SortDialog->AddOption(std::make_pair("Composer", &MPD::Song::GetComposer));
SortDialog->AddOption(std::make_pair("Filename", &MPD::Song::GetFile)); SortDialog->AddOption(std::make_pair("Performer", &MPD::Song::GetPerformer));
SortDialog->AddSeparator(); SortDialog->AddOption(std::make_pair("Title", &MPD::Song::GetTitle));
SortDialog->AddOption(std::make_pair("Sort", static_cast<MPD::Song::GetFunction>(0))); SortDialog->AddOption(std::make_pair("Filename", &MPD::Song::GetFile));
SortDialog->AddOption(std::make_pair("Reverse", static_cast<MPD::Song::GetFunction>(0))); SortDialog->AddSeparator();
SortDialog->AddOption(std::make_pair("Cancel", static_cast<MPD::Song::GetFunction>(0))); SortDialog->AddOption(std::make_pair("Sort", static_cast<MPD::Song::GetFunction>(0)));
SortDialog->AddOption(std::make_pair("Reverse", static_cast<MPD::Song::GetFunction>(0)));
SortDialog->AddOption(std::make_pair("Cancel", static_cast<MPD::Song::GetFunction>(0)));
}
w = Items;
isInitialized = 1; isInitialized = 1;
} }
@@ -97,20 +100,30 @@ void Playlist::SwitchTo()
Resize(); Resize();
myScreen = this; myScreen = this;
w->Window::Clear(); Items->Window::Clear();
EnableHighlighting(); EnableHighlighting();
if (w != Items) // even if sorting window is active, background has to be refreshed anyway
Items->Display();
RedrawHeader = 1; RedrawHeader = 1;
} }
void Playlist::Resize() void Playlist::Resize()
{ {
w->Resize(COLS, MainHeight); Items->Resize(COLS, MainHeight);
w->MoveTo(0, MainStartY); Items->MoveTo(0, MainStartY);
w->SetTitle(Config.columns_in_playlist ? Display::Columns() : ""); Items->SetTitle(Config.columns_in_playlist ? Display::Columns() : "");
if (w == SortDialog) // if sorting window is active, playlist needs refreshing
Items->Display();
SortDialogHeight = std::min(int(MainHeight), 18); SortDialogHeight = std::min(int(MainHeight), 18);
if (MainHeight > 5) if (Items->GetWidth() >= SortDialogWidth && MainHeight >= 5)
{
SortDialog->Resize(SortDialogWidth, SortDialogHeight); SortDialog->Resize(SortDialogWidth, SortDialogHeight);
SortDialog->MoveTo((COLS-SortDialogWidth)/2, (MainHeight-SortDialogHeight)/2+MainStartY); SortDialog->MoveTo((COLS-SortDialogWidth)/2, (MainHeight-SortDialogHeight)/2+MainStartY);
}
else // if screen is too low to display sorting window, fall back to items list
w = Items;
hasToBeResized = 0; hasToBeResized = 0;
} }
@@ -119,212 +132,192 @@ std::basic_string<my_char_t> Playlist::Title()
std::basic_string<my_char_t> result = U("Playlist "); std::basic_string<my_char_t> result = U("Playlist ");
if (ReloadTotalLength || ReloadRemaining) if (ReloadTotalLength || ReloadRemaining)
itsBufferedStats = TotalLength(); itsBufferedStats = TotalLength();
result += Scroller(itsBufferedStats, itsScrollBegin, w->GetWidth()-result.length()-(Config.new_design ? 2 : VolumeState.length())); result += Scroller(itsBufferedStats, itsScrollBegin, Items->GetWidth()-result.length()-(Config.new_design ? 2 : VolumeState.length()));
return result; return result;
} }
void Playlist::EnterPressed() void Playlist::EnterPressed()
{ {
if (!w->Empty()) if (w == Items)
{ {
Mpd.PlayID(w->Current().GetID()); if (!Items->Empty())
UpdateStatusImmediately = 1; {
Mpd.PlayID(Items->Current().GetID());
UpdateStatusImmediately = 1;
}
}
else if (w == SortDialog)
{
size_t pos = SortDialog->Choice();
if (pos > SortOptions)
{
if (pos == SortOptions+2) // reverse
{
BlockUpdate = 1;
ShowMessage("Reversing playlist order...");
Mpd.StartCommandsList();
for (size_t i = 0, j = Items->Size()-1; i < Items->Size()/2; ++i, --j)
{
Mpd.Swap(i, j);
Items->Swap(i, j);
}
ShowMessage(Mpd.CommitCommandsList() ? "Playlist reversed!" : "Error while reversing playlist!");
w = Items;
return;
}
else if (pos == SortOptions+3) // cancel
{
w = Items;
return;
}
}
else
{
ShowMessage("Move tag types up and down to adjust sort order");
return;
}
MPD::SongList playlist, cmp;
playlist.reserve(Items->Size());
for (size_t i = 0; i < Items->Size(); ++i)
{
(*Items)[i].SetPosition(i);
playlist.push_back(&(*Items)[i]);
}
cmp = playlist;
sort(playlist.begin(), playlist.end(), Playlist::Sorting);
if (playlist == cmp)
{
ShowMessage("Playlist is already sorted");
return;
}
BlockUpdate = 1;
ShowMessage("Sorting playlist...");
Mpd.StartCommandsList();
do
{
for (size_t i = 0; i < playlist.size(); ++i)
{
if (playlist[i]->GetPosition() > int(i))
{
Mpd.Swap(playlist[i]->GetPosition(), i);
std::swap(cmp[playlist[i]->GetPosition()], cmp[i]);
Items->Swap(playlist[i]->GetPosition(), i);
}
cmp[i]->SetPosition(i);
}
}
while (playlist != cmp);
ShowMessage(Mpd.CommitCommandsList() ? "Playlist sorted!" : "Error while sorting playlist!");
w = Items;
} }
} }
void Playlist::SpacePressed() void Playlist::SpacePressed()
{ {
w->SelectCurrent(); if (w == Items)
w->Scroll(wDown); {
Items->SelectCurrent();
Items->Scroll(wDown);
}
} }
void Playlist::MouseButtonPressed(MEVENT me) void Playlist::MouseButtonPressed(MEVENT me)
{ {
if (w->Empty() || !w->hasCoords(me.x, me.y) || size_t(me.y) >= w->Size()) if (w == Items && !Items->Empty() && Items->hasCoords(me.x, me.y))
return;
if (me.bstate & (BUTTON1_PRESSED | BUTTON3_PRESSED))
{ {
w->Goto(me.y); if (size_t(me.y) < Items->Size() && (me.bstate & (BUTTON1_PRESSED | BUTTON3_PRESSED)))
if (me.bstate & BUTTON3_PRESSED)
{ {
Mpd.Play(w->Current().GetPosition()); Items->Goto(me.y);
UpdateStatusImmediately = 1; if (me.bstate & BUTTON3_PRESSED)
EnterPressed();
} }
else
Screen<Window>::MouseButtonPressed(me);
}
else if (w == SortDialog && SortDialog->hasCoords(me.x, me.y))
{
if (me.bstate & (BUTTON1_PRESSED | BUTTON3_PRESSED))
{
SortDialog->Goto(me.y);
if (me.bstate & BUTTON3_PRESSED)
EnterPressed();
}
else
Screen<Window>::MouseButtonPressed(me);
} }
else
Screen< Menu<MPD::Song> >::MouseButtonPressed(me);
} }
MPD::Song *Playlist::CurrentSong() MPD::Song *Playlist::CurrentSong()
{ {
return !w->Empty() ? &w->Current() : 0; return !Items->Empty() ? &Items->Current() : 0;
} }
void Playlist::GetSelectedSongs(MPD::SongList &v) void Playlist::GetSelectedSongs(MPD::SongList &v)
{ {
std::vector<size_t> selected; std::vector<size_t> selected;
w->GetSelected(selected); Items->GetSelected(selected);
for (std::vector<size_t>::const_iterator it = selected.begin(); it != selected.end(); ++it) for (std::vector<size_t>::const_iterator it = selected.begin(); it != selected.end(); ++it)
{ v.push_back(new MPD::Song(Items->at(*it)));
v.push_back(new MPD::Song(w->at(*it)));
}
} }
void Playlist::ApplyFilter(const std::string &s) void Playlist::ApplyFilter(const std::string &s)
{ {
w->ApplyFilter(s, 0, REG_ICASE | Config.regex_type); if (w == Items)
Items->ApplyFilter(s, 0, REG_ICASE | Config.regex_type);
} }
void Playlist::Sort() void Playlist::Sort()
{ {
if (w->GetWidth() < SortDialogWidth || MainHeight <= 6) if (Items->GetWidth() < SortDialogWidth || MainHeight < 5)
{
ShowMessage("Screen is too small to display dialog window!"); ShowMessage("Screen is too small to display dialog window!");
return; else
}
int input;
SortDialog->Reset();
SortDialog->Display();
BlockRefreshing = 1;
while (1)
{ {
TraceMpdStatus(); SortDialog->Reset();
SortDialog->Refresh(); w = SortDialog;
SortDialog->ReadKey(input); }
}
if (Keypressed(input, Key.Up))
void Playlist::AdjustSortOrder(int key)
{
if (Keypressed(key, Key.MvSongUp))
{
size_t pos = SortDialog->Choice();
if (pos > 0 && pos < SortOptions)
{ {
SortDialog->Swap(pos, pos-1);
SortDialog->Scroll(wUp); SortDialog->Scroll(wUp);
} }
else if (Keypressed(input, Key.Down)) }
else if (Keypressed(key, Key.MvSongDown))
{
size_t pos = SortDialog->Choice();
if (pos < SortOptions-1)
{ {
SortDialog->Swap(pos, pos+1);
SortDialog->Scroll(wDown); SortDialog->Scroll(wDown);
} }
else if (Keypressed(input, Key.PageUp))
{
SortDialog->Scroll(wPageUp);
}
else if (Keypressed(input, Key.PageDown))
{
SortDialog->Scroll(wPageDown);
}
else if (Keypressed(input, Key.Home))
{
SortDialog->Scroll(wHome);
}
else if (Keypressed(input, Key.End))
{
SortDialog->Scroll(wEnd);
}
else if (Keypressed(input, Key.MvSongUp))
{
size_t pos = SortDialog->Choice();
if (pos > 0 && pos < SortOptions)
{
SortDialog->Swap(pos, pos-1);
SortDialog->Scroll(wUp);
}
}
else if (Keypressed(input, Key.MvSongDown))
{
size_t pos = SortDialog->Choice();
if (pos < SortOptions-1)
{
SortDialog->Swap(pos, pos+1);
SortDialog->Scroll(wDown);
}
}
else if (Keypressed(input, Key.Enter))
{
size_t pos = SortDialog->Choice();
if (pos > SortOptions)
{
BlockRefreshing = 0;
if (pos == SortOptions+1) // sort
break;
else if (pos == SortOptions+2) // reverse
{
BlockUpdate = 1;
ShowMessage("Reversing playlist order...");
Mpd.StartCommandsList();
for (size_t i = 0, j = w->Size()-1; i < w->Size()/2; ++i, --j)
{
Mpd.Swap(i, j);
w->Swap(i, j);
}
Mpd.CommitCommandsList();
ShowMessage("Playlist reversed!");
return;
}
else if (pos == SortOptions+3) // cancel
return;
}
else
{
ShowMessage("Move tag types up and down to adjust sort order");
}
}
} }
MPD::SongList playlist, cmp;
playlist.reserve(w->Size());
for (size_t i = 0; i < w->Size(); ++i)
{
(*w)[i].SetPosition(i);
playlist.push_back(&(*w)[i]);
}
cmp = playlist;
sort(playlist.begin(), playlist.end(), Playlist::Sorting);
if (playlist == cmp)
{
ShowMessage("Playlist is already sorted");
return;
}
BlockUpdate = 1;
ShowMessage("Sorting playlist...");
Mpd.StartCommandsList();
do
{
for (size_t i = 0; i < playlist.size(); ++i)
{
if (playlist[i]->GetPosition() > int(i))
{
Mpd.Swap(playlist[i]->GetPosition(), i);
std::swap(cmp[playlist[i]->GetPosition()], cmp[i]);
w->Swap(playlist[i]->GetPosition(), i);
}
cmp[i]->SetPosition(i);
}
}
while (playlist != cmp);
Mpd.CommitCommandsList();
ShowMessage("Playlist sorted!");
} }
void Playlist::FixPositions(size_t beginning) void Playlist::FixPositions(size_t beginning)
{ {
bool was_filtered = w->isFiltered(); bool was_filtered = Items->isFiltered();
w->ShowAll(); Items->ShowAll();
for (size_t i = beginning; i < w->Size(); ++i) for (size_t i = beginning; i < Items->Size(); ++i)
{ (*Items)[i].SetPosition(i);
(*w)[i].SetPosition(i);
}
if (was_filtered) if (was_filtered)
w->ShowFiltered(); Items->ShowFiltered();
} }
void Playlist::EnableHighlighting() void Playlist::EnableHighlighting()
{ {
w->Highlighting(1); Items->Highlighting(1);
w->Refresh(); if (w == Items)
Items->Refresh();
UpdateTimer(); UpdateTimer();
} }
@@ -354,26 +347,26 @@ std::string Playlist::TotalLength()
if (ReloadTotalLength) if (ReloadTotalLength)
{ {
itsTotalLength = 0; itsTotalLength = 0;
for (size_t i = 0; i < w->Size(); ++i) for (size_t i = 0; i < Items->Size(); ++i)
itsTotalLength += (*w)[i].GetTotalLength(); itsTotalLength += (*Items)[i].GetTotalLength();
ReloadTotalLength = 0; ReloadTotalLength = 0;
} }
if (Config.playlist_show_remaining_time && ReloadRemaining && !w->isFiltered()) if (Config.playlist_show_remaining_time && ReloadRemaining && !Items->isFiltered())
{ {
itsRemainingTime = 0; itsRemainingTime = 0;
for (size_t i = NowPlaying; i < w->Size(); ++i) for (size_t i = NowPlaying; i < Items->Size(); ++i)
itsRemainingTime += (*w)[i].GetTotalLength(); itsRemainingTime += (*Items)[i].GetTotalLength();
ReloadRemaining = 0; ReloadRemaining = 0;
} }
result << '(' << w->Size() << (w->Size() == 1 ? " item" : " items"); result << '(' << Items->Size() << (Items->Size() == 1 ? " item" : " items");
if (w->isFiltered()) if (Items->isFiltered())
{ {
w->ShowAll(); Items->ShowAll();
size_t real_size = w->Size(); size_t real_size = Items->Size();
w->ShowFiltered(); Items->ShowFiltered();
if (w->Size() != real_size) if (Items->Size() != real_size)
result << " (out of " << Mpd.GetPlaylistLength() << ")"; result << " (out of " << Mpd.GetPlaylistLength() << ")";
} }
@@ -382,7 +375,7 @@ std::string Playlist::TotalLength()
result << ", length: "; result << ", length: ";
ShowTime(result, itsTotalLength); ShowTime(result, itsTotalLength);
} }
if (Config.playlist_show_remaining_time && itsRemainingTime && !w->isFiltered() && w->Size() > 1) if (Config.playlist_show_remaining_time && itsRemainingTime && !Items->isFiltered() && Items->Size() > 1)
{ {
result << " :: remaining: "; result << " :: remaining: ";
ShowTime(result, itsRemainingTime); ShowTime(result, itsRemainingTime);
@@ -436,11 +429,11 @@ void Playlist::ShowTime(std::ostringstream &result, size_t length)
const MPD::Song *Playlist::NowPlayingSong() const MPD::Song *Playlist::NowPlayingSong()
{ {
bool was_filtered = w->isFiltered(); bool was_filtered = Items->isFiltered();
w->ShowAll(); Items->ShowAll();
const MPD::Song *s = isPlaying() ? &w->at(NowPlaying) : 0; const MPD::Song *s = isPlaying() ? &Items->at(NowPlaying) : 0;
if (was_filtered) if (was_filtered)
w->ShowFiltered(); Items->ShowFiltered();
return s; return s;
} }
@@ -480,9 +473,9 @@ bool Playlist::Add(const MPD::Song &s, bool in_playlist, bool play)
unsigned hash = s.GetHash(); unsigned hash = s.GetHash();
if (play) if (play)
{ {
for (size_t i = 0; i < w->Size(); ++i) for (size_t i = 0; i < Items->Size(); ++i)
{ {
if (w->at(i).GetHash() == hash) if (Items->at(i).GetHash() == hash)
{ {
Mpd.Play(i); Mpd.Play(i);
break; break;
@@ -494,12 +487,12 @@ bool Playlist::Add(const MPD::Song &s, bool in_playlist, bool play)
{ {
Playlist::BlockUpdate = 1; Playlist::BlockUpdate = 1;
Mpd.StartCommandsList(); Mpd.StartCommandsList();
for (size_t i = 0; i < w->Size(); ++i) for (size_t i = 0; i < Items->Size(); ++i)
{ {
if ((*w)[i].GetHash() == hash) if ((*Items)[i].GetHash() == hash)
{ {
Mpd.Delete(i); Mpd.Delete(i);
w->DeleteOption(i); Items->DeleteOption(i);
i--; i--;
} }
} }
@@ -528,7 +521,7 @@ bool Playlist::Add(const MPD::SongList &l, bool play)
if (l.empty()) if (l.empty())
return false; return false;
size_t old_playlist_size = w->Size(); size_t old_playlist_size = Items->Size();
Mpd.StartCommandsList(); Mpd.StartCommandsList();
MPD::SongList::const_iterator it = l.begin(); MPD::SongList::const_iterator it = l.begin();
@@ -537,10 +530,10 @@ bool Playlist::Add(const MPD::SongList &l, bool play)
break; break;
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();
if (play && old_playlist_size < w->Size()) if (play && old_playlist_size < Items->Size())
Mpd.Play(old_playlist_size); Mpd.Play(old_playlist_size);
if (w->Back().GetHash() != l.back()->GetHash()) if (Items->Back().GetHash() != l.back()->GetHash())
{ {
if (it != l.begin()) if (it != l.begin())
ShowMessage("%s", MPD::Message::PartOfSongsAdded); ShowMessage("%s", MPD::Message::PartOfSongsAdded);

View File

@@ -27,7 +27,7 @@
#include "screen.h" #include "screen.h"
#include "song.h" #include "song.h"
class Playlist : public Screen< Menu<MPD::Song> > class Playlist : public Screen<Window>
{ {
public: public:
Playlist() : NowPlaying(-1), OldPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { } Playlist() : NowPlaying(-1), OldPlaying(-1), itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) { }
@@ -44,18 +44,20 @@ class Playlist : public Screen< Menu<MPD::Song> >
virtual MPD::Song *CurrentSong(); virtual MPD::Song *CurrentSong();
virtual bool allowsSelection() { return true; } virtual bool allowsSelection() { return w == Items; }
virtual void ReverseSelection() { w->ReverseSelection(); } virtual void ReverseSelection() { Items->ReverseSelection(); }
virtual void GetSelectedSongs(MPD::SongList &); virtual void GetSelectedSongs(MPD::SongList &);
virtual void ApplyFilter(const std::string &); virtual void ApplyFilter(const std::string &);
virtual List *GetList() { return w; } virtual List *GetList() { return w == Items ? Items : 0; }
bool isPlaying() { return NowPlaying >= 0 && !w->Empty(); } bool isPlaying() { return NowPlaying >= 0 && !Items->Empty(); }
const MPD::Song *NowPlayingSong(); const MPD::Song *NowPlayingSong();
void Sort(); void Sort();
void AdjustSortOrder(int key);
bool SortingInProgress() { return w == SortDialog; }
void FixPositions(size_t = 0); void FixPositions(size_t = 0);
void EnableHighlighting(); void EnableHighlighting();
@@ -68,6 +70,8 @@ class Playlist : public Screen< Menu<MPD::Song> >
static std::string SongToString(const MPD::Song &, void *); static std::string SongToString(const MPD::Song &, void *);
static std::string SongInColumnsToString(const MPD::Song &, void *); static std::string SongInColumnsToString(const MPD::Song &, void *);
Menu< MPD::Song > *Items;
int NowPlaying; int NowPlaying;
int OldPlaying; int OldPlaying;
@@ -76,7 +80,6 @@ class Playlist : public Screen< Menu<MPD::Song> >
static bool BlockNowPlayingUpdate; static bool BlockNowPlayingUpdate;
static bool BlockUpdate; static bool BlockUpdate;
static bool BlockRefreshing;
protected: protected:
virtual void Init(); virtual void Init();
@@ -96,7 +99,6 @@ class Playlist : public Screen< Menu<MPD::Song> >
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;
static const size_t SortOptions; static const size_t SortOptions;
static const size_t SortDialogWidth; static const size_t SortDialogWidth;
static size_t SortDialogHeight; static size_t SortDialogHeight;

View File

@@ -139,9 +139,9 @@ void PlaylistEditor::Update()
bool bold = 0; bool bold = 0;
for (SongList::const_iterator it = list.begin(); it != list.end(); ++it) for (SongList::const_iterator it = list.begin(); it != list.end(); ++it)
{ {
for (size_t j = 0; j < myPlaylist->Main()->Size(); ++j) for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
{ {
if ((*it)->GetHash() == myPlaylist->Main()->at(j).GetHash()) if ((*it)->GetHash() == myPlaylist->Items->at(j).GetHash())
{ {
bold = 1; bold = 1;
break; break;

View File

@@ -303,9 +303,9 @@ void SearchEngine::UpdateFoundList()
bool bold = 0; bool bold = 0;
for (size_t i = StaticOptions; i < w->Size(); ++i) for (size_t i = StaticOptions; i < w->Size(); ++i)
{ {
for (size_t j = 0; j < myPlaylist->Main()->Size(); ++j) for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
{ {
if (myPlaylist->Main()->at(j).GetHash() == w->at(i).second->GetHash()) if (myPlaylist->Items->at(j).GetHash() == w->at(i).second->GetHash())
{ {
bold = 1; bold = 1;
break; break;
@@ -375,9 +375,9 @@ void SearchEngine::Search()
Mpd.GetDirectoryRecursive("/", list); Mpd.GetDirectoryRecursive("/", list);
else else
{ {
list.reserve(myPlaylist->Main()->Size()); list.reserve(myPlaylist->Items->Size());
for (size_t i = 0; i < myPlaylist->Main()->Size(); ++i) for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
list.push_back(&(*myPlaylist->Main())[i]); list.push_back(&(*myPlaylist->Items)[i]);
} }
bool any_found = 1; bool any_found = 1;

View File

@@ -130,7 +130,7 @@ void TraceMpdStatus()
wFooter->Refresh(); wFooter->Refresh();
if (myScreen == myPlaylist && now.tv_sec == myPlaylist->Timer()+Config.playlist_disable_highlight_delay) if (myScreen == myPlaylist && now.tv_sec == myPlaylist->Timer()+Config.playlist_disable_highlight_delay)
myPlaylist->Main()->Highlighting(!Config.playlist_disable_highlight_delay); myPlaylist->Items->Highlighting(!Config.playlist_disable_highlight_delay);
if (lock_statusbar_delay > 0) if (lock_statusbar_delay > 0)
{ {
@@ -187,20 +187,20 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
{ {
myPlaylist->OldPlaying = myPlaylist->NowPlaying; myPlaylist->OldPlaying = myPlaylist->NowPlaying;
myPlaylist->NowPlaying = Mpd.GetCurrentSongPos(); myPlaylist->NowPlaying = Mpd.GetCurrentSongPos();
bool was_filtered = myPlaylist->Main()->isFiltered(); bool was_filtered = myPlaylist->Items->isFiltered();
myPlaylist->Main()->ShowAll(); myPlaylist->Items->ShowAll();
try try
{ {
myPlaylist->Main()->BoldOption(myPlaylist->OldPlaying, 0); myPlaylist->Items->BoldOption(myPlaylist->OldPlaying, 0);
} }
catch (std::out_of_range) { } catch (std::out_of_range) { }
try try
{ {
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 1); myPlaylist->Items->BoldOption(myPlaylist->NowPlaying, 1);
} }
catch (std::out_of_range) { } catch (std::out_of_range) { }
if (was_filtered) if (was_filtered)
myPlaylist->Main()->ShowFiltered(); myPlaylist->Items->ShowFiltered();
} }
if (changed.Playlist) if (changed.Playlist)
@@ -211,44 +211,44 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
if (Mpd.GetState() > psStop) if (Mpd.GetState() > psStop)
WindowTitle(utf_to_locale_cpy(np.toString(Config.song_window_title_format))); WindowTitle(utf_to_locale_cpy(np.toString(Config.song_window_title_format)));
bool was_filtered = myPlaylist->Main()->isFiltered(); bool was_filtered = myPlaylist->Items->isFiltered();
myPlaylist->Main()->ShowAll(); myPlaylist->Items->ShowAll();
SongList list; SongList list;
size_t playlist_length = Mpd.GetPlaylistLength(); size_t playlist_length = Mpd.GetPlaylistLength();
if (playlist_length < myPlaylist->Main()->Size()) if (playlist_length < myPlaylist->Items->Size())
myPlaylist->Main()->ResizeList(playlist_length); myPlaylist->Items->ResizeList(playlist_length);
Mpd.GetPlaylistChanges(Mpd.GetOldPlaylistID(), list); Mpd.GetPlaylistChanges(Mpd.GetOldPlaylistID(), list);
myPlaylist->Main()->Reserve(playlist_length); myPlaylist->Items->Reserve(playlist_length);
for (SongList::const_iterator it = list.begin(); it != list.end(); ++it) for (SongList::const_iterator it = list.begin(); it != list.end(); ++it)
{ {
int pos = (*it)->GetPosition(); int pos = (*it)->GetPosition();
if (pos < int(myPlaylist->Main()->Size())) if (pos < int(myPlaylist->Items->Size()))
{ {
// if song's already in playlist, replace it with a new one // if song's already in playlist, replace it with a new one
myPlaylist->Main()->at(pos) = **it; myPlaylist->Items->at(pos) = **it;
} }
else else
{ {
// otherwise just add it to playlist // otherwise just add it to playlist
myPlaylist->Main()->AddOption(**it, myPlaylist->NowPlaying == pos); myPlaylist->Items->AddOption(**it, myPlaylist->NowPlaying == pos);
} }
myPlaylist->Main()->at(pos).CopyPtr(0); myPlaylist->Items->at(pos).CopyPtr(0);
(*it)->NullMe(); (*it)->NullMe();
} }
if (myScreen == myPlaylist) if (myScreen == myPlaylist)
{ {
if (!playlist_length || myPlaylist->Main()->Size() < myPlaylist->Main()->GetHeight()) if (!playlist_length || myPlaylist->Items->Size() < myPlaylist->Items->GetHeight())
myPlaylist->Main()->Window::Clear(); myPlaylist->Items->Window::Clear();
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
} }
if (was_filtered) if (was_filtered)
{ {
myPlaylist->ApplyFilter(myPlaylist->Main()->GetFilter()); myPlaylist->ApplyFilter(myPlaylist->Items->GetFilter());
if (myPlaylist->Main()->Empty()) if (myPlaylist->Items->Empty())
myPlaylist->Main()->ShowAll(); myPlaylist->Items->ShowAll();
} }
FreeSongList(list); FreeSongList(list);
} }
@@ -259,9 +259,9 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
if (myScreen == myPlaylist) if (myScreen == myPlaylist)
RedrawHeader = 1; RedrawHeader = 1;
if (myPlaylist->Main()->Empty()) if (myPlaylist->Items->Empty())
{ {
myPlaylist->Main()->Reset(); myPlaylist->Items->Reset();
ShowMessage("Cleared playlist!"); ShowMessage("Cleared playlist!");
} }
@@ -376,8 +376,8 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
system(Config.execute_on_song_change.c_str()); system(Config.execute_on_song_change.c_str());
if (Mpd.GetState() > psStop) if (Mpd.GetState() > psStop)
WindowTitle(utf_to_locale_cpy(np.toString(Config.song_window_title_format))); WindowTitle(utf_to_locale_cpy(np.toString(Config.song_window_title_format)));
if (Config.autocenter_mode && !myPlaylist->Main()->isFiltered()) if (Config.autocenter_mode && !myPlaylist->Items->isFiltered())
myPlaylist->Main()->Highlight(myPlaylist->NowPlaying); myPlaylist->Items->Highlight(myPlaylist->NowPlaying);
if (!Mpd.GetElapsedTime()) if (!Mpd.GetElapsedTime())
mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth()); mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth());
@@ -627,8 +627,8 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
wHeader->SetColor(Config.header_color); wHeader->SetColor(Config.header_color);
wHeader->Refresh(); wHeader->Refresh();
} }
if (myScreen == myPlaylist && !Playlist::BlockRefreshing) if (myScreen->ActiveWindow() == myPlaylist->Items)
myPlaylist->Main()->Refresh(); myPlaylist->Items->Refresh();
*wFooter << fmtBoldEnd; *wFooter << fmtBoldEnd;
wFooter->GotoXY(sx, sy); wFooter->GotoXY(sx, sy);
wFooter->Refresh(); wFooter->Refresh();

View File

@@ -201,7 +201,7 @@ void TinyTagEditor::EnterPressed()
else else
{ {
if (myOldScreen == myPlaylist) if (myOldScreen == myPlaylist)
myPlaylist->Main()->Current() = s; myPlaylist->Items->Current() = s;
else if (myOldScreen == myBrowser) else if (myOldScreen == myBrowser)
*myBrowser->Main()->Current().song = s; *myBrowser->Main()->Current().song = s;
} }
@@ -1000,13 +1000,13 @@ bool TagEditor::WriteTags(Song &s)
{ {
// if we rename local file, it won't get updated // if we rename local file, it won't get updated
// so just remove it from playlist and add again // so just remove it from playlist and add again
size_t pos = myPlaylist->Main()->Choice(); size_t pos = myPlaylist->Items->Choice();
Mpd.StartCommandsList(); Mpd.StartCommandsList();
Mpd.Delete(pos); Mpd.Delete(pos);
int id = Mpd.AddSong("file://" + new_name); int id = Mpd.AddSong("file://" + new_name);
if (id >= 0) if (id >= 0)
{ {
s = myPlaylist->Main()->Back(); s = myPlaylist->Items->Back();
Mpd.Move(s.GetPosition(), pos); Mpd.Move(s.GetPosition(), pos);
} }
Mpd.CommitCommandsList(); Mpd.CommitCommandsList();