summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/media_library.cpp34
-rw-r--r--src/media_library.h3
2 files changed, 33 insertions, 4 deletions
diff --git a/src/media_library.cpp b/src/media_library.cpp
index f984ac31..59369be4 100644
--- a/src/media_library.cpp
+++ b/src/media_library.cpp
@@ -42,6 +42,12 @@ size_t MediaLibrary::itsMiddleColStartX;
size_t MediaLibrary::itsRightColWidth;
size_t MediaLibrary::itsRightColStartX;
+// this string marks the position in middle column that works as "All tracks" option. it's
+// assigned to Year in SearchConstraint class since date normally cannot contain other chars
+// than ciphers and -'s (0x7f is interpreted as backspace keycode, so it's quite safe to assume
+// that it won't appear in any tag, let alone date).
+const char MediaLibrary::AllTracksMarker[] = "\x7f";
+
void MediaLibrary::Init()
{
hasTwoColumns = 0;
@@ -227,6 +233,11 @@ void MediaLibrary::Update()
utf_to_locale(Artists->Current());
if (!Albums->Empty())
Albums->Sort<SearchConstraintsSorting>();
+ if (Albums->Size() > 1)
+ {
+ Albums->AddSeparator();
+ Albums->AddOption(SearchConstraints("", AllTracksMarker));
+ }
Albums->Refresh();
}
else if (hasTwoColumns && Albums->Empty())
@@ -304,13 +315,16 @@ void MediaLibrary::Update()
}
else
{
- Mpd.AddSearch(MPD_TAG_ALBUM, locale_to_utf_cpy(Albums->Current().Album));
- if (Config.media_library_display_date)
- Mpd.AddSearch(MPD_TAG_DATE, locale_to_utf_cpy(Albums->Current().Year));
+ if (Albums->Current().Year != AllTracksMarker)
+ {
+ Mpd.AddSearch(MPD_TAG_ALBUM, locale_to_utf_cpy(Albums->Current().Album));
+ if (Config.media_library_display_date)
+ Mpd.AddSearch(MPD_TAG_DATE, locale_to_utf_cpy(Albums->Current().Year));
+ }
}
Mpd.CommitSearch(list);
- sort(list.begin(), list.end(), SortSongsByTrack);
+ sort(list.begin(), list.end(), Albums->Current().Year == AllTracksMarker ? SortAllTracks : SortSongsByTrack);
bool bold = 0;
for (MPD::SongList::const_iterator it = list.begin(); it != list.end(); ++it)
@@ -704,6 +718,8 @@ std::string MediaLibrary::SongToString(const MPD::Song &s, void *)
std::string MediaLibrary::AlbumToString(const SearchConstraints &sc, void *ptr)
{
+ if (sc.Year == AllTracksMarker)
+ return "All tracks";
std::string result;
if (!sc.Artist.empty())
(result += sc.Artist) += " - ";
@@ -740,3 +756,13 @@ bool MediaLibrary::SortSongsByTrack(MPD::Song *a, MPD::Song *b)
return StrToInt(a->GetDisc()) < StrToInt(b->GetDisc());
}
+bool MediaLibrary::SortAllTracks(MPD::Song *a, MPD::Song *b)
+{
+ static MPD::Song::GetFunction gets[] = { &MPD::Song::GetDate, &MPD::Song::GetAlbum, &MPD::Song::GetDisc, 0 };
+ CaseInsensitiveStringComparison cmp;
+ for (MPD::Song::GetFunction *get = gets; *get; ++get)
+ if (int ret = cmp(a->GetTags(*get), b->GetTags(*get)))
+ return ret < 0;
+ return a->GetTrack() < b->GetTrack();
+}
+
diff --git a/src/media_library.h b/src/media_library.h
index 89933fd6..25613d77 100644
--- a/src/media_library.h
+++ b/src/media_library.h
@@ -87,6 +87,7 @@ class MediaLibrary : public Screen<Window>
static void DisplayAlbums(const SearchConstraints &, void *, Menu<SearchConstraints> *);
static bool SortSongsByTrack(MPD::Song *, MPD::Song *);
+ static bool SortAllTracks(MPD::Song *, MPD::Song *);
static bool hasTwoColumns;
static size_t itsLeftColWidth;
@@ -94,6 +95,8 @@ class MediaLibrary : public Screen<Window>
static size_t itsMiddleColStartX;
static size_t itsRightColWidth;
static size_t itsRightColStartX;
+
+ static const char AllTracksMarker[];
};
extern MediaLibrary *myLibrary;