/* * Copyright (C) 2017 Kevin Whitaker * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #include "PlayerInterface.h" #include #include "../GroovePlayer.h" #include #include #include #include #include PlayerInterface::PlayerInterface(WebInterface* app) { this->app = app; interfaceLayout = new Wt::WVBoxLayout(); this->setLayout(interfaceLayout); playControlLayout = new Wt::WHBoxLayout(); voteControlLayout = new Wt::WVBoxLayout(); playControlWidget = new Wt::WContainerWidget(); skipControls = new Wt::WContainerWidget(); playControlWidget->setLayout(playControlLayout); currentTrackProgress = new Wt::WProgressBar(); currentTrackProgress->setFormat(""); trackProgress = new Wt::WTimer(); trackProgress->setInterval(1000); trackProgress->timeout().connect(this,&PlayerInterface::updateProgressFromTimer); currentTrackDetails = new TrackDetails(); playpause = new Wt::WPushButton(); playpause->setTextFormat(Wt::XHTMLText); playpause->decorationStyle().font().setFamily(Wt::WFont::Default,"FontAwesome"); playpause->setText(groove_playlist_playing(GroovePlayerMgr::getInstance()->currentPlaylist)==1?Wt::WString::fromUTF8(""):Wt::WString::fromUTF8("")); playpause->setMaximumSize(Wt::WLength(60,Wt::WLength::Point),Wt::WLength(30,Wt::WLength::Point)); isPaused = groove_playlist_playing(GroovePlayerMgr::getInstance()->currentPlaylist)==0; playpause->clicked().connect(this, &PlayerInterface::playpauseClicked); skipRequest = new Wt::WPushButton(); skipRequest->clicked().connect(this, &PlayerInterface::skipRequestClicked); skipRequest->setTextFormat(Wt::XHTMLText); skipRequest->decorationStyle().font().setFamily(Wt::WFont::Default,"FontAwesome"); skipRequest->setText(""); skipDeny = new Wt::WPushButton(); skipDeny->clicked().connect(this, &PlayerInterface::skipDenyClicked); skipDeny->setTextFormat(Wt::XHTMLText); skipDeny->decorationStyle().font().setFamily(Wt::WFont::Default,"FontAwesome"); skipDeny->setText(""); skipDeny->setHidden(true); skipControls->addWidget(skipRequest); skipControls->addWidget(skipDeny); interfaceLayout->addWidget(playControlWidget); interfaceLayout->addWidget(currentTrackProgress); interfaceLayout->addLayout(voteControlLayout); playControlWidget->decorationStyle().setBorder(Wt::WBorder::Outset); playControlWidget->decorationStyle().setBackgroundColor(Wt::WColor("#00B200")); playControlLayout->addWidget(playpause,0,Wt::AlignmentFlag::AlignLeft | Wt::AlignmentFlag::AlignMiddle); playControlLayout->addWidget(currentTrackDetails); playControlLayout->addWidget(skipControls,0,Wt::AlignmentFlag::AlignRight | Wt::AlignmentFlag::AlignMiddle); } void PlayerInterface::playpauseClicked() { if(!isPaused) { GroovePlayerMgr::getInstance()->lastInternalEvents.push_back(GroovePlayerMgr::PlayerEvent() = {GroovePlayerMgr::PlayerEventType::PLAYING_PAUSED, app->currentUser, std::list{GroovePlayerMgr::getInstance()->currentTrack}}); } else { GroovePlayerMgr::getInstance()->lastInternalEvents.push_back(GroovePlayerMgr::PlayerEvent() = {GroovePlayerMgr::PlayerEventType::PLAYING_RESUMED, app->currentUser, std::list{GroovePlayerMgr::getInstance()->currentTrack}}); } } void PlayerInterface::skipRequestClicked() { if(!isPaused) { GroovePlayerMgr::getInstance()->lastInternalEvents.push_back(GroovePlayerMgr::PlayerEvent() = {GroovePlayerMgr::PlayerEventType::SKIP_REQUESTED, app->currentUser, std::list{GroovePlayerMgr::getInstance()->currentTrack}}); } } void PlayerInterface::skipDenyClicked() { if(!isPaused) { GroovePlayerMgr::getInstance()->lastInternalEvents.push_back(GroovePlayerMgr::PlayerEvent() = {GroovePlayerMgr::PlayerEventType::SKIP_VOTE_CAST_AGAINST, app->currentUser, std::list{GroovePlayerMgr::getInstance()->currentTrack}}); } } void PlayerInterface::updateSkipRequestedFromServer() { skipRequest->setHidden(true); skipDeny->setHidden(false); } void PlayerInterface::updateSkipDeniedFromServer() { skipDeny->setHidden(true); skipRequest->setHidden(false); } void PlayerInterface::updateVotingEnded() { skipRequest->setEnabled(false); } void PlayerInterface::playpauseUpdated() { if(isPaused) { skipRequest->setEnabled(false); playpause->setText(Wt::WString::fromUTF8("")); } else { if(!GroovePlayerMgr::getInstance()->voteEndedButNotNextTrackYet) skipRequest->setEnabled(true); playpause->setText(Wt::WString::fromUTF8("")); } } void PlayerInterface::updateProgressFromTimer() { if(currentTrackProgress->maximum() >= currentTrackProgress->value()+1) { double secondsIn; groove_player_position(GroovePlayerMgr::getInstance()->currentPlayer,nullptr, &secondsIn); currentTrackProgress->setValue(secondsIn); } else if(currentTrackProgress->maximum() < currentTrackProgress->value()+1) { currentTrackProgress->setValue(currentTrackProgress->maximum()); trackProgress->stop(); } } void PlayerInterface::updateDetailsFromServer(AudioTrack track) { //Find current song playing and set progress state. double secondsIn; groove_player_position(GroovePlayerMgr::getInstance()->currentPlayer,nullptr, &secondsIn); currentTrackProgress->setMaximum(track.trackLengthSeconds); currentTrackProgress->setValue(secondsIn); isPaused = groove_playlist_playing(GroovePlayerMgr::getInstance()->currentPlaylist) == 0; if(!isPaused) { trackProgress->start(); } playpauseUpdated(); if(GroovePlayerMgr::getInstance()->currentSkipRequester.size() > 0) { updateSkipRequestedFromServer(); } else { updateSkipDeniedFromServer(); } currentTrackDetails->updateWithTrackDetails(track); }