Added show more to playlist
This commit is contained in:
@@ -20,6 +20,7 @@
|
|||||||
${save-btn} ${load-btn} ${clear-btn}
|
${save-btn} ${load-btn} ${clear-btn}
|
||||||
</div>
|
</div>
|
||||||
${entries}
|
${entries}
|
||||||
|
${show-more}
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message id="btn-playlist-entry-play-btn">
|
<message id="btn-playlist-entry-play-btn">
|
||||||
|
|||||||
@@ -83,16 +83,24 @@ PlaylistEntry::create(Wt::Dbo::Session& session, Wt::Dbo::ptr<Track> track, Wt::
|
|||||||
|
|
||||||
|
|
||||||
std::vector<Wt::Dbo::ptr<Track>>
|
std::vector<Wt::Dbo::ptr<Track>>
|
||||||
Playlist::getTracks(int offset, int size) const
|
Playlist::getTracks(int offset, int size, bool& moreResults) const
|
||||||
{
|
{
|
||||||
assert(session());
|
assert(session());
|
||||||
|
|
||||||
Wt::Dbo::collection<Wt::Dbo::ptr<PlaylistEntry>> entries = session()->find<PlaylistEntry>().where("playlist_id = ?").bind(self().id()).orderBy("pos").offset(offset).limit(size);
|
moreResults = false;
|
||||||
|
|
||||||
|
Wt::Dbo::collection<Wt::Dbo::ptr<PlaylistEntry>> entries = session()->find<PlaylistEntry>().where("playlist_id = ?").bind(self().id()).orderBy("pos").offset(offset).limit(size + 1);
|
||||||
|
|
||||||
std::vector<Wt::Dbo::ptr<Track>> res;
|
std::vector<Wt::Dbo::ptr<Track>> res;
|
||||||
|
|
||||||
for (auto entry : entries)
|
for (auto entry : entries)
|
||||||
{
|
{
|
||||||
|
if (size != -1 && res.size() == static_cast<std::size_t>(size))
|
||||||
|
{
|
||||||
|
moreResults = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
res.push_back(entry->getTrack());
|
res.push_back(entry->getTrack());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class Playlist : public Wt::Dbo::Dbo<Playlist>
|
|||||||
void clear() { _entries.clear(); }
|
void clear() { _entries.clear(); }
|
||||||
|
|
||||||
// Get tracks, ordered by position
|
// Get tracks, ordered by position
|
||||||
std::vector<Wt::Dbo::ptr<Track>> getTracks(int offset = -1, int size = -1) const;
|
std::vector<Wt::Dbo::ptr<Track>> getTracks(int offset, int size, bool& moreResults) const;
|
||||||
|
|
||||||
template<class Action>
|
template<class Action>
|
||||||
void persist(Action& a)
|
void persist(Action& a)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ Artists::Artists(Filters* filters, Wt::WContainerWidget* parent)
|
|||||||
|
|
||||||
_showMore->clicked().connect(std::bind([=]
|
_showMore->clicked().connect(std::bind([=]
|
||||||
{
|
{
|
||||||
add_some();
|
addSome();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
@@ -68,11 +68,11 @@ void
|
|||||||
Artists::refresh()
|
Artists::refresh()
|
||||||
{
|
{
|
||||||
_artistsContainer->clear();
|
_artistsContainer->clear();
|
||||||
add_some();
|
addSome();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Artists::add_some()
|
Artists::addSome()
|
||||||
{
|
{
|
||||||
auto searchKeywords = splitString(_search->text().toUTF8(), " ");
|
auto searchKeywords = splitString(_search->text().toUTF8(), " ");
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class Artists : public Wt::WContainerWidget
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void refresh();
|
void refresh();
|
||||||
void add_some();
|
void addSome();
|
||||||
|
|
||||||
Filters* _filters;
|
Filters* _filters;
|
||||||
Wt::WTemplate* _showMore;
|
Wt::WTemplate* _showMore;
|
||||||
|
|||||||
+28
-9
@@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
#include <Wt/WAnchor>
|
#include <Wt/WAnchor>
|
||||||
#include <Wt/WImage>
|
#include <Wt/WImage>
|
||||||
#include <Wt/WTemplate>
|
|
||||||
#include <Wt/WText>
|
#include <Wt/WText>
|
||||||
|
|
||||||
#include "LmsApplication.hpp"
|
#include "LmsApplication.hpp"
|
||||||
@@ -32,20 +31,29 @@ static const std::string currentPlaylistName = "__current__playlist__";
|
|||||||
Playlist::Playlist(Wt::WContainerWidget* parent)
|
Playlist::Playlist(Wt::WContainerWidget* parent)
|
||||||
: Wt::WContainerWidget(parent)
|
: Wt::WContainerWidget(parent)
|
||||||
{
|
{
|
||||||
auto t = new Wt::WTemplate(Wt::WString::tr("template-playlist"), this);
|
auto container = new Wt::WTemplate(Wt::WString::tr("template-playlist"), this);
|
||||||
t->addFunction("tr", &Wt::WTemplate::Functions::tr);
|
container->addFunction("tr", &Wt::WTemplate::Functions::tr);
|
||||||
|
|
||||||
auto saveBtn = new Wt::WText(Wt::WString::tr("btn-playlist-save-btn"), Wt::XHTMLText);
|
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);
|
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);
|
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();
|
_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();
|
refresh();
|
||||||
}
|
}
|
||||||
@@ -67,7 +75,7 @@ Playlist::addTracks(const std::vector<Database::Track::pointer>& tracks)
|
|||||||
playlist.modify()->addTrack(track);
|
playlist.modify()->addTrack(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh();
|
addSome();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -86,8 +94,16 @@ Playlist::playTracks(const std::vector<Database::Track::pointer>& tracks)
|
|||||||
// TODO Immediate play
|
// TODO Immediate play
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Playlist::refresh()
|
Playlist::refresh()
|
||||||
|
{
|
||||||
|
_entriesContainer->clear();
|
||||||
|
addSome();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Playlist::addSome()
|
||||||
{
|
{
|
||||||
Wt::Dbo::Transaction transaction (DboSession());
|
Wt::Dbo::Transaction transaction (DboSession());
|
||||||
|
|
||||||
@@ -95,7 +111,8 @@ Playlist::refresh()
|
|||||||
if (!playlist)
|
if (!playlist)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto tracks = playlist->getTracks(_entriesContainer->count(), 20); // TODO
|
bool moreResults;
|
||||||
|
auto tracks = playlist->getTracks(_entriesContainer->count(), 20, moreResults);
|
||||||
for (auto track : tracks)
|
for (auto track : tracks)
|
||||||
{
|
{
|
||||||
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-playlist-entry"), _entriesContainer);
|
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-playlist-entry"), _entriesContainer);
|
||||||
@@ -136,6 +153,8 @@ Playlist::refresh()
|
|||||||
entry->bindWidget("del-btn", addBtn);
|
entry->bindWidget("del-btn", addBtn);
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_showMore->setHidden(!moreResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace UserInterface
|
} // namespace UserInterface
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Wt/WContainerWidget>
|
#include <Wt/WContainerWidget>
|
||||||
|
#include <Wt/WTemplate>
|
||||||
|
|
||||||
#include "database/Types.hpp"
|
#include "database/Types.hpp"
|
||||||
|
|
||||||
@@ -35,8 +36,10 @@ class Playlist : public Wt::WContainerWidget
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void refresh();
|
void refresh();
|
||||||
|
void addSome();
|
||||||
|
|
||||||
Wt::WContainerWidget* _entriesContainer;
|
Wt::WContainerWidget* _entriesContainer;
|
||||||
|
Wt::WTemplate* _showMore;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace UserInterface
|
} // namespace UserInterface
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ Releases::Releases(Filters* filters, Wt::WContainerWidget* parent)
|
|||||||
|
|
||||||
_showMore->clicked().connect(std::bind([=]
|
_showMore->clicked().connect(std::bind([=]
|
||||||
{
|
{
|
||||||
add_some();
|
addSome();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
@@ -69,11 +69,11 @@ void
|
|||||||
Releases::refresh()
|
Releases::refresh()
|
||||||
{
|
{
|
||||||
_releasesContainer->clear();
|
_releasesContainer->clear();
|
||||||
add_some();
|
addSome();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Releases::add_some()
|
Releases::addSome()
|
||||||
{
|
{
|
||||||
auto searchKeywords = splitString(_search->text().toUTF8(), " ");
|
auto searchKeywords = splitString(_search->text().toUTF8(), " ");
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class Releases : public Wt::WContainerWidget
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void refresh();
|
void refresh();
|
||||||
void add_some();
|
void addSome();
|
||||||
|
|
||||||
Filters* _filters;
|
Filters* _filters;
|
||||||
Wt::WTemplate* _showMore;
|
Wt::WTemplate* _showMore;
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent)
|
|||||||
|
|
||||||
_showMore->clicked().connect(std::bind([=]
|
_showMore->clicked().connect(std::bind([=]
|
||||||
{
|
{
|
||||||
add_some();
|
addSome();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
@@ -69,11 +69,11 @@ void
|
|||||||
Tracks::refresh()
|
Tracks::refresh()
|
||||||
{
|
{
|
||||||
_tracksContainer->clear();
|
_tracksContainer->clear();
|
||||||
add_some();
|
addSome();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Tracks::add_some()
|
Tracks::addSome()
|
||||||
{
|
{
|
||||||
auto searchKeywords = splitString(_search->text().toUTF8(), " ");
|
auto searchKeywords = splitString(_search->text().toUTF8(), " ");
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class Tracks : public Wt::WContainerWidget
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void refresh();
|
void refresh();
|
||||||
void add_some();
|
void addSome();
|
||||||
|
|
||||||
Wt::WContainerWidget* _tracksContainer;
|
Wt::WContainerWidget* _tracksContainer;
|
||||||
Wt::WTemplate* _showMore;
|
Wt::WTemplate* _showMore;
|
||||||
|
|||||||
Reference in New Issue
Block a user