Some track sort order refactoring so we can reuse some constants in the browse view.

This commit is contained in:
casey langen 2020-01-06 19:59:06 -08:00
parent d874c3cc44
commit c142705b14
6 changed files with 50 additions and 38 deletions

View File

@ -56,32 +56,6 @@ using namespace musik::core::library::constants;
using namespace musik::core::db::local;
using namespace boost::algorithm;
static const std::map<TrackSortType, std::string> kAdditionalPredicate {
{ TrackSortType::LastPlayedAsc, "t.last_played IS NOT NULL" },
{ TrackSortType::LastPlayedDesc, "t.last_played IS NOT NULL" },
{ TrackSortType::RatingAsc, "t.rating IS NOT NULL AND t.rating > 0" },
{ TrackSortType::RatingDesc, "t.rating IS NOT NULL AND t.rating > 0" },
{ TrackSortType::PlayCountAsc, "t.play_count IS NOT NULL AND t.play_count > 0" },
{ TrackSortType::PlayCountDesc, "t.play_count IS NOT NULL AND t.play_count > 0" },
};
static const std::map<TrackSortType, std::string> kOrderBy = {
{ TrackSortType::Title, "track, ar.name, al.name" },
{ TrackSortType::Album, "al.name, disc, track, ar.name" },
{ TrackSortType::Artist, "ar.name, al.name, disc, track" },
{ TrackSortType::DateAddedAsc, "date(t.date_added) ASC, al.name, disc, track, ar.name" },
{ TrackSortType::DateAddedDesc, "date(t.date_added) DESC, al.name, disc, track, ar.name" },
{ TrackSortType::DateUpdatedAsc, "date(t.date_updated) ASC, al.name, disc, track, ar.name" },
{ TrackSortType::DateUpdatedDesc, "date(t.date_updated) DESC, al.name, disc, track, ar.name" },
{ TrackSortType::LastPlayedAsc, "datetime(t.last_played) ASC" },
{ TrackSortType::LastPlayedDesc, "datetime(t.last_played) DESC" },
{ TrackSortType::RatingAsc, "t.rating ASC" },
{ TrackSortType::RatingDesc, "t.rating DESC" },
{ TrackSortType::PlayCountAsc, "t.play_count ASC" },
{ TrackSortType::PlayCountDesc, "t.play_count DESC" },
{ TrackSortType::Genre, "gn.name, al.name, disc, track, ar.name" },
};
SearchTrackListQuery::SearchTrackListQuery(
ILibraryPtr library, const std::string& filter, TrackSortType sort)
{
@ -91,12 +65,12 @@ SearchTrackListQuery::SearchTrackListQuery(
this->filter = "%" + trim_copy(to_lower_copy(filter)) + "%";
}
if (kAdditionalPredicate.find(sort) != kAdditionalPredicate.end()) {
this->additionalPredicate = kAdditionalPredicate.find(sort)->second + " AND ";
if (kTrackSearchSortOrderByPredicate.find(sort) != kTrackSearchSortOrderByPredicate.end()) {
this->orderByPredicate = kTrackSearchSortOrderByPredicate.find(sort)->second + " AND ";
}
this->displayString = _TSTR(kTrackSortTypeToDisplayKey.find(sort)->second);
this->orderBy = kOrderBy.find(sort)->second;
this->displayString = _TSTR(kTrackSearchOrderByToDisplayKey.find(sort)->second);
this->orderBy = kTrackSearchSortOrderBy.find(sort)->second;
this->result.reset(new musik::core::TrackList(library));
this->headers.reset(new std::set<size_t>());
this->hash = 0;
@ -141,7 +115,7 @@ bool SearchTrackListQuery::OnRun(Connection& db) {
"FROM tracks t, albums al, artists ar, genres gn "
"WHERE "
" t.visible=1 AND "
+ this->additionalPredicate +
+ this->orderByPredicate +
"(t.title LIKE ? OR al.name LIKE ? OR ar.name LIKE ? OR gn.name LIKE ?) "
" AND t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id "
"ORDER BY " + this->orderBy + " ";
@ -152,7 +126,7 @@ bool SearchTrackListQuery::OnRun(Connection& db) {
"FROM tracks t, albums al, artists ar, genres gn "
"WHERE "
" t.visible=1 AND "
+ this->additionalPredicate +
+ this->orderByPredicate +
" t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id "
"ORDER BY " + this->orderBy + " ";
}

View File

@ -65,7 +65,7 @@ namespace musik { namespace core { namespace db { namespace local {
Headers headers;
std::string filter;
std::string orderBy;
std::string additionalPredicate;
std::string orderByPredicate;
std::string displayString;
size_t hash;
};

View File

@ -57,7 +57,9 @@ namespace musik {
Genre = 13,
};
static const std::map<TrackSortType, std::string> kTrackSortTypeToDisplayKey = {
/* track sorting in the track filter view */
static const std::map<TrackSortType, std::string> kTrackSearchOrderByToDisplayKey = {
{ TrackSortType::Title, "track_list_sort_title" },
{ TrackSortType::Album, "track_list_sort_album" },
{ TrackSortType::Artist, "track_list_sort_artist" },
@ -73,6 +75,36 @@ namespace musik {
{ TrackSortType::PlayCountDesc, "track_list_sort_play_count_desc" },
{ TrackSortType::Genre, "track_list_sort_genre" },
};
static const std::map<TrackSortType, std::string> kTrackSearchSortOrderBy = {
{ TrackSortType::Title, "track, ar.name, al.name" },
{ TrackSortType::Album, "al.name, disc, track, ar.name" },
{ TrackSortType::Artist, "ar.name, al.name, disc, track" },
{ TrackSortType::DateAddedAsc, "date(t.date_added) ASC, al.name, disc, track, ar.name" },
{ TrackSortType::DateAddedDesc, "date(t.date_added) DESC, al.name, disc, track, ar.name" },
{ TrackSortType::DateUpdatedAsc, "date(t.date_updated) ASC, al.name, disc, track, ar.name" },
{ TrackSortType::DateUpdatedDesc, "date(t.date_updated) DESC, al.name, disc, track, ar.name" },
{ TrackSortType::LastPlayedAsc, "datetime(t.last_played) ASC" },
{ TrackSortType::LastPlayedDesc, "datetime(t.last_played) DESC" },
{ TrackSortType::RatingAsc, "t.rating ASC" },
{ TrackSortType::RatingDesc, "t.rating DESC" },
{ TrackSortType::PlayCountAsc, "t.play_count ASC" },
{ TrackSortType::PlayCountDesc, "t.play_count DESC" },
{ TrackSortType::Genre, "gn.name, al.name, disc, track, ar.name" },
};
static const std::map<TrackSortType, std::string> kTrackSearchSortOrderByPredicate {
{ TrackSortType::LastPlayedAsc, "t.last_played IS NOT NULL" },
{ TrackSortType::LastPlayedDesc, "t.last_played IS NOT NULL" },
{ TrackSortType::RatingAsc, "t.rating IS NOT NULL AND t.rating > 0" },
{ TrackSortType::RatingDesc, "t.rating IS NOT NULL AND t.rating > 0" },
{ TrackSortType::PlayCountAsc, "t.play_count IS NOT NULL AND t.play_count > 0" },
{ TrackSortType::PlayCountDesc, "t.play_count IS NOT NULL AND t.play_count > 0" },
};
/* track sorting in a category tracklist view */
}
}
}

View File

@ -195,6 +195,7 @@ bool TrackSearchLayout::KeyPress(const std::string& key) {
else if (Hotkeys::Is(Hotkeys::TrackSearchChangeSortOrder, key)) {
TrackOverlays::ShowTrackSearchSortOverlay(
getDefaultTrackSort(this->prefs),
kTrackSearchOrderByToDisplayKey,
[this](TrackSortType type) {
this->prefs->SetInt(keys::TrackSearchSortOrder, (int)type);
this->Requery();

View File

@ -54,13 +54,17 @@ static const int kDefaultSortOverlayWidth = 32;
static const int kDefaultRatingOverlayWidth = 24;
void TrackOverlays::ShowTrackSearchSortOverlay(
TrackSortType sortType, std::function<void(TrackSortType)> callback)
TrackSortType sortType,
const std::map<TrackSortType, std::string>& availableSortTypes,
std::function<void(TrackSortType)> callback)
{
size_t i = 0;
size_t selectedIndex = 0;
std::vector<TrackSortType> allKeys;
auto adapter = std::make_shared<SimpleScrollAdapter>();
adapter->SetSelectable(true);
for (auto it : kTrackSortTypeToDisplayKey) {
for (auto it : availableSortTypes) {
allKeys.push_back(it.first);
adapter->AddEntry(_TSTR(it.second));
if (it.first == sortType) {
selectedIndex = i;
@ -74,8 +78,8 @@ void TrackOverlays::ShowTrackSearchSortOverlay(
.SetWidth(_DIMEN("track_search_sort_order_width", kDefaultSortOverlayWidth))
.SetSelectedIndex(selectedIndex)
.SetItemSelectedCallback(
[callback](ListOverlay* overlay, IScrollAdapterPtr adapter, size_t index) {
callback((TrackSortType) index);
[callback, allKeys](ListOverlay* overlay, IScrollAdapterPtr adapter, size_t index) {
callback(allKeys[index]);
});
cursespp::App::Overlays().Push(dialog);

View File

@ -48,6 +48,7 @@ namespace musik {
static void ShowTrackSearchSortOverlay(
TrackSortType currentSortType,
const std::map<TrackSortType, std::string>& availableSortTypes,
std::function<void(TrackSortType)> callback);
static void ShowRateTrackOverlay(