Implement basics of search using sql like. Now with so much data passing, curtail some object deletions.
This commit is contained in:
@@ -69,6 +69,8 @@ public:
|
|||||||
std::list<PlayerEvent> lastInternalEvents;
|
std::list<PlayerEvent> lastInternalEvents;
|
||||||
Wt::Dbo::backend::Sqlite3* sqliteConnection;
|
Wt::Dbo::backend::Sqlite3* sqliteConnection;
|
||||||
Wt::Dbo::FixedSqlConnectionPool* connectionPool;
|
Wt::Dbo::FixedSqlConnectionPool* connectionPool;
|
||||||
|
|
||||||
|
void getPictureFromTrack(AudioTrack* trackToFill);
|
||||||
private:
|
private:
|
||||||
GroovePlayerMgr (std::string dbFile);
|
GroovePlayerMgr (std::string dbFile);
|
||||||
~GroovePlayerMgr();
|
~GroovePlayerMgr();
|
||||||
@@ -83,7 +85,6 @@ private:
|
|||||||
void removeOrphanedTracks(Wt::Dbo::Session* session);
|
void removeOrphanedTracks(Wt::Dbo::Session* session);
|
||||||
|
|
||||||
AudioTrack getCurrentTrackDB(Wt::Dbo::Session* session);
|
AudioTrack getCurrentTrackDB(Wt::Dbo::Session* session);
|
||||||
void getPictureFromTrack(AudioTrack* trackToFill);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "RequestInterface.h"
|
#include "RequestInterface.h"
|
||||||
|
#include <Wt/Dbo/Session>
|
||||||
|
#include <Wt/Dbo/Transaction>
|
||||||
|
#include "../db/UserAction.h"
|
||||||
|
#include <Wt/Dbo/ptr>
|
||||||
|
#include <Wt/Dbo/collection>
|
||||||
|
|
||||||
RequestInterface::RequestInterface(WebInterface* app)
|
RequestInterface::RequestInterface(WebInterface* app)
|
||||||
{
|
{
|
||||||
@@ -40,9 +45,10 @@ RequestInterface::RequestInterface(WebInterface* app)
|
|||||||
searchBtn->setText("");
|
searchBtn->setText("");
|
||||||
searchLayout->addWidget(searchBox);
|
searchLayout->addWidget(searchBox);
|
||||||
searchLayout->addWidget(searchBtn);
|
searchLayout->addWidget(searchBtn);
|
||||||
//TODO:btn connections
|
searchBtn->clicked().connect(this, &RequestInterface::searchClicked);
|
||||||
|
|
||||||
resultBody->setLayout(resultLayout);
|
resultBody->setLayout(resultLayout);
|
||||||
|
resultBody->setOverflow(Wt::WContainerWidget::OverflowAuto);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,3 +56,56 @@ void RequestInterface::trackRequestClicked(AudioTrack track)
|
|||||||
{
|
{
|
||||||
//TODO
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RequestInterface::searchClicked()
|
||||||
|
{
|
||||||
|
if(!searchBox->text().empty())
|
||||||
|
{
|
||||||
|
Wt::Dbo::Session sqlSession;
|
||||||
|
sqlSession.setConnectionPool(*GroovePlayerMgr::getInstance()->connectionPool);
|
||||||
|
sqlSession.mapClass<User>("user");
|
||||||
|
sqlSession.mapClass<AudioTrack>("tracks");
|
||||||
|
sqlSession.mapClass<UserAction>("actions");
|
||||||
|
Wt::Dbo::Transaction searchTransaction(sqlSession);
|
||||||
|
|
||||||
|
//Do quick check for invalid seaches
|
||||||
|
if(searchBox->text().toUTF8().find("\"") != std::string::npos)
|
||||||
|
{
|
||||||
|
//Bad character, reject search.
|
||||||
|
searchBox->setText("");
|
||||||
|
searchTransaction.commit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Do a like search on title, artist, and album on DB
|
||||||
|
Wt::Dbo::collection<Wt::Dbo::ptr<AudioTrack>> trackOptions = sqlSession.find<AudioTrack>(std::string("where tracks.name like \"%")+searchBox->text().toUTF8()+std::string("%\" OR tracks.artist like \"%")+searchBox->text().toUTF8()+std::string("%\" OR tracks.album like \"%")+searchBox->text().toUTF8()+std::string("%\""));
|
||||||
|
|
||||||
|
//Make sure all items are gone
|
||||||
|
for(RequestItem* item: foundItems)
|
||||||
|
{
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
foundItems.clear();
|
||||||
|
resultLayout->clear();
|
||||||
|
//Put results into grid
|
||||||
|
if(trackOptions.size() > 0 && trackOptions.size() < 50) {
|
||||||
|
bool left = true;
|
||||||
|
int rowCount = 0;
|
||||||
|
for(Wt::Dbo::collection<Wt::Dbo::ptr<AudioTrack>>::const_iterator dbTrack = trackOptions.begin(); dbTrack != trackOptions.end(); ++dbTrack)
|
||||||
|
{
|
||||||
|
AudioTrack trackItem = (*(*dbTrack));
|
||||||
|
GroovePlayerMgr::getInstance()->getPictureFromTrack(&trackItem);
|
||||||
|
RequestItem* item = new RequestItem(this,trackItem);
|
||||||
|
foundItems.push_back(item);
|
||||||
|
resultLayout->addWidget(item,rowCount,left?0:1);
|
||||||
|
if(!left) rowCount += 1;
|
||||||
|
left = !left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchBox->setText("Not enough/too many results");
|
||||||
|
}
|
||||||
|
searchTransaction.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public:
|
|||||||
RequestItem(RequestInterface* parent, AudioTrack track) {
|
RequestItem(RequestInterface* parent, AudioTrack track) {
|
||||||
this->track = new TrackDetails();
|
this->track = new TrackDetails();
|
||||||
this->track->updateWithTrackDetails(track);
|
this->track->updateWithTrackDetails(track);
|
||||||
|
this->track->changeBackgroundColor(Wt::WColor("gainsboro"));
|
||||||
layout = new Wt::WHBoxLayout();
|
layout = new Wt::WHBoxLayout();
|
||||||
voteBtn = new Wt::WPushButton();
|
voteBtn = new Wt::WPushButton();
|
||||||
this->parent = parent;
|
this->parent = parent;
|
||||||
@@ -60,6 +61,9 @@ public:
|
|||||||
layout->addWidget(voteBtn,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignRight);
|
layout->addWidget(voteBtn,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignRight);
|
||||||
voteBtn->clicked().connect(this, &RequestItem::requestClicked);
|
voteBtn->clicked().connect(this, &RequestItem::requestClicked);
|
||||||
};
|
};
|
||||||
|
~RequestItem(){
|
||||||
|
this->clear();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Wt::WVBoxLayout* mainLayout;
|
Wt::WVBoxLayout* mainLayout;
|
||||||
@@ -69,8 +73,10 @@ public:
|
|||||||
Wt::WPushButton* searchBtn;
|
Wt::WPushButton* searchBtn;
|
||||||
Wt::WContainerWidget* resultBody;
|
Wt::WContainerWidget* resultBody;
|
||||||
Wt::WGridLayout* resultLayout;
|
Wt::WGridLayout* resultLayout;
|
||||||
|
std::list<RequestItem*> foundItems;
|
||||||
|
|
||||||
void trackRequestClicked(AudioTrack track);
|
void trackRequestClicked(AudioTrack track);
|
||||||
|
void searchClicked();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // REQUESTINTERFACE_H
|
#endif // REQUESTINTERFACE_H
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ TrackDetails::TrackDetails()
|
|||||||
metaLayout->addWidget(trackArtist,1,Wt::AlignmentFlag::AlignBottom);
|
metaLayout->addWidget(trackArtist,1,Wt::AlignmentFlag::AlignBottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TrackDetails::~TrackDetails()
|
||||||
|
{
|
||||||
|
mainLayout->clear();
|
||||||
|
delete coverData;
|
||||||
|
}
|
||||||
|
|
||||||
void TrackDetails::updateWithTrackDetails(AudioTrack track)
|
void TrackDetails::updateWithTrackDetails(AudioTrack track)
|
||||||
{
|
{
|
||||||
this->animateHide(Wt::WAnimation(Wt::WAnimation::Fade));
|
this->animateHide(Wt::WAnimation(Wt::WAnimation::Fade));
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ class TrackDetails : public Wt::WContainerWidget
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TrackDetails();
|
TrackDetails();
|
||||||
|
~TrackDetails();
|
||||||
Wt::WHBoxLayout* mainLayout;
|
Wt::WHBoxLayout* mainLayout;
|
||||||
Wt::WVBoxLayout* metaLayout;
|
Wt::WVBoxLayout* metaLayout;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user