/* * Strawberry Music Player * This file was part of Clementine. * Copyright 2012, David Sansome * * Strawberry 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 3 of the License, or * (at your option) any later version. * * Strawberry 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 Strawberry. If not, see . * */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "covermanager/albumcoverloader.h" #include "standarditemiconloader.h" StandardItemIconLoader::StandardItemIconLoader(AlbumCoverLoader *cover_loader, QObject *parent) : QObject(parent), cover_loader_(cover_loader), model_(nullptr) { cover_options_.desired_height_ = 16; QObject::connect(cover_loader_, &AlbumCoverLoader::AlbumCoverLoaded, this, &StandardItemIconLoader::AlbumCoverLoaded); } void StandardItemIconLoader::SetModel(QAbstractItemModel *model) { if (model_) { QObject::disconnect(model_, &QAbstractItemModel::rowsAboutToBeRemoved, this, &StandardItemIconLoader::RowsAboutToBeRemoved); } model_ = model; QObject::connect(model_, &QAbstractItemModel::rowsAboutToBeRemoved, this, &StandardItemIconLoader::RowsAboutToBeRemoved); QObject::connect(model_, &QAbstractItemModel::modelAboutToBeReset, this, &StandardItemIconLoader::ModelReset); } void StandardItemIconLoader::LoadIcon(const QUrl &art_automatic, const QUrl &art_manual, QStandardItem *for_item) { const quint64 id = cover_loader_->LoadImageAsync(cover_options_, art_automatic, art_manual); pending_covers_[id] = for_item; } void StandardItemIconLoader::LoadIcon(const Song &song, QStandardItem *for_item) { const quint64 id = cover_loader_->LoadImageAsync(cover_options_, song); pending_covers_[id] = for_item; } void StandardItemIconLoader::RowsAboutToBeRemoved(const QModelIndex &parent, int begin, int end) { for (QMap::iterator it = pending_covers_.begin(); it != pending_covers_.end();) { const QStandardItem *item = it.value(); const QStandardItem *item_parent = item->parent(); if (item_parent && item_parent->index() == parent && item->index().row() >= begin && item->index().row() <= end) { cover_loader_->CancelTask(it.key()); it = pending_covers_.erase(it); // clazy:exclude=strict-iterators } else { ++it; } } } void StandardItemIconLoader::ModelReset() { #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) cover_loader_->CancelTasks(QSet(pending_covers_.keyBegin(), pending_covers_.keyEnd())); #else cover_loader_->CancelTasks(QSet::fromList(pending_covers_.keys())); #endif pending_covers_.clear(); } void StandardItemIconLoader::AlbumCoverLoaded(const quint64 id, const AlbumCoverLoaderResult &result) { QStandardItem *item = pending_covers_.take(id); if (!item) return; if (result.success && !result.image_scaled.isNull() && result.type != AlbumCoverLoaderResult::Type_ManuallyUnset) { item->setIcon(QIcon(QPixmap::fromImage(result.image_scaled))); } }