diff --git a/CMakeLists.txt b/CMakeLists.txt index b74af1dcfe80a7a23d4bed39f06caa461a1edb7a..10a619df234fe045bb3e2976499da3be8bc6c8fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,6 @@ find_package(Groove REQUIRED) find_package(TagLib REQUIRED) add_executable(arbitrateor src/main.cpp src/WebInterface.cpp src/GroovePlayer.cpp src/ui/LoginInterface.cpp src/ui/PlayerInterface.cpp src/ui/TrackDetails.cpp) -target_link_libraries(arbitrateor ${Wt_LIBRARIES} ${GROOVE_LIBRARY} ${GROOVE_FINGERPRINT_LIBRARY} ${GROOVE_PLAYER_LIBRARY} ${TAGLIB_LIBRARY} pthread stdc++fs) #TODO get threading links based on platform. Remove gcc experimental fs when official c++17 exists. +target_link_libraries(arbitrateor ${Wt_LIBRARIES} ${GROOVE_LIBRARY} ${GROOVE_FINGERPRINT_LIBRARY} ${GROOVE_PLAYER_LIBRARY} ${TAGLIB_LIBRARY} pthread boost_system stdc++fs) #TODO get threading links based on platform. Remove gcc experimental fs when official c++17 exists. install(TARGETS arbitrateor RUNTIME DESTINATION bin) diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index 5ca4fd14a74d12ef6aeefceef80e3900ec1aaed6..106b5ef0c56811d795314d4a7a63c7f0f7323cfa 100644 --- a/src/GroovePlayer.cpp +++ b/src/GroovePlayer.cpp @@ -221,14 +221,6 @@ void GroovePlayerMgr::grooveEventLoop() //Now boostrap player with initial data groove_player_attach(player, playlist); groove_playlist_play(playlist); - Wt::WServer::instance()->postAll([&]() { - Wt::WApplication* app = Wt::WApplication::instance(); - if(app != nullptr) - { - static_cast(app)->songChangedFromServer(currentTrack); - } - } - ); //Now start loop while(getInstance()->continueEventLoop) @@ -243,6 +235,7 @@ void GroovePlayerMgr::grooveEventLoop() { currentSkipRequester.clear(); currentTrack = getCurrentTrackDB(&sqlSession); + getPictureFromTrack(¤tTrack); //Pick new batch of tracks to vote on and inform UI of update. currentVoteBatch = getNextVoteBatch(&sqlSession); currentVoteStatus = std::list>(); diff --git a/src/ui/PlayerInterface.cpp b/src/ui/PlayerInterface.cpp index 21a6559a6706d503e926a76ecbca0683ce306800..babfdcaed0d089ab7d444b8ddc7f6ef9dd96fb28 100644 --- a/src/ui/PlayerInterface.cpp +++ b/src/ui/PlayerInterface.cpp @@ -21,35 +21,33 @@ #include #include "../GroovePlayer.h" #include +#include PlayerInterface::PlayerInterface(WebInterface* app) { this->app = app; interfaceLayout = new Wt::WVBoxLayout(); this->setLayout(interfaceLayout); - playControlContainer = new Wt::WContainerWidget(); - voteControlContainer = new Wt::WContainerWidget(); playControlLayout = new Wt::WHBoxLayout(); voteControlLayout = new Wt::WVBoxLayout(); - playControlContainer->setLayout(playControlLayout); - voteControlContainer->setLayout(voteControlLayout); currentTrackProgress = new Wt::WProgressBar(); currentTrackProgress->setFormat(""); trackProgress = new Wt::WTimer(); trackProgress->setInterval(1000); trackProgress->timeout().connect(this,&PlayerInterface::updateProgressFromTimer); - //TODO:track details + currentTrackDetails = new TrackDetails(); playpause = new Wt::WPushButton(); playpause->setText(groove_playlist_playing(GroovePlayerMgr::getInstance()->currentPlaylist)==1?"Pause":"Resume"); + 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); - interfaceLayout->addWidget(playControlContainer); + interfaceLayout->addLayout(playControlLayout); interfaceLayout->addWidget(currentTrackProgress); - interfaceLayout->addWidget(voteControlContainer); - //TODO:add track details - playControlLayout->addWidget(playpause); + interfaceLayout->addLayout(voteControlLayout); + playControlLayout->addWidget(playpause,0,Wt::AlignmentFlag::AlignCenter | Wt::AlignmentFlag::AlignMiddle); + playControlLayout->addWidget(currentTrackDetails); } void PlayerInterface::playpauseClicked() @@ -93,7 +91,6 @@ void PlayerInterface::updateProgressFromTimer() void PlayerInterface::updateDetailsFromServer(AudioTrack track) { - //TODO: request current player state. //Find current song playing and set progress state. double secondsIn; groove_player_position(GroovePlayerMgr::getInstance()->currentPlayer,nullptr, &secondsIn); @@ -105,4 +102,5 @@ void PlayerInterface::updateDetailsFromServer(AudioTrack track) trackProgress->start(); } playpauseUpdated(); + currentTrackDetails->updateWithTrackDetails(track); } diff --git a/src/ui/PlayerInterface.h b/src/ui/PlayerInterface.h index 0c64d4737be536b65c1260b341ca830c852219dc..7bd14bcc5b9f8cf648d5ffc1c45e4a75c855d72d 100644 --- a/src/ui/PlayerInterface.h +++ b/src/ui/PlayerInterface.h @@ -37,10 +37,8 @@ public: WebInterface* app; Wt::WVBoxLayout* interfaceLayout; - Wt::WContainerWidget* playControlContainer; Wt::WHBoxLayout* playControlLayout; Wt::WVBoxLayout* voteControlLayout; - Wt::WContainerWidget* voteControlContainer; //Play controls TrackDetails* currentTrackDetails; diff --git a/src/ui/TrackDetails.cpp b/src/ui/TrackDetails.cpp index 9656257fe154e178348bbf42d706f78ca4cfd9fe..f44b496e05c0a2cd8c9409113b856c079129cca2 100644 --- a/src/ui/TrackDetails.cpp +++ b/src/ui/TrackDetails.cpp @@ -18,3 +18,37 @@ */ #include "TrackDetails.h" +#include + +TrackDetails::TrackDetails() +{ + mainLayout = new Wt::WHBoxLayout(); + this->setLayout(mainLayout); + metaContainer = new Wt::WContainerWidget(); + metaLayout = new Wt::WVBoxLayout(); + metaContainer->setLayout(metaLayout); + coverData = new Wt::WMemoryResource(); + albumCover = new Wt::WImage(); + albumCover->setMinimumSize(Wt::WLength(100,Wt::WLength::Pixel),Wt::WLength(100,Wt::WLength::Pixel)); + albumCover->setMaximumSize(Wt::WLength(200,Wt::WLength::Pixel),Wt::WLength(200,Wt::WLength::Pixel)); + mainLayout->addWidget(albumCover); + mainLayout->addWidget(metaContainer); + trackTitle = new Wt::WText(); + trackArtist = new Wt::WText(); + trackAlbum = new Wt::WText(); + metaLayout->addWidget(trackTitle); + metaLayout->addWidget(trackArtist); + metaLayout->addWidget(trackAlbum); +} + +void TrackDetails::updateWithTrackDetails(AudioTrack track) +{ + trackTitle->setText(track.trackName); + trackArtist->setText(track.trackArtistName); + trackAlbum->setText(track.trackAlbumName); + + //Set image to data from track obj. + coverData = new Wt::WMemoryResource(track.coverMimeType); + coverData->setData((unsigned char*)track.coverArt.data(),std::stoi(std::to_string(track.coverArt.size()))); + albumCover->setResource(coverData); +} diff --git a/src/ui/TrackDetails.h b/src/ui/TrackDetails.h index b01f73eb71b986a30ffedb6e372d52e3e727a65c..08c37b59764d53fcab53d2bb8cf7f14006e6fe6b 100644 --- a/src/ui/TrackDetails.h +++ b/src/ui/TrackDetails.h @@ -21,9 +21,28 @@ #define TRACKDETAILS_H #include +#include +#include +#include +#include +#include +#include "../db/AudioTrack.h" -class TrackDetails : Wt::WContainerWidget +class TrackDetails : public Wt::WContainerWidget { +public: + TrackDetails(); + Wt::WHBoxLayout* mainLayout; + Wt::WContainerWidget* metaContainer; + Wt::WVBoxLayout* metaLayout; + + Wt::WImage* albumCover; + Wt::WMemoryResource* coverData; + Wt::WText* trackTitle; + Wt::WText* trackArtist; + Wt::WText* trackAlbum; + + void updateWithTrackDetails(AudioTrack track); }; #endif // TRACKDETAILS_H