From 87c2f2936f08ada4ba1ec69b18dc7a6c02be3287 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 7 May 2018 14:04:03 +0200 Subject: [PATCH] Added interactions for clusters/filters --- src/database/Track.cpp | 6 ++++++ src/database/Track.hpp | 1 + src/ui/explore/ArtistView.cpp | 9 ++++++++- src/ui/explore/Filters.cpp | 36 +++++++++++++++++++++++----------- src/ui/explore/Filters.hpp | 2 ++ src/ui/explore/ReleaseView.cpp | 9 ++++++++- 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/database/Track.cpp b/src/database/Track.cpp index 9ef6ce9f..6bad83fb 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -232,6 +232,12 @@ Cluster::getAll(Wt::Dbo::Session& session) return std::vector(res.begin(), res.end()); } +Cluster::pointer +Cluster::getById(Wt::Dbo::Session& session, id_type id) +{ + return session.find().where("id = ?").bind(id); +} + ClusterType::ClusterType(std::string name) : _name(name) { diff --git a/src/database/Track.hpp b/src/database/Track.hpp index 50bdd42f..88ae32b7 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -51,6 +51,7 @@ class Cluster : public Wt::Dbo::Dbo // Find utility static std::vector getAll(Wt::Dbo::Session& session); + static pointer getById(Wt::Dbo::Session& session, id_type id); // Create utility static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr type, std::string name); diff --git a/src/ui/explore/ArtistView.cpp b/src/ui/explore/ArtistView.cpp index 2fac685e..3de4130f 100644 --- a/src/ui/explore/ArtistView.cpp +++ b/src/ui/explore/ArtistView.cpp @@ -79,7 +79,14 @@ Artist::refresh() auto clusters = artist->getClusters(3); for (auto cluster : clusters) - clusterContainers->addWidget(LmsApp->createCluster(cluster)); + { + auto clusterId = cluster.id(); + auto entry = clusterContainers->addWidget(LmsApp->createCluster(cluster)); + entry->clicked().connect([=] + { + _filters->add(clusterId); + }); + } } t->bindString("name", Wt::WString::fromUTF8(artist->getName()), Wt::TextFormat::Plain); diff --git a/src/ui/explore/Filters.cpp b/src/ui/explore/Filters.cpp index aa6b03ac..02d51e46 100644 --- a/src/ui/explore/Filters.cpp +++ b/src/ui/explore/Filters.cpp @@ -109,22 +109,36 @@ Filters::showDialog() if (!cluster) return; - auto clusterId = cluster.id(); - _filterIds.insert(clusterId); - _sigUpdated.emit(); - - auto filter = _filters->addWidget(LmsApp->createCluster(cluster, true)); - filter->clicked().connect(std::bind([=] - { - _filters->removeWidget(filter); - _filterIds.erase(clusterId); - _sigUpdated.emit(); - })); + add(cluster.id()); })); dialog->show(); } +void +Filters::add(Database::Cluster::id_type clusterId) +{ + Wt::Dbo::Transaction transaction(LmsApp->getDboSession()); + + auto cluster = Database::Cluster::getById(LmsApp->getDboSession(), clusterId); + if (!cluster) + return; + + auto res = _filterIds.insert(clusterId); + if (!res.second) + return; + + auto filter = _filters->addWidget(LmsApp->createCluster(cluster, true)); + filter->clicked().connect(std::bind([=] + { + _filters->removeWidget(filter); + _filterIds.erase(clusterId); + _sigUpdated.emit(); + })); + + _sigUpdated.emit(); +} + Filters::Filters() : Wt::WTemplate(Wt::WString::tr("Lms.Explore.template.filters")) { diff --git a/src/ui/explore/Filters.hpp b/src/ui/explore/Filters.hpp index aa3d30ce..85b5606e 100644 --- a/src/ui/explore/Filters.hpp +++ b/src/ui/explore/Filters.hpp @@ -34,6 +34,8 @@ class Filters : public Wt::WTemplate public: Filters(); + void add(Database::Cluster::id_type clusterId); + std::set getClusterIds() const { return _filterIds; } Wt::Signal<>& updated() { return _sigUpdated; } diff --git a/src/ui/explore/ReleaseView.cpp b/src/ui/explore/ReleaseView.cpp index ea888001..4d24b1bb 100644 --- a/src/ui/explore/ReleaseView.cpp +++ b/src/ui/explore/ReleaseView.cpp @@ -112,7 +112,14 @@ Release::refresh() auto clusters = release->getClusters(3); for (auto cluster : clusters) - clusterContainers->addWidget(LmsApp->createCluster(cluster)); + { + auto clusterId = cluster.id(); + auto entry = clusterContainers->addWidget(LmsApp->createCluster(cluster)); + entry->clicked().connect([=] + { + _filters->add(clusterId); + }); + } } {