enable selecting and add sel. menu in media lib

Previously, selecting entries was only possible in the "songs" column of
the media library. Now it works in the "artists" and "albums" column as
well, allowing one to add whole albums and artist collections to the
playlist at specific positions via the "add selection" menu.
This commit is contained in:
Frank Blendinger
2009-12-11 20:59:44 +01:00
parent b504b346af
commit 486f2d32cd
2 changed files with 92 additions and 32 deletions

View File

@@ -53,11 +53,15 @@ void MediaLibrary::Init()
Artists = new Menu<std::string>(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<std::string, SearchConstraints> >(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<size_t> selected;
Songs->GetSelected(selected);
if (selected.empty())
selected.push_back(Songs->Choice());
for (std::vector<size_t>::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<size_t>::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<size_t>::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 <no album>
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<size_t>::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);

View File

@@ -52,8 +52,8 @@ class MediaLibrary : public Screen<Window>
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 &);