Support toplists in the ui.

This commit is contained in:
John Maguire 2012-06-12 15:53:23 +02:00
parent 215595bfdb
commit afd42118f1
4 changed files with 46 additions and 4 deletions

View File

@ -148,6 +148,8 @@ void SpotifyServer::MessageArrived(const pb::spotify::Message& message) {
emit SyncPlaylistProgress(message.sync_playlist_progress());
} else if (message.has_browse_album_response()) {
emit AlbumBrowseResults(message.browse_album_response());
} else if (message.has_browse_toplist_response()) {
emit ToplistBrowseResults(message.browse_toplist_response());
}
}
@ -254,3 +256,12 @@ void SpotifyServer::AlbumBrowse(const QString& uri) {
req->set_uri(DataCommaSizeFromQString(uri));
SendOrQueueMessage(message);
}
void SpotifyServer::LoadToplist() {
pb::spotify::Message message;
pb::spotify::BrowseToplistRequest* req = message.mutable_browse_toplist_request();
req->set_type(pb::spotify::BrowseToplistRequest::Tracks);
req->set_region(pb::spotify::BrowseToplistRequest::Everywhere);
SendOrQueueMessage(message);
}

View File

@ -49,6 +49,7 @@ public:
void LoadImage(const QString& id);
void AlbumBrowse(const QString& uri);
void SetPlaybackSettings(pb::spotify::Bitrate bitrate, bool volume_normalisation);
void LoadToplist();
int server_port() const;
@ -69,6 +70,7 @@ signals:
void ImageLoaded(const QString& id, const QImage& image);
void SyncPlaylistProgress(const pb::spotify::SyncPlaylistProgress& progress);
void AlbumBrowseResults(const pb::spotify::BrowseAlbumResponse& response);
void ToplistBrowseResults(const pb::spotify::BrowseToplistResponse& response);
protected:
void MessageArrived(const pb::spotify::Message& message);

View File

@ -45,6 +45,7 @@ SpotifyService::SpotifyService(Application* app, InternetModel* parent)
search_(NULL),
starred_(NULL),
inbox_(NULL),
toplist_(NULL),
login_task_id_(0),
pending_search_playlist_(NULL),
context_menu_(NULL),
@ -119,6 +120,11 @@ void SpotifyService::LazyPopulate(QStandardItem* item) {
server_->LoadUserPlaylist(item->data(Role_UserPlaylistIndex).toInt());
break;
case Type_Toplist:
EnsureServerCreated();
server_->LoadToplist();
break;
default:
break;
}
@ -237,6 +243,8 @@ void SpotifyService::EnsureServerCreated(const QString& username,
SIGNAL(ImageLoaded(QString,QImage)));
connect(server_, SIGNAL(SyncPlaylistProgress(pb::spotify::SyncPlaylistProgress)),
SLOT(SyncPlaylistProgress(pb::spotify::SyncPlaylistProgress)));
connect(server_, SIGNAL(ToplistBrowseResults(pb::spotify::BrowseToplistResponse)),
SLOT(ToplistLoaded(pb::spotify::BrowseToplistResponse)));
server_->Init();
@ -345,7 +353,12 @@ void SpotifyService::PlaylistsUpdated(const pb::spotify::Playlists& response) {
inbox_->setData(Type_InboxPlaylist, InternetModel::Role_Type);
inbox_->setData(true, InternetModel::Role_CanLazyLoad);
toplist_ = new QStandardItem(QIcon(), tr("Top tracks"));
toplist_->setData(Type_Toplist, InternetModel::Role_Type);
toplist_->setData(true, InternetModel::Role_CanLazyLoad);
root_->appendRow(search_);
root_->appendRow(toplist_);
root_->appendRow(starred_);
root_->appendRow(inbox_);
}
@ -408,6 +421,10 @@ void SpotifyService::StarredLoaded(const pb::spotify::LoadPlaylistResponse& resp
FillPlaylist(starred_, response);
}
void SpotifyService::ToplistLoaded(const pb::spotify::BrowseToplistResponse& response) {
FillPlaylist(toplist_, response.track());
}
QStandardItem* SpotifyService::PlaylistBySpotifyIndex(int index) const {
foreach (QStandardItem* item, playlists_) {
if (item->data(Role_UserPlaylistIndex).toInt() == index) {
@ -425,14 +442,15 @@ void SpotifyService::UserPlaylistLoaded(const pb::spotify::LoadPlaylistResponse&
}
}
void SpotifyService::FillPlaylist(QStandardItem* item, const pb::spotify::LoadPlaylistResponse& response) {
qLog(Debug) << "Filling playlist:" << item->text();
void SpotifyService::FillPlaylist(
QStandardItem* item,
const google::protobuf::RepeatedPtrField<pb::spotify::Track>& tracks) {
if (item->hasChildren())
item->removeRows(0, item->rowCount());
for (int i=0 ; i<response.track_size() ; ++i) {
for (int i=0 ; i < tracks.size() ; ++i) {
Song song;
SongFromProtobuf(response.track(i), &song);
SongFromProtobuf(tracks.Get(i), &song);
QStandardItem* child = new QStandardItem(song.PrettyTitleWithArtist());
child->setData(Type_Track, InternetModel::Role_Type);
@ -444,6 +462,11 @@ void SpotifyService::FillPlaylist(QStandardItem* item, const pb::spotify::LoadPl
}
}
void SpotifyService::FillPlaylist(QStandardItem* item, const pb::spotify::LoadPlaylistResponse& response) {
qLog(Debug) << "Filling playlist:" << item->text();
FillPlaylist(item, response.track());
}
void SpotifyService::SongFromProtobuf(const pb::spotify::Track& track, Song* song) {
song->set_rating(track.starred() ? 1.0 : 0.0);
song->set_title(QStringFromStdString(track.title()));

View File

@ -27,6 +27,7 @@ public:
Type_StarredPlaylist,
Type_InboxPlaylist,
Type_Track,
Type_Toplist,
};
enum Role {
@ -83,6 +84,9 @@ public slots:
private:
void StartBlobProcess();
void FillPlaylist(
QStandardItem* item,
const google::protobuf::RepeatedPtrField<pb::spotify::Track>& tracks);
void FillPlaylist(QStandardItem* item, const pb::spotify::LoadPlaylistResponse& response);
void EnsureMenuCreated();
@ -101,6 +105,7 @@ private slots:
void UserPlaylistLoaded(const pb::spotify::LoadPlaylistResponse& response);
void SearchResults(const pb::spotify::SearchResponse& response);
void SyncPlaylistProgress(const pb::spotify::SyncPlaylistProgress& progress);
void ToplistLoaded(const pb::spotify::BrowseToplistResponse& response);
void OpenSearchTab();
void DoSearch();
@ -120,6 +125,7 @@ private:
QStandardItem* search_;
QStandardItem* starred_;
QStandardItem* inbox_;
QStandardItem* toplist_;
QList<QStandardItem*> playlists_;
int login_task_id_;