diff --git a/src/media_library.cpp b/src/media_library.cpp index a2e19769..4cbc209b 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -53,11 +53,15 @@ void MediaLibrary::Init() Artists = new Menu(0, MainStartY, itsLeftColWidth, MainHeight, IntoStr(Config.media_lib_primary_tag) + "s", Config.main_color, brNone); Artists->HighlightColor(Config.active_column_color); Artists->CyclicScrolling(Config.use_cyclic_scrolling); + Artists->SetSelectPrefix(&Config.selected_item_prefix); + Artists->SetSelectSuffix(&Config.selected_item_suffix); Artists->SetItemDisplayer(Display::Generic); Albums = new Menu< std::pair >(itsMiddleColStartX, MainStartY, itsMiddleColWidth, MainHeight, "Albums", Config.main_color, brNone); Albums->HighlightColor(Config.main_highlight_color); Albums->CyclicScrolling(Config.use_cyclic_scrolling); + Albums->SetSelectPrefix(&Config.selected_item_prefix); + Albums->SetSelectSuffix(&Config.selected_item_suffix); Albums->SetItemDisplayer(Display::Pairs); Albums->SetGetStringFunction(StringPairToString); @@ -322,9 +326,14 @@ void MediaLibrary::Update() void MediaLibrary::SpacePressed() { - if (Config.space_selects && w == Songs) + if (Config.space_selects) { - Songs->Select(Songs->Choice(), !Songs->isSelected()); + if (w == Artists) + Artists->Select(Artists->Choice(), !Artists->isSelected()); + else if (w == Albums) + Albums->Select(Albums->Choice(), !Albums->isSelected()); + else if (w == Songs) + Songs->Select(Songs->Choice(), !Songs->isSelected()); w->Scroll(wDown); } else @@ -417,14 +426,73 @@ List *MediaLibrary::GetList() return 0; } +void MediaLibrary::ReverseSelection() +{ + if (w == Artists) + Artists->ReverseSelection(); + else if (w == Albums) + Albums->ReverseSelection(); + else if (w == Songs) + Songs->ReverseSelection(); +} + void MediaLibrary::GetSelectedSongs(MPD::SongList &v) { std::vector selected; - Songs->GetSelected(selected); - if (selected.empty()) - selected.push_back(Songs->Choice()); - for (std::vector::const_iterator it = selected.begin(); it != selected.end(); ++it) - v.push_back(new MPD::Song(Songs->at(*it))); + if (w == Artists && !Artists->Empty()) + { + Artists->GetSelected(selected); + if (selected.empty()) + selected.push_back(Artists->Choice()); + for (std::vector::const_iterator it = selected.begin(); it != selected.end(); ++it) + { + MPD::SongList list; + Mpd.StartSearch(1); + Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(Artists->at(*it))); + Mpd.CommitSearch(list); + for (MPD::SongList::const_iterator sIt = list.begin(); sIt != list.end(); ++sIt) + v.push_back(new MPD::Song(**sIt)); + FreeSongList(list); + } + } + else if (w == Albums && !Albums->Empty()) + { + Albums->GetSelected(selected); + if (selected.empty()) + { + // shortcut via the existing song list in right column + if (v.empty()) + v.reserve(Songs->Size()); + for (size_t i = 0; i < Songs->Size(); ++i) + v.push_back(new MPD::Song((*Songs)[i])); + } + else + { + for (std::vector::const_iterator it = selected.begin(); it != selected.end(); ++it) + { + MPD::SongList list; + Mpd.StartSearch(1); + Mpd.AddSearch(Config.media_lib_primary_tag, hasTwoColumns + ? Albums->at(*it).second.Artist + : locale_to_utf_cpy(Artists->Current())); + Mpd.AddSearch(MPD_TAG_ALBUM, Albums->at(*it).second.Album); + if (!Albums->at(*it).second.Album.empty()) // for + Mpd.AddSearch(MPD_TAG_DATE, Albums->at(*it).second.Year); + Mpd.CommitSearch(list); + for (MPD::SongList::const_iterator sIt = list.begin(); sIt != list.end(); ++sIt) + v.push_back(new MPD::Song(**sIt)); + FreeSongList(list); + } + } + } + else if (w == Songs && !Songs->Empty()) + { + Songs->GetSelected(selected); + if (selected.empty()) + selected.push_back(Songs->Choice()); + for (std::vector::const_iterator it = selected.begin(); it != selected.end(); ++it) + v.push_back(new MPD::Song(Songs->at(*it))); + } } void MediaLibrary::ApplyFilter(const std::string &s) @@ -476,34 +544,26 @@ void MediaLibrary::PrevColumn() void MediaLibrary::AddToPlaylist(bool add_n_play) { - SongList list; - - if (!Artists->Empty() && w == Artists) + if (w == Songs && !Songs->Empty()) + Songs->Bold(Songs->Choice(), myPlaylist->Add(Songs->Current(), Songs->isBold(), add_n_play)); + else { - Mpd.StartSearch(1); - Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(Artists->Current())); - Mpd.CommitSearch(list); - + MPD::SongList list; + GetSelectedSongs(list); + if (myPlaylist->Add(list, add_n_play)) { - std::string tag_type = IntoStr(Config.media_lib_primary_tag); - ToLower(tag_type); - ShowMessage("Adding songs of %s \"%s\"", tag_type.c_str(), Artists->Current().c_str()); + if (!Artists->Empty() && w == Artists) + { + std::string tag_type = IntoStr(Config.media_lib_primary_tag); + ToLower(tag_type); + ShowMessage("Adding songs of %s \"%s\"", tag_type.c_str(), Artists->Current().c_str()); + } + else if (w == Albums) + ShowMessage("Adding songs from album \"%s\"", Albums->Current().second.Album.c_str()); } } - else if (w == Albums) - { - MPD::SongList l; - l.reserve(Songs->Size()); - for (size_t i = 0; i < Songs->Size(); ++i) - l.push_back(&(*Songs)[i]); - - if (myPlaylist->Add(l, add_n_play)) - ShowMessage("Adding songs from album \"%s\"", Albums->Current().second.Album.c_str()); - } - else if (w == Songs && !Songs->Empty()) - Songs->Bold(Songs->Choice(), myPlaylist->Add(Songs->Current(), Songs->isBold(), add_n_play)); - FreeSongList(list); + if (!add_n_play) { w->Scroll(wDown); diff --git a/src/media_library.h b/src/media_library.h index 4d0f7663..5c2a361d 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -52,8 +52,8 @@ class MediaLibrary : public Screen virtual MPD::Song *CurrentSong(); - virtual bool allowsSelection() { return w == Songs; } - virtual void ReverseSelection() { Songs->ReverseSelection(); } + virtual bool allowsSelection() { return true; } + virtual void ReverseSelection(); virtual void GetSelectedSongs(MPD::SongList &); virtual void ApplyFilter(const std::string &);