diff --git a/approot/playlist.xml b/approot/playlist.xml index 5b097e83..2543d616 100644 --- a/approot/playlist.xml +++ b/approot/playlist.xml @@ -20,6 +20,7 @@ ${save-btn} ${load-btn} ${clear-btn} ${entries} + ${show-more} diff --git a/src/database/Playlist.cpp b/src/database/Playlist.cpp index 0094fa7b..24e8e68b 100644 --- a/src/database/Playlist.cpp +++ b/src/database/Playlist.cpp @@ -83,16 +83,24 @@ PlaylistEntry::create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, Wt:: std::vector> -Playlist::getTracks(int offset, int size) const +Playlist::getTracks(int offset, int size, bool& moreResults) const { assert(session()); - Wt::Dbo::collection> entries = session()->find().where("playlist_id = ?").bind(self().id()).orderBy("pos").offset(offset).limit(size); + moreResults = false; + + Wt::Dbo::collection> entries = session()->find().where("playlist_id = ?").bind(self().id()).orderBy("pos").offset(offset).limit(size + 1); std::vector> res; for (auto entry : entries) { + if (size != -1 && res.size() == static_cast(size)) + { + moreResults = true; + break; + } + res.push_back(entry->getTrack()); } diff --git a/src/database/Playlist.hpp b/src/database/Playlist.hpp index b8f62474..816e4098 100644 --- a/src/database/Playlist.hpp +++ b/src/database/Playlist.hpp @@ -54,7 +54,7 @@ class Playlist : public Wt::Dbo::Dbo void clear() { _entries.clear(); } // Get tracks, ordered by position - std::vector> getTracks(int offset = -1, int size = -1) const; + std::vector> getTracks(int offset, int size, bool& moreResults) const; template void persist(Action& a) diff --git a/src/ui/ArtistsView.cpp b/src/ui/ArtistsView.cpp index 3038b861..f801fa05 100644 --- a/src/ui/ArtistsView.cpp +++ b/src/ui/ArtistsView.cpp @@ -56,7 +56,7 @@ Artists::Artists(Filters* filters, Wt::WContainerWidget* parent) _showMore->clicked().connect(std::bind([=] { - add_some(); + addSome(); })); refresh(); @@ -68,11 +68,11 @@ void Artists::refresh() { _artistsContainer->clear(); - add_some(); + addSome(); } void -Artists::add_some() +Artists::addSome() { auto searchKeywords = splitString(_search->text().toUTF8(), " "); diff --git a/src/ui/ArtistsView.hpp b/src/ui/ArtistsView.hpp index c8b42a39..f51c8706 100644 --- a/src/ui/ArtistsView.hpp +++ b/src/ui/ArtistsView.hpp @@ -37,7 +37,7 @@ class Artists : public Wt::WContainerWidget private: void refresh(); - void add_some(); + void addSome(); Filters* _filters; Wt::WTemplate* _showMore; diff --git a/src/ui/PlaylistView.cpp b/src/ui/PlaylistView.cpp index 57f8474c..d3644bc2 100644 --- a/src/ui/PlaylistView.cpp +++ b/src/ui/PlaylistView.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include "LmsApplication.hpp" @@ -32,20 +31,29 @@ static const std::string currentPlaylistName = "__current__playlist__"; Playlist::Playlist(Wt::WContainerWidget* parent) : Wt::WContainerWidget(parent) { - auto t = new Wt::WTemplate(Wt::WString::tr("template-playlist"), this); - t->addFunction("tr", &Wt::WTemplate::Functions::tr); + auto container = new Wt::WTemplate(Wt::WString::tr("template-playlist"), this); + container->addFunction("tr", &Wt::WTemplate::Functions::tr); auto saveBtn = new Wt::WText(Wt::WString::tr("btn-playlist-save-btn"), Wt::XHTMLText); - t->bindWidget("save-btn", saveBtn); + container->bindWidget("save-btn", saveBtn); auto loadBtn = new Wt::WText(Wt::WString::tr("btn-playlist-load-btn"), Wt::XHTMLText); - t->bindWidget("load-btn", loadBtn); + container->bindWidget("load-btn", loadBtn); auto clearBtn = new Wt::WText(Wt::WString::tr("btn-playlist-clear-btn"), Wt::XHTMLText); - t->bindWidget("clear-btn", clearBtn); + container->bindWidget("clear-btn", clearBtn); _entriesContainer = new Wt::WContainerWidget(); - t->bindWidget("entries", _entriesContainer); + container->bindWidget("entries", _entriesContainer); + + _showMore = new Wt::WTemplate(Wt::WString::tr("template-show-more")); + _showMore->addFunction("tr", &Wt::WTemplate::Functions::tr); + container->bindWidget("show-more", _showMore); + + _showMore->clicked().connect(std::bind([=] + { + addSome(); + })); refresh(); } @@ -67,7 +75,7 @@ Playlist::addTracks(const std::vector& tracks) playlist.modify()->addTrack(track); } - refresh(); + addSome(); } void @@ -86,8 +94,16 @@ Playlist::playTracks(const std::vector& tracks) // TODO Immediate play } + void Playlist::refresh() +{ + _entriesContainer->clear(); + addSome(); +} + +void +Playlist::addSome() { Wt::Dbo::Transaction transaction (DboSession()); @@ -95,7 +111,8 @@ Playlist::refresh() if (!playlist) return; - auto tracks = playlist->getTracks(_entriesContainer->count(), 20); // TODO + bool moreResults; + auto tracks = playlist->getTracks(_entriesContainer->count(), 20, moreResults); for (auto track : tracks) { Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-playlist-entry"), _entriesContainer); @@ -136,6 +153,8 @@ Playlist::refresh() entry->bindWidget("del-btn", addBtn); // TODO } + + _showMore->setHidden(!moreResults); } } // namespace UserInterface diff --git a/src/ui/PlaylistView.hpp b/src/ui/PlaylistView.hpp index 7a0dc595..03db9226 100644 --- a/src/ui/PlaylistView.hpp +++ b/src/ui/PlaylistView.hpp @@ -20,6 +20,7 @@ #pragma once #include +#include #include "database/Types.hpp" @@ -35,8 +36,10 @@ class Playlist : public Wt::WContainerWidget private: void refresh(); + void addSome(); Wt::WContainerWidget* _entriesContainer; + Wt::WTemplate* _showMore; }; } // namespace UserInterface diff --git a/src/ui/ReleasesView.cpp b/src/ui/ReleasesView.cpp index 1353a2b8..f8b9df0e 100644 --- a/src/ui/ReleasesView.cpp +++ b/src/ui/ReleasesView.cpp @@ -57,7 +57,7 @@ Releases::Releases(Filters* filters, Wt::WContainerWidget* parent) _showMore->clicked().connect(std::bind([=] { - add_some(); + addSome(); })); refresh(); @@ -69,11 +69,11 @@ void Releases::refresh() { _releasesContainer->clear(); - add_some(); + addSome(); } void -Releases::add_some() +Releases::addSome() { auto searchKeywords = splitString(_search->text().toUTF8(), " "); diff --git a/src/ui/ReleasesView.hpp b/src/ui/ReleasesView.hpp index b14fcdf9..6626656b 100644 --- a/src/ui/ReleasesView.hpp +++ b/src/ui/ReleasesView.hpp @@ -37,7 +37,7 @@ class Releases : public Wt::WContainerWidget private: void refresh(); - void add_some(); + void addSome(); Filters* _filters; Wt::WTemplate* _showMore; diff --git a/src/ui/TracksView.cpp b/src/ui/TracksView.cpp index 31ae4233..cbfd45a8 100644 --- a/src/ui/TracksView.cpp +++ b/src/ui/TracksView.cpp @@ -56,7 +56,7 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent) _showMore->clicked().connect(std::bind([=] { - add_some(); + addSome(); })); refresh(); @@ -69,11 +69,11 @@ void Tracks::refresh() { _tracksContainer->clear(); - add_some(); + addSome(); } void -Tracks::add_some() +Tracks::addSome() { auto searchKeywords = splitString(_search->text().toUTF8(), " "); diff --git a/src/ui/TracksView.hpp b/src/ui/TracksView.hpp index a6b52b42..3f949770 100644 --- a/src/ui/TracksView.hpp +++ b/src/ui/TracksView.hpp @@ -36,7 +36,7 @@ class Tracks : public Wt::WContainerWidget private: void refresh(); - void add_some(); + void addSome(); Wt::WContainerWidget* _tracksContainer; Wt::WTemplate* _showMore;