From fd7ac3b3f50c9407862c75b646ae44a41355398f Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Wed, 11 Mar 2009 20:27:55 +0100 Subject: [PATCH] new feature: move item(s) in playlist to given position --- doc/keys | 2 ++ src/help.cpp | 9 ++++---- src/menu.h | 21 ++++++++++++++--- src/ncmpcpp.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ src/settings.cpp | 4 ++++ src/settings.h | 1 + 6 files changed, 90 insertions(+), 7 deletions(-) diff --git a/doc/keys b/doc/keys index 14d09909..3a61452d 100644 --- a/doc/keys +++ b/doc/keys @@ -120,6 +120,8 @@ # #key_move_song_down = 'n' # +#key_move_to = 'M' +# #key_add = 'a' # #key_save_playlist = 'S' diff --git a/src/help.cpp b/src/help.cpp index 5560da6f..961e8cfc 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -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"; diff --git a/src/menu.h b/src/menu.h index a625ff7f..ffd2ca8e 100644 --- a/src/menu.h +++ b/src/menu.h @@ -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 void NCurses::Menu::BoldOption(int index, bool bold) itsOptions[index]->isBold = bold; } -template -void NCurses::Menu::Swap(size_t one, size_t two) +template void NCurses::Menu::Swap(size_t one, size_t two) { std::swap(itsOptions.at(one), itsOptions.at(two)); } +template void NCurses::Menu::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 void NCurses::Menu::Refresh() { if (itsOptionsPtr->empty()) diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index e4e3d73d..7338a778 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -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 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::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::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(); diff --git a/src/settings.cpp b/src/settings.cpp index 7e93c39a..9eecd70d 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -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) diff --git a/src/settings.h b/src/settings.h index 10f892be..01a9df29 100644 --- a/src/settings.h +++ b/src/settings.h @@ -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];