keep proper songs' positions when playlist is modified

This commit is contained in:
Andrzej Rybczak
2009-02-22 13:53:41 +01:00
parent 12e437c5af
commit fe79d1ae94
3 changed files with 23 additions and 0 deletions

View File

@@ -452,6 +452,7 @@ int main(int argc, char *argv[])
Mpd->QueueDeleteSongId((*myPlaylist->Main())[*it].GetID());
myPlaylist->Main()->DeleteOption(*it);
}
myPlaylist->FixPositions(list.front());
ShowMessage("Selected items deleted!");
}
else
@@ -470,6 +471,7 @@ int main(int argc, char *argv[])
myPlaylist->Main()->Refresh();
myPlaylist->Main()->ReadKey(input);
}
myPlaylist->FixPositions(myPlaylist->Main()->Choice());
myPlaylist->Main()->SetTimeout(ncmpcpp_window_timeout);
Playlist::BlockNowPlayingUpdate = 0;
}
@@ -634,6 +636,8 @@ int main(int argc, char *argv[])
for (vector<size_t>::iterator it = list.begin(); it != list.end(); it++)
{
(*it)--;
myPlaylist->Main()->at((*it)+1).SetPosition(*it);
myPlaylist->Main()->at(*it).SetPosition((*it)+1);
myPlaylist->Main()->Swap(*it, (*it)+1);
}
myPlaylist->Main()->Highlight(list[(list.size()-1)/2]);
@@ -656,6 +660,8 @@ int main(int argc, char *argv[])
TraceMpdStatus();
time(&timer);
to--;
myPlaylist->Main()->at(from).SetPosition(to);
myPlaylist->Main()->at(to).SetPosition(from);
myPlaylist->Main()->Swap(to, to+1);
myPlaylist->Main()->Scroll(wUp);
myPlaylist->Main()->Refresh();
@@ -743,6 +749,8 @@ int main(int argc, char *argv[])
for (vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); it++)
{
(*it)++;
myPlaylist->Main()->at((*it)-1).SetPosition(*it);
myPlaylist->Main()->at(*it).SetPosition((*it)-1);
myPlaylist->Main()->Swap(*it, (*it)-1);
}
myPlaylist->Main()->Highlight(list[(list.size()-1)/2]);
@@ -765,6 +773,8 @@ int main(int argc, char *argv[])
TraceMpdStatus();
time(&timer);
to++;
myPlaylist->Main()->at(from).SetPosition(to);
myPlaylist->Main()->at(to).SetPosition(from);
myPlaylist->Main()->Swap(to, to-1);
myPlaylist->Main()->Scroll(wDown);
myPlaylist->Main()->Refresh();

View File

@@ -255,6 +255,18 @@ void Playlist::Sort()
ShowMessage("Playlist sorted!");
}
void Playlist::FixPositions(size_t beginning)
{
bool was_filtered = w->isFiltered();
w->ShowAll();
for (size_t i = beginning; i < w->Size(); i++)
{
(*w)[i].SetPosition(i);
}
if (was_filtered)
w->ShowFiltered();
}
bool Playlist::Sorting(MPD::Song *a, MPD::Song *b)
{
for (size_t i = 0; i < SortOptions; i++)

View File

@@ -56,6 +56,7 @@ class Playlist : public Screen< Menu<MPD::Song> >
const MPD::Song *NowPlayingSong();
void Sort();
void FixPositions(size_t = 0);
static std::string SongToString(const MPD::Song &, void *);
static std::string SongInColumnsToString(const MPD::Song &, void *);