Media library: add songs to playlist in the same order they are displayed in

This commit is contained in:
Andrzej Rybczak
2017-03-26 09:08:32 +02:00
parent 7ba2c3534c
commit 554895f0f1
2 changed files with 14 additions and 15 deletions

1
NEWS
View File

@@ -28,6 +28,7 @@ ncmpcpp-0.8 (????-??-??)
* Added support for locating current song in playlist editor. * Added support for locating current song in playlist editor.
* Disable autocenter mode while searching and filtering. * Disable autocenter mode while searching and filtering.
* Added '--quiet' comand line argument that supresses messages shown at startup. * Added '--quiet' comand line argument that supresses messages shown at startup.
* Multiple songs in Media library are now added to playlist in the same order they are displayed.
ncmpcpp-0.7.7 (2016-10-31) ncmpcpp-0.7.7 (2016-10-31)
* Fixed compilation on 32bit platforms. * Fixed compilation on 32bit platforms.

View File

@@ -93,7 +93,7 @@ struct SortSongs {
std::ptrdiff_t m_offset; std::ptrdiff_t m_offset;
public: public:
SortSongs(bool disc_only) SortSongs(bool disc_only = false)
: m_cmp(std::locale(), Config.ignore_leading_the), m_offset(disc_only ? 2 : 0) { } : m_cmp(std::locale(), Config.ignore_leading_the), m_offset(disc_only ? 2 : 0) { }
bool operator()(const SongItem &a, const SongItem &b) { bool operator()(const SongItem &a, const SongItem &b) {
@@ -690,25 +690,23 @@ bool MediaLibrary::addItemToPlaylist(bool play)
Mpd.AddSearch(Config.media_lib_primary_tag, Tags.current()->value().tag()); Mpd.AddSearch(Config.media_lib_primary_tag, Tags.current()->value().tag());
std::vector<MPD::Song> list( std::vector<MPD::Song> list(
std::make_move_iterator(Mpd.CommitSearchSongs()), std::make_move_iterator(Mpd.CommitSearchSongs()),
std::make_move_iterator(MPD::SongIterator()) std::make_move_iterator(MPD::SongIterator()));
); std::sort(list.begin(), list.end(), SortSongs());
result = addSongsToPlaylist(list.begin(), list.end(), play, -1); result = addSongsToPlaylist(list.begin(), list.end(), play, -1);
std::string tag_type = boost::locale::to_lower( std::string tag_type = boost::locale::to_lower(
tagTypeToString(Config.media_lib_primary_tag)); tagTypeToString(Config.media_lib_primary_tag));
Statusbar::printf("Songs with %1% \"%2%\" added%3%", Statusbar::printf("Songs with %1% \"%2%\" added%3%",
tag_type, Tags.current()->value().tag(), withErrors(result) tag_type, Tags.current()->value().tag(), withErrors(result));
);
} }
else if (isActiveWindow(Albums)) else if (isActiveWindow(Albums))
{ {
std::vector<MPD::Song> list( std::vector<MPD::Song> list(
std::make_move_iterator(getSongsFromAlbum(Albums.current()->value())), std::make_move_iterator(getSongsFromAlbum(Albums.current()->value())),
std::make_move_iterator(MPD::SongIterator()) std::make_move_iterator(MPD::SongIterator()));
); std::sort(list.begin(), list.end(), SortSongs());
result = addSongsToPlaylist(list.begin(), list.end(), play, -1); result = addSongsToPlaylist(list.begin(), list.end(), play, -1);
Statusbar::printf("Songs from album \"%1%\" added%2%", Statusbar::printf("Songs from album \"%1%\" added%2%",
Albums.current()->value().entry().album(), withErrors(result) Albums.current()->value().entry().album(), withErrors(result));
);
} }
} }
return result; return result;
@@ -722,11 +720,12 @@ std::vector<MPD::Song> MediaLibrary::getSelectedSongs()
auto tag_handler = [&result](const std::string &tag) { auto tag_handler = [&result](const std::string &tag) {
Mpd.StartSearch(true); Mpd.StartSearch(true);
Mpd.AddSearch(Config.media_lib_primary_tag, tag); Mpd.AddSearch(Config.media_lib_primary_tag, tag);
size_t begin = result.size();
std::copy( std::copy(
std::make_move_iterator(Mpd.CommitSearchSongs()), std::make_move_iterator(Mpd.CommitSearchSongs()),
std::make_move_iterator(MPD::SongIterator()), std::make_move_iterator(MPD::SongIterator()),
std::back_inserter(result) std::back_inserter(result));
); std::sort(result.begin()+begin, result.end(), SortSongs());
}; };
bool any_selected = false; bool any_selected = false;
for (auto &e : Tags) for (auto &e : Tags)
@@ -762,9 +761,8 @@ std::vector<MPD::Song> MediaLibrary::getSelectedSongs()
std::copy( std::copy(
std::make_move_iterator(Mpd.CommitSearchSongs()), std::make_move_iterator(Mpd.CommitSearchSongs()),
std::make_move_iterator(MPD::SongIterator()), std::make_move_iterator(MPD::SongIterator()),
std::back_inserter(result) std::back_inserter(result));
); std::sort(result.begin()+begin, result.end(), SortSongs());
std::sort(result.begin()+begin, result.end(), SortSongs(false));
} }
} }
// if no item is selected, add songs from right column // if no item is selected, add songs from right column
@@ -777,7 +775,7 @@ std::vector<MPD::Song> MediaLibrary::getSelectedSongs()
std::make_move_iterator(MPD::SongIterator()), std::make_move_iterator(MPD::SongIterator()),
std::back_inserter(result) std::back_inserter(result)
); );
std::sort(result.begin()+begin, result.end(), SortSongs(false)); std::sort(result.begin()+begin, result.end(), SortSongs());
} }
} }
else if (isActiveWindow(Songs)) else if (isActiveWindow(Songs))