From 5b89f375b256f0fae55a95fbb03ad8765b780ca8 Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sun, 19 Feb 2017 21:07:14 -0500 Subject: [PATCH] Implement basics of search using sql like. Now with so much data passing, curtail some object deletions. --- src/GroovePlayer.h | 3 +- src/ui/RequestInterface.cpp | 61 ++++++++++++++++++++++++++++++++++++- src/ui/RequestInterface.h | 6 ++++ src/ui/TrackDetails.cpp | 6 ++++ src/ui/TrackDetails.h | 1 + 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h index deeee3c..940c177 100644 --- a/src/GroovePlayer.h +++ b/src/GroovePlayer.h @@ -69,6 +69,8 @@ public: std::list lastInternalEvents; Wt::Dbo::backend::Sqlite3* sqliteConnection; Wt::Dbo::FixedSqlConnectionPool* connectionPool; + + void getPictureFromTrack(AudioTrack* trackToFill); private: GroovePlayerMgr (std::string dbFile); ~GroovePlayerMgr(); @@ -83,7 +85,6 @@ private: void removeOrphanedTracks(Wt::Dbo::Session* session); AudioTrack getCurrentTrackDB(Wt::Dbo::Session* session); - void getPictureFromTrack(AudioTrack* trackToFill); }; diff --git a/src/ui/RequestInterface.cpp b/src/ui/RequestInterface.cpp index e7870aa..0bdb4ec 100644 --- a/src/ui/RequestInterface.cpp +++ b/src/ui/RequestInterface.cpp @@ -18,6 +18,11 @@ */ #include "RequestInterface.h" +#include +#include +#include "../db/UserAction.h" +#include +#include RequestInterface::RequestInterface(WebInterface* app) { @@ -40,9 +45,10 @@ RequestInterface::RequestInterface(WebInterface* app) searchBtn->setText(""); searchLayout->addWidget(searchBox); searchLayout->addWidget(searchBtn); - //TODO:btn connections + searchBtn->clicked().connect(this, &RequestInterface::searchClicked); resultBody->setLayout(resultLayout); + resultBody->setOverflow(Wt::WContainerWidget::OverflowAuto); } @@ -50,3 +56,56 @@ void RequestInterface::trackRequestClicked(AudioTrack track) { //TODO } + +void RequestInterface::searchClicked() +{ + if(!searchBox->text().empty()) + { + Wt::Dbo::Session sqlSession; + sqlSession.setConnectionPool(*GroovePlayerMgr::getInstance()->connectionPool); + sqlSession.mapClass("user"); + sqlSession.mapClass("tracks"); + sqlSession.mapClass("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> trackOptions = sqlSession.find(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>::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(); + } +} diff --git a/src/ui/RequestInterface.h b/src/ui/RequestInterface.h index e0334fd..fe3798e 100644 --- a/src/ui/RequestInterface.h +++ b/src/ui/RequestInterface.h @@ -48,6 +48,7 @@ public: RequestItem(RequestInterface* parent, AudioTrack track) { this->track = new TrackDetails(); this->track->updateWithTrackDetails(track); + this->track->changeBackgroundColor(Wt::WColor("gainsboro")); layout = new Wt::WHBoxLayout(); voteBtn = new Wt::WPushButton(); this->parent = parent; @@ -60,6 +61,9 @@ public: layout->addWidget(voteBtn,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignRight); voteBtn->clicked().connect(this, &RequestItem::requestClicked); }; + ~RequestItem(){ + this->clear(); + } }; Wt::WVBoxLayout* mainLayout; @@ -69,8 +73,10 @@ public: Wt::WPushButton* searchBtn; Wt::WContainerWidget* resultBody; Wt::WGridLayout* resultLayout; + std::list foundItems; void trackRequestClicked(AudioTrack track); + void searchClicked(); }; #endif // REQUESTINTERFACE_H diff --git a/src/ui/TrackDetails.cpp b/src/ui/TrackDetails.cpp index 5ff9ae0..e3c9fed 100644 --- a/src/ui/TrackDetails.cpp +++ b/src/ui/TrackDetails.cpp @@ -53,6 +53,12 @@ TrackDetails::TrackDetails() metaLayout->addWidget(trackArtist,1,Wt::AlignmentFlag::AlignBottom); } +TrackDetails::~TrackDetails() +{ + mainLayout->clear(); + delete coverData; +} + void TrackDetails::updateWithTrackDetails(AudioTrack track) { this->animateHide(Wt::WAnimation(Wt::WAnimation::Fade)); diff --git a/src/ui/TrackDetails.h b/src/ui/TrackDetails.h index 0e3e45a..92f1385 100644 --- a/src/ui/TrackDetails.h +++ b/src/ui/TrackDetails.h @@ -32,6 +32,7 @@ class TrackDetails : public Wt::WContainerWidget { public: TrackDetails(); + ~TrackDetails(); Wt::WHBoxLayout* mainLayout; Wt::WVBoxLayout* metaLayout; -- GitLab