mirror of
https://github.com/clangen/musikcube.git
synced 2024-10-02 04:52:32 +00:00
Some track sort order refactoring so we can reuse some constants in the browse view.
This commit is contained in:
parent
d874c3cc44
commit
c142705b14
@ -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 + " ";
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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 */
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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(
|
||||
|
Loading…
Reference in New Issue
Block a user