From 6685795b9cc74f3133e9dc57239c3be84e075ac8 Mon Sep 17 00:00:00 2001 From: emeric Date: Thu, 17 May 2018 13:06:23 +0200 Subject: [PATCH] Adding tags in the releases view --- approot/releases.xml | 1 + src/database/Release.cpp | 4 +-- src/ui/explore/ReleasesView.cpp | 53 +++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/approot/releases.xml b/approot/releases.xml index e0eb02ca..69f6864f 100644 --- a/approot/releases.xml +++ b/approot/releases.xml @@ -33,6 +33,7 @@

${release-name}

${}${artist-name}${} + ${clusters} ${play-btn}${add-btn} diff --git a/src/database/Release.cpp b/src/database/Release.cpp index adc836b0..d1a302dc 100644 --- a/src/database/Release.cpp +++ b/src/database/Release.cpp @@ -240,7 +240,7 @@ Release::getClusterGroups(std::vector clusterTypes, std::s std::ostringstream oss; - oss << "SELECT c from cluster c INNER JOIN track t ON c.id = t_c.cluster_id INNER JOIN track_cluster t_c ON t_c.track_id = t.id INNER JOIN cluster_type c_type ON c.cluster_type_id = c_type.id INNER JOIN release r ON t.release_id = r.id"; + oss << "SELECT c from cluster c INNER JOIN track t ON c.id = t_c.cluster_id INNER JOIN track_cluster t_c ON t_c.track_id = t.id INNER JOIN cluster_type c_type ON c.cluster_type_id = c_type.id INNER JOIN release r ON t.release_id = r.id "; where.And(WhereClause("r.id = ?")).bind(std::to_string(self()->id())); { @@ -250,7 +250,7 @@ Release::getClusterGroups(std::vector clusterTypes, std::s where.And(clusterClause); } oss << " " << where.get(); - oss << "GROUP BY c.id ORDER BY COUNT(c.id) DESC"; + oss << " GROUP BY c.id ORDER BY COUNT(c.id) DESC"; Wt::Dbo::Query query = session()->query( oss.str() ); diff --git a/src/ui/explore/ReleasesView.cpp b/src/ui/explore/ReleasesView.cpp index cef56ac5..4812e2e3 100644 --- a/src/ui/explore/ReleasesView.cpp +++ b/src/ui/explore/ReleasesView.cpp @@ -26,6 +26,7 @@ #include #include "database/Release.hpp" +#include "database/Setting.hpp" #include "utils/Logger.hpp" #include "utils/Utils.hpp" @@ -35,14 +36,43 @@ #include "LmsApplication.hpp" #include "Filters.hpp" -namespace UserInterface { - using namespace Database; +namespace { + +const std::string releasesClusterTypesSetting = "releases_cluster_types"; +const std::vector defaultReleasesClusterTypes = +{ + "GENRE", + "ALBUMGROUPING", +}; + +std::vector getReleasesClusterTypes(Wt::Dbo::Session& session) +{ + Wt::Dbo::Transaction transaction(session); + + std::vector res; + for (auto clusterTypeName : splitString(Setting::getString(session, releasesClusterTypesSetting), " ")) + { + auto clusterType = ClusterType::getByName(session, clusterTypeName); + if (clusterType) + res.push_back(clusterType); + } + + return res; +} + +} // namespace + +namespace UserInterface { + Releases::Releases(Filters* filters) : Wt::WTemplate(Wt::WString::tr("Lms.Explore.Releases.template")), _filters(filters) { + if (!Setting::exists(LmsApp->getDboSession(), releasesClusterTypesSetting)) + Setting::setString(LmsApp->getDboSession(), releasesClusterTypesSetting, joinStrings(defaultReleasesClusterTypes, " ")); + addFunction("tr", &Wt::WTemplate::Functions::tr); _search = bindNew("search"); @@ -108,6 +138,25 @@ Releases::addSome() entry->bindWidget("artist-name", LmsApplication::createArtistAnchor(artists.front())); } + Wt::WContainerWidget* clusterContainers = entry->bindNew("clusters"); + { + auto clusterTypes = getReleasesClusterTypes(LmsApp->getDboSession()); + auto clusterGroups = release->getClusterGroups(clusterTypes, 1); + + for (auto clusters : clusterGroups) + { + for (auto cluster : clusters) + { + auto clusterId = cluster.id(); + auto entry = clusterContainers->addWidget(LmsApp->createCluster(cluster)); + entry->clicked().connect([=] + { + _filters->add(clusterId); + }); + } + } + } + Wt::WText* playBtn = entry->bindNew("play-btn", Wt::WString::tr("Lms.Explore.Releases.play"), Wt::TextFormat::XHTML); playBtn->clicked().connect(std::bind([=] {