diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index efaac9c11fed13dc03caf4e3245aa690ff3d5789..796fd0c8a00c1f227a2be7cc09fbe99e2bf607e1 100644 --- a/src/GroovePlayer.cpp +++ b/src/GroovePlayer.cpp @@ -150,7 +150,7 @@ std::list GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio if(requestQueue.size() > 0) { //There's a request. Pick one up front and put as third item. - AudioTrack selected = requestQueue.front(); + AudioTrack selected = requestQueue.front().first; getPictureFromTrack(&selected); selectedTracks.push_back(selected); } @@ -308,7 +308,7 @@ void GroovePlayerMgr::grooveEventLoop() if(requestQueue.size() > 0) { //If winning track was a request, now you can remove it from request queue. - if(requestQueue.front().trackFingerprint == winner.trackFingerprint) + if(requestQueue.front().first.trackFingerprint == winner.trackFingerprint) { requestQueue.pop_front(); } @@ -325,7 +325,7 @@ void GroovePlayerMgr::grooveEventLoop() //Pick request song if there are any. if(requestQueue.size() > 0) { - winner = requestQueue.front(); + winner = requestQueue.front().first; requestQueue.pop_front(); } else diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h index 940c177497824cd971f7e10934919515eac0acb5..efe5e062ffe879552b4b9b9ca45369b833e94d8a 100644 --- a/src/GroovePlayer.h +++ b/src/GroovePlayer.h @@ -65,7 +65,7 @@ public: User userInvolved; std::list tracksInvolved; }; - std::list requestQueue; + std::list> requestQueue; std::list lastInternalEvents; Wt::Dbo::backend::Sqlite3* sqliteConnection; Wt::Dbo::FixedSqlConnectionPool* connectionPool; diff --git a/src/WebInterface.cpp b/src/WebInterface.cpp index 8381a74cf7c74b43a2cc4d07d4fe8d4bf8a3aeb4..bf2e1ccea4c402e57b90f6b46f0660291bbe363c 100644 --- a/src/WebInterface.cpp +++ b/src/WebInterface.cpp @@ -23,6 +23,7 @@ #include #include #include +#include struct WebInterface::internal { @@ -75,6 +76,7 @@ void WebInterface::playPauseActionFromServer(User userPausing, bool pause) void WebInterface::songChangedFromServer(AudioTrack nextTrack) { priv_int->playerUI->updateDetailsFromServer(nextTrack); + priv_int->playerUI->requestPane->updateRequestButtonState(); triggerUpdate(); } @@ -114,5 +116,6 @@ void WebInterface::voteTracksUpdatedFromServer(std::list voteableTra std::string WebInterface::getNotificationJs(std::string notificationText) { - return std::string("function notifyMe(a,b){var c=\"")+notificationText+std::string("\";if('Notification'in window)if('granted'===Notification.permission){new Notification(c)}else'denied'!==Notification.permission&&Notification.requestPermission(function(a){if('granted'===a){new Notification(c)}});else;}"); + std::string escapedText = std::regex_replace(notificationText,std::regex("\""),"'"); + return std::string("function notifyMe(a,b){var c=\"")+escapedText+std::string("\";if('Notification'in window)if('granted'===Notification.permission){new Notification(c)}else'denied'!==Notification.permission&&Notification.requestPermission(function(a){if('granted'===a){new Notification(c)}});else;}"); } diff --git a/src/ui/RequestInterface.cpp b/src/ui/RequestInterface.cpp index 0bdb4ec91b60213893a6ea9d465f4bef7e1682ed..e48fa6500cf6af1030339fd2e9efb102bf2e1edd 100644 --- a/src/ui/RequestInterface.cpp +++ b/src/ui/RequestInterface.cpp @@ -54,7 +54,45 @@ RequestInterface::RequestInterface(WebInterface* app) void RequestInterface::trackRequestClicked(AudioTrack track) { - //TODO + if(getRequestCountForUser(app->currentUser) < 3) + { + GroovePlayerMgr::getInstance()->requestQueue.push_back(std::pair(track,app->currentUser)); + //Now check if this is this user's last request and disable buttons. + updateRequestButtonState(); + } +} + +void RequestInterface::updateRequestButtonState() +{ + if(getRequestCountForUser(app->currentUser) < 3) + { + //enable buttons + for(RequestItem* item : foundItems) + { + if(item != nullptr) item->voteBtn->setEnabled(true); + } + } + else + { + //disable buttons + for(RequestItem* item : foundItems) + { + if(item != nullptr) item->voteBtn->setEnabled(false); + } + } +} + +int RequestInterface::getRequestCountForUser(User user) +{ + int count = 0; + for(std::pair request : GroovePlayerMgr::getInstance()->requestQueue) + { + if(request.second.username == user.username) + { + count += 1; + } + } + return count; } void RequestInterface::searchClicked() @@ -101,6 +139,7 @@ void RequestInterface::searchClicked() if(!left) rowCount += 1; left = !left; } + updateRequestButtonState(); } else { diff --git a/src/ui/RequestInterface.h b/src/ui/RequestInterface.h index fe3798e4a3752f5534c240d9143c13a4a2b5867d..e55e769cc0bb5554d5be8496a0258f0088a5e281 100644 --- a/src/ui/RequestInterface.h +++ b/src/ui/RequestInterface.h @@ -77,6 +77,8 @@ public: void trackRequestClicked(AudioTrack track); void searchClicked(); + int getRequestCountForUser(User user); + void updateRequestButtonState(); }; #endif // REQUESTINTERFACE_H diff --git a/src/ui/TrackDetails.cpp b/src/ui/TrackDetails.cpp index e3c9fedd08553017354c09ab471f9997eed6460f..5b5886daf51c5365d47977c2ef0050355f095bab 100644 --- a/src/ui/TrackDetails.cpp +++ b/src/ui/TrackDetails.cpp @@ -67,6 +67,7 @@ void TrackDetails::updateWithTrackDetails(AudioTrack track) trackAlbum->setText(track.trackAlbumName); trackFingerprint = track.trackFingerprint; trackGenre = track.trackGenre; + trackPath = track.trackPath; //Set image to data from track obj. coverData = new Wt::WMemoryResource(track.coverMimeType); @@ -97,5 +98,6 @@ AudioTrack TrackDetails::extractTrackFromDetails() track.trackAlbumName = trackAlbum->text().toUTF8(); track.trackGenre = trackGenre; track.trackFingerprint = trackFingerprint; + track.trackPath = trackPath; return track; } diff --git a/src/ui/TrackDetails.h b/src/ui/TrackDetails.h index 92f13850d1bb2d80da6c4a50129d4e63fd35f78f..09aa21729846dabb003bf64c4bb5f1c9db60fcd6 100644 --- a/src/ui/TrackDetails.h +++ b/src/ui/TrackDetails.h @@ -44,6 +44,7 @@ public: std::string trackFingerprint; std::string trackGenre; + std::string trackPath; void updateWithTrackDetails(AudioTrack track); void changeBackgroundColor(Wt::WColor color);