diff --git a/approot/artists.xml b/approot/artists.xml index f878da11..999046a0 100644 --- a/approot/artists.xml +++ b/approot/artists.xml @@ -3,10 +3,31 @@ - ${mode class="nav nav-pills mb-1"} -
-
- ${link-type} +
+ +
+
+ ${link-type class="form-select"} +
${artists} diff --git a/approot/release.xml b/approot/release.xml index 94fb4374..11ee3a08 100644 --- a/approot/release.xml +++ b/approot/release.xml @@ -19,9 +19,9 @@ ${clusters class="mb-2"}
-
+
${play-btn class="btn btn-outline-primary me-2"} - +
${container class="d-grid gap-3"}
@@ -80,16 +80,16 @@
${duration}
-
+
${play-btn class="btn btn-sm btn-outline-secondary border-0"} - +
diff --git a/approot/releases.xml b/approot/releases.xml index 9e49be94..5f5b2fef 100644 --- a/approot/releases.xml +++ b/approot/releases.xml @@ -24,7 +24,16 @@ ${all class="nav-link"} - ${play-btn class="btn btn-outline-primary me-2"}${more-btn class="btn btn-outline-primary"} +
+ ${play-btn class="btn btn-outline-primary me-2"} + +
${releases} diff --git a/approot/tracks.xml b/approot/tracks.xml index 4476e839..081c3618 100644 --- a/approot/tracks.xml +++ b/approot/tracks.xml @@ -5,8 +5,36 @@
- ${mode class="nav nav-pills mb-2"} - ${play-btn class="btn btn-outline-primary me-2"}${more-btn class="btn btn-outline-primary"} + +
+ ${play-btn class="btn btn-outline-primary me-2"} + +
${tracks}
@@ -27,15 +55,17 @@
${duration} - ${play-btn class="btn btn-sm btn-outline-secondary border-0"} - - ${more-btn data-bs-toggle="dropdown" aria-expanded="false" class="btn btn-sm btn-outline-secondary border-0"} - - +
+ ${play-btn class="btn btn-sm btn-outline-secondary border-0"} + +
diff --git a/src/lms/ui/explore/ArtistsView.cpp b/src/lms/ui/explore/ArtistsView.cpp index bae660f7..1c4c0a89 100644 --- a/src/lms/ui/explore/ArtistsView.cpp +++ b/src/lms/ui/explore/ArtistsView.cpp @@ -19,7 +19,7 @@ #include "ArtistsView.hpp" -#include +#include #include "services/database/Artist.hpp" #include "services/database/Session.hpp" @@ -45,25 +45,30 @@ Artists::Artists(Filters& filters) { addFunction("tr", &Wt::WTemplate::Functions::tr); + auto bindMenuItem {[this](const std::string& var, const Wt::WString& title, ArtistCollector::Mode mode) { - auto* menu {bindNew("mode")}; - - auto addItem = [this](Wt::WMenu& menu,const Wt::WString& str, ArtistCollector::Mode mode) + auto *menuItem {bindNew(var, title)}; + menuItem->clicked().connect([=] { - auto* item {menu.addItem(str)}; - item->clicked().connect([this, mode] { refreshView(mode); }); + refreshView(mode); + _currentActiveItem->removeStyleClass("active"); + menuItem->addStyleClass("active"); + _currentActiveItem = menuItem; + }); - if (mode == _defaultMode) - item->renderSelected(true); - }; + if (mode == _defaultMode) + { + _currentActiveItem = menuItem; + _currentActiveItem->addStyleClass("active"); + } + }}; - addItem(*menu, Wt::WString::tr("Lms.Explore.random"), ArtistCollector::Mode::Random); - addItem(*menu, Wt::WString::tr("Lms.Explore.starred"), ArtistCollector::Mode::Starred); - addItem(*menu, Wt::WString::tr("Lms.Explore.recently-played"), ArtistCollector::Mode::RecentlyPlayed); - addItem(*menu, Wt::WString::tr("Lms.Explore.most-played"), ArtistCollector::Mode::MostPlayed); - addItem(*menu, Wt::WString::tr("Lms.Explore.recently-added"), ArtistCollector::Mode::RecentlyAdded); - addItem(*menu, Wt::WString::tr("Lms.Explore.all"), ArtistCollector::Mode::All); - } + bindMenuItem("random", Wt::WString::tr("Lms.Explore.random"), ArtistCollector::Mode::Random); + bindMenuItem("starred", Wt::WString::tr("Lms.Explore.starred"), ArtistCollector::Mode::Starred); + bindMenuItem("recently-played", Wt::WString::tr("Lms.Explore.recently-played"), ArtistCollector::Mode::RecentlyPlayed); + bindMenuItem("most-played", Wt::WString::tr("Lms.Explore.most-played"), ArtistCollector::Mode::MostPlayed); + bindMenuItem("recently-added", Wt::WString::tr("Lms.Explore.recently-added"), ArtistCollector::Mode::RecentlyAdded); + bindMenuItem("all", Wt::WString::tr("Lms.Explore.all"), ArtistCollector::Mode::All); _linkType = bindNew("link-type"); _linkType->setModel(std::make_shared()); diff --git a/src/lms/ui/explore/ArtistsView.hpp b/src/lms/ui/explore/ArtistsView.hpp index 350f683d..0c2e7101 100644 --- a/src/lms/ui/explore/ArtistsView.hpp +++ b/src/lms/ui/explore/ArtistsView.hpp @@ -48,6 +48,7 @@ namespace UserInterface static constexpr std::size_t _batchSize {30}; static constexpr std::size_t _maxCount {256}; + Wt::WWidget* _currentActiveItem {}; InfiniteScrollingContainer* _container {}; ArtistCollector _artistCollector; Wt::WComboBox* _linkType {}; diff --git a/src/lms/ui/explore/ReleasesView.cpp b/src/lms/ui/explore/ReleasesView.cpp index c5377be3..7fc62e54 100644 --- a/src/lms/ui/explore/ReleasesView.cpp +++ b/src/lms/ui/explore/ReleasesView.cpp @@ -19,14 +19,13 @@ #include "ReleasesView.hpp" -#include -#include #include -#include #include "services/database/Release.hpp" #include "services/database/Session.hpp" + #include "common/InfiniteScrollingContainer.hpp" +#include "common/Template.hpp" #include "ReleaseListHelpers.hpp" #include "Filters.hpp" #include "LmsApplication.hpp" @@ -36,10 +35,11 @@ using namespace Database; namespace UserInterface { Releases::Releases(Filters& filters) -: Wt::WTemplate {Wt::WString::tr("Lms.Explore.Releases.template")} +: Template {Wt::WString::tr("Lms.Explore.Releases.template")} , _releaseCollector {filters, _defaultMode, _maxCount} { addFunction("tr", &Wt::WTemplate::Functions::tr); + addFunction("id", &Wt::WTemplate::Functions::id); auto bindMenuItem {[this](const std::string& var, const Wt::WString& title, ReleaseCollector::Mode mode) { @@ -71,24 +71,18 @@ Releases::Releases(Filters& filters) { releasesAction.emit(PlayQueueAction::Play, getAllReleases()); }); - Wt::WPushButton* moreBtn {bindNew("more-btn", Wt::WString::tr("Lms.Explore.template.more-btn"), Wt::TextFormat::XHTML)}; - moreBtn->clicked().connect([=] - { - Wt::WPopupMenu* popup {LmsApp->createPopupMenu()}; - popup->addItem(Wt::WString::tr("Lms.Explore.play-shuffled")) - ->triggered().connect([this] - { - releasesAction.emit(PlayQueueAction::PlayShuffled, getAllReleases()); - }); - popup->addItem(Wt::WString::tr("Lms.Explore.play-last")) - ->triggered().connect([this] - { - releasesAction.emit(PlayQueueAction::PlayLast, getAllReleases()); - }); - - popup->popup(moreBtn); - }); + bindNew("more-btn", Wt::WString::tr("Lms.Explore.template.more-btn"), Wt::TextFormat::XHTML); + bindNew("play-shuffled", Wt::WString::tr("Lms.Explore.play-shuffled"), Wt::TextFormat::Plain) + ->clicked().connect([=] + { + releasesAction.emit(PlayQueueAction::PlayShuffled, getAllReleases()); + }); + bindNew("play-last", Wt::WString::tr("Lms.Explore.play-last"), Wt::TextFormat::Plain) + ->clicked().connect([=] + { + releasesAction.emit(PlayQueueAction::PlayLast, getAllReleases()); + }); _container = bindNew("releases", Wt::WString::tr("Lms.Explore.Releases.template.container")); _container->onRequestElements.connect([this] diff --git a/src/lms/ui/explore/ReleasesView.hpp b/src/lms/ui/explore/ReleasesView.hpp index dae43161..366e1d1c 100644 --- a/src/lms/ui/explore/ReleasesView.hpp +++ b/src/lms/ui/explore/ReleasesView.hpp @@ -19,12 +19,11 @@ #pragma once -#include - #include -#include #include "services/database/Types.hpp" + +#include "common/Template.hpp" #include "PlayQueueAction.hpp" #include "ReleaseCollector.hpp" @@ -33,7 +32,7 @@ namespace UserInterface class Filters; class InfiniteScrollingContainer; - class Releases : public Wt::WTemplate + class Releases : public Template { public: Releases(Filters& filters); diff --git a/src/lms/ui/explore/SearchView.hpp b/src/lms/ui/explore/SearchView.hpp index f75bfd37..ff97f908 100644 --- a/src/lms/ui/explore/SearchView.hpp +++ b/src/lms/ui/explore/SearchView.hpp @@ -19,9 +19,6 @@ #pragma once -#include -#include -#include #include #include diff --git a/src/lms/ui/explore/TrackCollector.hpp b/src/lms/ui/explore/TrackCollector.hpp index a87f9759..9143c7c1 100644 --- a/src/lms/ui/explore/TrackCollector.hpp +++ b/src/lms/ui/explore/TrackCollector.hpp @@ -19,8 +19,6 @@ #pragma once -#include - #include "services/database/Object.hpp" #include "services/database/TrackId.hpp" #include "DatabaseCollectorBase.hpp" diff --git a/src/lms/ui/explore/TracksView.cpp b/src/lms/ui/explore/TracksView.cpp index 6822652b..732b0fb4 100644 --- a/src/lms/ui/explore/TracksView.cpp +++ b/src/lms/ui/explore/TracksView.cpp @@ -19,10 +19,7 @@ #include "TracksView.hpp" -#include -#include #include -#include #include "services/database/Session.hpp" #include "services/database/Track.hpp" @@ -38,55 +35,54 @@ using namespace Database; namespace UserInterface { Tracks::Tracks(Filters& filters) -: Wt::WTemplate {Wt::WString::tr("Lms.Explore.Tracks.template")}, +: Template {Wt::WString::tr("Lms.Explore.Tracks.template")}, _trackCollector {filters, _defaultMode, _maxCount} { addFunction("tr", &Wt::WTemplate::Functions::tr); + addFunction("id", &Wt::WTemplate::Functions::id); + auto bindMenuItem {[this](const std::string& var, const Wt::WString& title, TrackCollector::Mode mode) { - auto* menu {bindNew("mode")}; - - auto addItem = [this](Wt::WMenu& menu,const Wt::WString& str, TrackCollector::Mode mode) + auto *menuItem {bindNew(var, title)}; + menuItem->clicked().connect([=] { - auto* item {menu.addItem(str)}; - item->clicked().connect([this, mode] { refreshView(mode); }); + refreshView(mode); + _currentActiveItem->removeStyleClass("active"); + menuItem->addStyleClass("active"); + _currentActiveItem = menuItem; + }); - if (mode == _defaultMode) - item->renderSelected(true); - }; + if (mode == _defaultMode) + { + _currentActiveItem = menuItem; + _currentActiveItem->addStyleClass("active"); + } + }}; - addItem(*menu, Wt::WString::tr("Lms.Explore.random"), TrackCollector::Mode::Random); - addItem(*menu, Wt::WString::tr("Lms.Explore.starred"), TrackCollector::Mode::Starred); - addItem(*menu, Wt::WString::tr("Lms.Explore.recently-played"), TrackCollector::Mode::RecentlyPlayed); - addItem(*menu, Wt::WString::tr("Lms.Explore.most-played"), TrackCollector::Mode::MostPlayed); - addItem(*menu, Wt::WString::tr("Lms.Explore.recently-added"), TrackCollector::Mode::RecentlyAdded); - addItem(*menu, Wt::WString::tr("Lms.Explore.all"), TrackCollector::Mode::All); - } + bindMenuItem("random", Wt::WString::tr("Lms.Explore.random"), TrackCollector::Mode::Random); + bindMenuItem("starred", Wt::WString::tr("Lms.Explore.starred"), TrackCollector::Mode::Starred); + bindMenuItem("recently-played", Wt::WString::tr("Lms.Explore.recently-played"), TrackCollector::Mode::RecentlyPlayed); + bindMenuItem("most-played", Wt::WString::tr("Lms.Explore.most-played"), TrackCollector::Mode::MostPlayed); + bindMenuItem("recently-added", Wt::WString::tr("Lms.Explore.recently-added"), TrackCollector::Mode::RecentlyAdded); + bindMenuItem("all", Wt::WString::tr("Lms.Explore.all"), TrackCollector::Mode::All); - Wt::WPushButton* playBtn {bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML)}; - playBtn->clicked().connect([=] - { - tracksAction.emit(PlayQueueAction::Play, getAllTracks()); - }); + bindNew("play-btn", Wt::WString::tr("Lms.Explore.template.play-btn"), Wt::TextFormat::XHTML) + ->clicked().connect([=] + { + tracksAction.emit(PlayQueueAction::Play, getAllTracks()); + }); - Wt::WPushButton* moreBtn {bindNew("more-btn", Wt::WString::tr("Lms.Explore.template.more-btn"), Wt::TextFormat::XHTML)}; - moreBtn->clicked().connect([=] - { - Wt::WPopupMenu* popup {LmsApp->createPopupMenu()}; - - popup->addItem(Wt::WString::tr("Lms.Explore.play-shuffled")) - ->triggered().connect(this, [this] - { - tracksAction.emit(PlayQueueAction::PlayShuffled, getAllTracks()); - }); - popup->addItem(Wt::WString::tr("Lms.Explore.play-last")) - ->triggered().connect(this, [this] - { - tracksAction.emit(PlayQueueAction::PlayLast, getAllTracks()); - }); - - popup->popup(moreBtn); - }); + bindNew("more-btn", Wt::WString::tr("Lms.Explore.template.more-btn"), Wt::TextFormat::XHTML); + bindNew("play-shuffled", Wt::WString::tr("Lms.Explore.play-shuffled"), Wt::TextFormat::Plain) + ->clicked().connect([=] + { + tracksAction.emit(PlayQueueAction::PlayShuffled, getAllTracks()); + }); + bindNew("play-last", Wt::WString::tr("Lms.Explore.play-last"), Wt::TextFormat::Plain) + ->clicked().connect([=] + { + tracksAction.emit(PlayQueueAction::PlayLast, getAllTracks()); + }); _container = bindNew("tracks"); _container->onRequestElements.connect([this] diff --git a/src/lms/ui/explore/TracksView.hpp b/src/lms/ui/explore/TracksView.hpp index 37e7b4c5..21ecfb9c 100644 --- a/src/lms/ui/explore/TracksView.hpp +++ b/src/lms/ui/explore/TracksView.hpp @@ -19,22 +19,18 @@ #pragma once -#include - -#include -#include - #include "services/database/Types.hpp" + +#include "common/Template.hpp" #include "PlayQueueAction.hpp" #include "TrackCollector.hpp" namespace UserInterface { - class Filters; class InfiniteScrollingContainer; - class Tracks : public Wt::WTemplate + class Tracks : public Template { public: Tracks(Filters& filters); @@ -52,9 +48,9 @@ namespace UserInterface static constexpr std::size_t _batchSize {6}; static constexpr std::size_t _maxCount {160}; + Wt::WWidget* _currentActiveItem {}; InfiniteScrollingContainer* _container {}; TrackCollector _trackCollector; }; - } // namespace UserInterface