From 48a33d31ecefc7b83f08a71f0d7d760a8200d206 Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sun, 19 Feb 2017 12:43:35 -0500 Subject: [PATCH] Have backend also keep track of users who voted on a track to prevent duplicate voting. Add vote count next to vote button. Make sure these details are correct, event on refresh. --- src/GroovePlayer.cpp | 2 ++ src/GroovePlayer.h | 1 + src/WebInterface.cpp | 4 +++- src/ui/PlayerInterface.cpp | 41 +++++++++++++++++++++++++++++++++++--- src/ui/PlayerInterface.h | 5 +++++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index 91706b1..efaac9c 100644 --- a/src/GroovePlayer.cpp +++ b/src/GroovePlayer.cpp @@ -251,6 +251,7 @@ void GroovePlayerMgr::grooveEventLoop() //Pick new batch of tracks to vote on and inform UI of update. currentVoteBatch = getNextVoteBatch(&sqlSession); currentVoteStatus = std::list>(); + currentUsersVoted.clear(); for(auto track : currentVoteBatch) { currentVoteStatus.push_back(std::pair(track,0)); @@ -381,6 +382,7 @@ void GroovePlayerMgr::grooveEventLoop() std::pair newItem = (*voteItem); newItem.second = ++(newItem.second); currentVoteStatus.insert(currentVoteStatus.erase(voteItem),newItem); + currentUsersVoted.push_back(event.userInvolved); break; } } diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h index 92e4886..deeee3c 100644 --- a/src/GroovePlayer.h +++ b/src/GroovePlayer.h @@ -51,6 +51,7 @@ public: AudioTrack currentTrack; std::list currentVoteBatch; std::list> currentVoteStatus; + std::list currentUsersVoted; bool voteEndedButNotNextTrackYet = false; std::list currentSkipRequester; std::chrono::steady_clock::time_point skipRequestedAt; diff --git a/src/WebInterface.cpp b/src/WebInterface.cpp index e3ec2e8..8381a74 100644 --- a/src/WebInterface.cpp +++ b/src/WebInterface.cpp @@ -62,6 +62,7 @@ void WebInterface::loginCompleted() priv_int->playerUI->animateShow(Wt::WAnimation(Wt::WAnimation::AnimationEffect::Fade, Wt::WAnimation::TimingFunction::EaseIn, 500)); priv_int->playerUI->updateDetailsFromServer(GroovePlayerMgr::getInstance()->currentTrack); priv_int->playerUI->updateVoteableTracksFromServer(GroovePlayerMgr::getInstance()->currentVoteBatch); + priv_int->playerUI->updateVoteTrackState(); } void WebInterface::playPauseActionFromServer(User userPausing, bool pause) @@ -94,7 +95,7 @@ void WebInterface::skipVoteUpdateFromServer(User userVoting, bool forSkip) void WebInterface::voteNextSongFromServer(User userVoting, AudioTrack trackVoted) { - //priv_int->playerUI->tempText->setText(priv_int->playerUI->tempText->text()+"nextvote"); + priv_int->playerUI->updateVoteCount(trackVoted); triggerUpdate(); } @@ -107,6 +108,7 @@ void WebInterface::voteNextPollClosedFromServer(AudioTrack winner) void WebInterface::voteTracksUpdatedFromServer(std::list voteableTracks) { priv_int->playerUI->updateVoteableTracksFromServer(voteableTracks); + priv_int->playerUI->updateVoteTrackState(); triggerUpdate(); } diff --git a/src/ui/PlayerInterface.cpp b/src/ui/PlayerInterface.cpp index 725db8f..be96cde 100644 --- a/src/ui/PlayerInterface.cpp +++ b/src/ui/PlayerInterface.cpp @@ -83,8 +83,10 @@ PlayerInterface::PlayerInterface(WebInterface* app) track1vote->decorationStyle().font().setFamily(Wt::WFont::Default,"FontAwesome"); track1vote->setMaximumSize(Wt::WLength(50,Wt::WLength::Pixel),Wt::WLength(50,Wt::WLength::Pixel)); track1vote->setText(""); - track1->addWidget(track1details,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); + track1votecount = new Wt::WText("0"); + track1->addWidget(track1details,1,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); track1->addWidget(track1vote,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignRight); + track1->addWidget(track1votecount,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); track2 = new Wt::WHBoxLayout(); track2details = new TrackDetails(); track2details->changeBackgroundColor(Wt::WColor("gainsboro")); @@ -93,8 +95,10 @@ PlayerInterface::PlayerInterface(WebInterface* app) track2vote->decorationStyle().font().setFamily(Wt::WFont::Default,"FontAwesome"); track2vote->setMaximumSize(Wt::WLength(50,Wt::WLength::Pixel),Wt::WLength(50,Wt::WLength::Pixel)); track2vote->setText(""); - track2->addWidget(track2details,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); + track2votecount = new Wt::WText("0"); + track2->addWidget(track2details,1,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); track2->addWidget(track2vote,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignRight); + track2->addWidget(track2votecount,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); track3 = new Wt::WHBoxLayout(); track3details = new TrackDetails(); track3details->changeBackgroundColor(Wt::WColor("gainsboro")); @@ -103,8 +107,10 @@ PlayerInterface::PlayerInterface(WebInterface* app) track3vote->decorationStyle().font().setFamily(Wt::WFont::Default,"FontAwesome"); track3vote->setMaximumSize(Wt::WLength(50,Wt::WLength::Pixel),Wt::WLength(50,Wt::WLength::Pixel)); track3vote->setText(""); - track3->addWidget(track3details,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); + track3votecount = new Wt::WText("0"); + track3->addWidget(track3details,1,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); track3->addWidget(track3vote,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignRight); + track3->addWidget(track3votecount,0,Wt::AlignmentFlag::AlignMiddle | Wt::AlignmentFlag::AlignLeft); track1vote->clicked().connect(this, &PlayerInterface::vote1clicked); track2vote->clicked().connect(this, &PlayerInterface::vote2clicked); track3vote->clicked().connect(this, &PlayerInterface::vote3clicked); @@ -205,6 +211,14 @@ void PlayerInterface::updateVotingEnded(AudioTrack winner) else if(track3details->trackMatches(winner)) track3details->changeBackgroundColor(Wt::WColor("gold")); } +void PlayerInterface::updateVoteCount(AudioTrack trackVoted) +{ + //update track vote + if(track1details->trackMatches(trackVoted)) track1votecount->setText(std::to_string(std::stoi(track1votecount->text())+1)); + else if(track2details->trackMatches(trackVoted)) track2votecount->setText(std::to_string(std::stoi(track2votecount->text())+1)); + else if(track3details->trackMatches(trackVoted)) track3votecount->setText(std::to_string(std::stoi(track3votecount->text())+1)); +} + void PlayerInterface::playpauseUpdated() { if(isPaused) @@ -274,3 +288,24 @@ void PlayerInterface::updateVoteableTracksFromServer(std::list track track2details->changeBackgroundColor(Wt::WColor("gainsboro")); track3details->changeBackgroundColor(Wt::WColor("gainsboro")); } + +void PlayerInterface::updateVoteTrackState() +{ + //Update vote counts of tracks + auto trackIter = GroovePlayerMgr::getInstance()->currentVoteStatus.begin(); + track1votecount->setText(std::to_string(trackIter->second)); + ++trackIter; + track2votecount->setText(std::to_string(trackIter->second)); + ++trackIter; + track3votecount->setText(std::to_string(trackIter->second)); + //Make sure vote buttons are disabled if this user already voted + for(User user : GroovePlayerMgr::getInstance()->currentUsersVoted) + { + if(user.username == app->currentUser.username) + { + track1vote->setEnabled(false); + track2vote->setEnabled(false); + track3vote->setEnabled(false); + } + } +} diff --git a/src/ui/PlayerInterface.h b/src/ui/PlayerInterface.h index 9ad54c7..240d961 100644 --- a/src/ui/PlayerInterface.h +++ b/src/ui/PlayerInterface.h @@ -62,10 +62,13 @@ public: Wt::WHBoxLayout* track3; TrackDetails* track1details; Wt::WPushButton* track1vote; + Wt::WText* track1votecount; TrackDetails* track2details; Wt::WPushButton* track2vote; + Wt::WText* track2votecount; TrackDetails* track3details; Wt::WPushButton* track3vote; + Wt::WText* track3votecount; bool isPaused = false; //TODO:put in controls for requesting/admin skip and adding users as admin. @@ -79,10 +82,12 @@ public: void vote3clicked(); void updateDetailsFromServer(AudioTrack track); void updateVoteableTracksFromServer(std::list tracks); + void updateVoteTrackState(); void updateProgressFromTimer(); void updateSkipRequestedFromServer(); void updateSkipDeniedFromServer(); void updateVotingEnded(AudioTrack winner); + void updateVoteCount(AudioTrack trackVoted); }; #endif // PLAYERINTERFACE_H -- GitLab