void SpotifyService::PlaylistsUpdated(const spotify_pb::Playlists& response) { if (login_task_id_) { model()->task_manager()->SetTaskFinished(login_task_id_); login_task_id_ = 0; } // Create starred and inbox playlists if they're not here already if (!search_) { search_ = new QStandardItem(IconLoader::Load("edit-find"), tr("Search Spotify (opens a new tab)")); search_->setData(Type_SearchResults, InternetModel::Role_Type); search_->setData(InternetModel::PlayBehaviour_DoubleClickAction, InternetModel::Role_PlayBehaviour); starred_ = new QStandardItem(QIcon(":/star-on.png"), tr("Starred")); starred_->setData(Type_StarredPlaylist, InternetModel::Role_Type); starred_->setData(true, InternetModel::Role_CanLazyLoad); inbox_ = new QStandardItem(IconLoader::Load("mail-message"), tr("Inbox")); inbox_->setData(Type_InboxPlaylist, InternetModel::Role_Type); inbox_->setData(true, InternetModel::Role_CanLazyLoad); root_->appendRow(search_); root_->appendRow(starred_); root_->appendRow(inbox_); } // Don't do anything if the playlists haven't changed since last time. if (!DoPlaylistsDiffer(response)) { qLog(Debug) << "Playlists haven't changed - not updating"; return; } // Remove and recreate the other playlists foreach (QStandardItem* item, playlists_) { item->parent()->removeRow(item->row()); }
void SpotifyService::PlaylistsUpdated(const pb::spotify::Playlists& response) { if (login_task_id_) { app_->task_manager()->SetTaskFinished(login_task_id_); login_task_id_ = 0; } // Create starred and inbox playlists if they're not here already if (!search_) { search_ = new QStandardItem(IconLoader::Load("edit-find", IconLoader::Base), tr("Search results")); search_->setToolTip( tr("Start typing something on the search box above to " "fill this search results list")); search_->setData(Type_SearchResults, InternetModel::Role_Type); search_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); starred_ = new QStandardItem(QIcon(":/star-on.png"), tr("Starred")); starred_->setData(Type_StarredPlaylist, InternetModel::Role_Type); starred_->setData(true, InternetModel::Role_CanLazyLoad); starred_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); starred_->setData(true, InternetModel::Role_CanBeModified); inbox_ = new QStandardItem(IconLoader::Load("mail-message", IconLoader::Base), tr("Inbox")); inbox_->setData(Type_InboxPlaylist, InternetModel::Role_Type); inbox_->setData(true, InternetModel::Role_CanLazyLoad); inbox_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); toplist_ = new QStandardItem(QIcon(), tr("Top tracks")); toplist_->setData(Type_Toplist, InternetModel::Role_Type); toplist_->setData(true, InternetModel::Role_CanLazyLoad); toplist_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(search_); root_->appendRow(toplist_); root_->appendRow(starred_); root_->appendRow(inbox_); } else { // Always reset starred playlist // TODO: might be improved by including starred playlist in the response, // and reloading it only when needed, like other playlists. starred_->removeRows(0, starred_->rowCount()); LazyPopulate(starred_); } // Don't do anything if the playlists haven't changed since last time. if (!DoPlaylistsDiffer(response)) { qLog(Debug) << "Playlists haven't changed - not updating"; return; } qLog(Debug) << "Playlist have changed: updating"; // Remove and recreate the other playlists for (QStandardItem* item : playlists_) { item->parent()->removeRow(item->row()); } playlists_.clear(); for (int i = 0; i < response.playlist_size(); ++i) { const pb::spotify::Playlists::Playlist& msg = response.playlist(i); QString playlist_title = QStringFromStdString(msg.name()); if (!msg.is_mine()) { const std::string& owner = msg.owner(); playlist_title += tr(", by ") + QString::fromUtf8(owner.c_str(), owner.size()); } QStandardItem* item = new QStandardItem(playlist_title); item->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(msg.index(), Role_UserPlaylistIndex); item->setData(msg.is_mine(), InternetModel::Role_CanBeModified); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); item->setData(QUrl(QStringFromStdString(msg.uri())), InternetModel::Role_Url); root_->appendRow(item); playlists_ << item; // Preload the playlist items so that drag & drop works immediately. LazyPopulate(item); } }