new feature: move item(s) in playlist to given position

This commit is contained in:
Andrzej Rybczak
2009-03-11 20:27:55 +01:00
parent a80bf2a7bf
commit fd7ac3b3f5
6 changed files with 90 additions and 7 deletions

View File

@@ -195,8 +195,9 @@ void Help::GetKeybindings()
*w << DisplayKeys(Key.Delete) << "Delete item/selected items from playlist\n";
*w << DisplayKeys(Key.Clear) << "Clear playlist\n";
*w << DisplayKeys(Key.Crop) << "Clear playlist but hold currently playing/selected items\n";
*w << DisplayKeys(Key.MvSongUp) << "Move item/group of items up\n";
*w << DisplayKeys(Key.MvSongDown) << "Move item/group of items down\n";
*w << DisplayKeys(Key.MvSongUp) << "Move item(s) up\n";
*w << DisplayKeys(Key.MvSongDown) << "Move item(s) down\n";
*w << DisplayKeys(Key.MoveTo) << "Move item(s) to given position\n";
*w << DisplayKeys(Key.Add) << "Add url/file/directory to playlist\n";
*w << DisplayKeys(Key.SavePlaylist) << "Save playlist\n";
*w << DisplayKeys(Key.SortPlaylist) << "Sort playlist\n";
@@ -235,8 +236,8 @@ void Help::GetKeybindings()
# ifndef HAVE_TAGLIB_H
*w << DisplayKeys(Key.EditTags) << "Edit playlist's name\n";
# endif // ! HAVE_TAGLIB_H
*w << DisplayKeys(Key.MvSongUp) << "Move item/group of items up\n";
*w << DisplayKeys(Key.MvSongDown) << "Move item/group of items down\n";
*w << DisplayKeys(Key.MvSongUp) << "Move item(s) up\n";
*w << DisplayKeys(Key.MvSongDown) << "Move item(s) down\n";
*w << "\n\n " << fmtBold << "Keys - Lyrics\n -----------------------------------------\n" << fmtBoldEnd;
*w << DisplayKeys(Key.Space) << "Switch for following lyrics of now playing song\n";

View File

@@ -116,7 +116,8 @@ namespace NCurses
void InsertSeparator(size_t pos);
void DeleteOption(size_t pos);
void IntoSeparator(size_t pos);
void Swap(size_t, size_t);
void Swap(size_t one, size_t two);
void Move(size_t from, size_t to);
bool isBold(int id = -1);
void BoldOption(int, bool);
@@ -317,12 +318,26 @@ template <typename T> void NCurses::Menu<T>::BoldOption(int index, bool bold)
itsOptions[index]->isBold = bold;
}
template <typename T>
void NCurses::Menu<T>::Swap(size_t one, size_t two)
template <typename T> void NCurses::Menu<T>::Swap(size_t one, size_t two)
{
std::swap(itsOptions.at(one), itsOptions.at(two));
}
template <typename T> void NCurses::Menu<T>::Move(size_t from, size_t to)
{
int diff = from-to;
if (diff > 0)
{
for (size_t i = from; i > to; i--)
std::swap(itsOptions.at(i), itsOptions.at(i-1));
}
else if (diff < 0)
{
for (size_t i = from; i < to; i++)
std::swap(itsOptions.at(i), itsOptions.at(i+1));
}
}
template <typename T> void NCurses::Menu<T>::Refresh()
{
if (itsOptionsPtr->empty())

View File

@@ -828,6 +828,66 @@ int main(int argc, char *argv[])
myPlaylistEditor->Content->SetTimeout(ncmpcpp_window_timeout);
}
}
else if (Keypressed(input, Key.MoveTo) && myScreen == myPlaylist)
{
if (myPlaylist->Main()->isFiltered())
{
ShowMessage("%s", MPD::Message::FunctionDisabledFilteringEnabled);
continue;
}
LockStatusbar();
Statusbar() << "Move item(s) to given position: ";
string strpos = wFooter->GetString(10);
UnlockStatusbar();
if (strpos.empty())
continue;
int pos = StrToInt(strpos);
if (pos < 0)
continue;
Playlist::BlockUpdate = 1;
if (myPlaylist->Main()->hasSelected())
{
vector<size_t> list;
myPlaylist->Main()->GetSelected(list);
if (pos+list.back()-list.front() > myPlaylist->Main()->Size())
pos = myPlaylist->Main()->Size()+list.front()-list.back()-1;
int diff = pos-list.front();
if (diff > 0)
{
for (vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); it++)
{
Mpd->QueueMove(*it, *it+diff);
myPlaylist->Main()->Move(*it, *it+diff);
}
}
else if (diff < 0)
{
for (vector<size_t>::const_iterator it = list.begin(); it != list.end(); it++)
{
Mpd->QueueMove(*it, *it+diff);
myPlaylist->Main()->Move(*it, *it+diff);
}
}
myPlaylist->Main()->Highlight(list.front()+diff);
Mpd->CommitQueue();
}
else
{
int current_pos = myPlaylist->Main()->Choice();
int diff = pos-current_pos;
if (diff)
{
Mpd->Move(current_pos, current_pos+diff);
myPlaylist->Main()->Highlight(current_pos+diff);
}
}
myPlaylist->FixPositions();
}
else if (Keypressed(input, Key.Add))
{
LockStatusbar();

View File

@@ -136,6 +136,7 @@ void DefaultKeys(ncmpcpp_keys &keys)
keys.Crop[0] = 'C';
keys.MvSongUp[0] = 'm';
keys.MvSongDown[0] = 'n';
keys.MoveTo[0] = 'M';
keys.Add[0] = 'a';
keys.SavePlaylist[0] = 'S';
keys.GoToNowPlaying[0] = 'o';
@@ -202,6 +203,7 @@ void DefaultKeys(ncmpcpp_keys &keys)
keys.Crop[1] = null_key;
keys.MvSongUp[1] = null_key;
keys.MvSongDown[1] = null_key;
keys.MoveTo[1] = null_key;
keys.Add[1] = null_key;
keys.SavePlaylist[1] = null_key;
keys.GoToNowPlaying[1] = null_key;
@@ -400,6 +402,8 @@ void ReadKeys(ncmpcpp_keys &keys)
GetKeys(key, keys.MvSongUp);
else if (key.find("key_move_song_down ") != string::npos)
GetKeys(key, keys.MvSongDown);
else if (key.find("key_move_to ") != string::npos)
GetKeys(key, keys.MoveTo);
else if (key.find("key_add ") != string::npos)
GetKeys(key, keys.Add);
else if (key.find("key_save_playlist ") != string::npos)

View File

@@ -85,6 +85,7 @@ struct ncmpcpp_keys
int Crop[2];
int MvSongUp[2];
int MvSongDown[2];
int MoveTo[2];
int Add[2];
int SavePlaylist[2];
int GoToNowPlaying[2];