File indexing completed on 2024-04-28 15:28:57
0001 /* 0002 This file is part of KNewStuff2. 0003 SPDX-FileCopyrightText: 2006, 2007 Josef Spillner <spillner@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.1-or-later 0006 */ 0007 0008 #include "imageloader_p.h" 0009 0010 using namespace KNSCore; 0011 0012 ImageLoader::ImageLoader(const EntryInternal &entry, EntryInternal::PreviewType type, QObject *parent) 0013 : QObject(parent) 0014 , m_entry(entry) 0015 , m_previewType(type) 0016 { 0017 } 0018 0019 void ImageLoader::start() 0020 { 0021 QUrl url(m_entry.previewUrl(m_previewType)); 0022 if (!url.isEmpty()) { 0023 m_job = HTTPJob::get(url, NoReload, JobFlag::HideProgressInfo, this); 0024 connect(m_job, &KJob::result, this, &ImageLoader::slotDownload); 0025 connect(m_job, &HTTPJob::data, this, &ImageLoader::slotData); 0026 } else { 0027 Q_EMIT signalError(m_entry, m_previewType, QStringLiteral("Empty url")); 0028 deleteLater(); 0029 } 0030 } 0031 0032 KJob *ImageLoader::job() 0033 { 0034 return m_job; 0035 } 0036 0037 void ImageLoader::slotData(KJob *job, const QByteArray &buf) 0038 { 0039 Q_UNUSED(job) 0040 m_buffer.append(buf); 0041 } 0042 0043 void ImageLoader::slotDownload(KJob *job) 0044 { 0045 if (job->error()) { 0046 m_buffer.clear(); 0047 Q_EMIT signalError(m_entry, m_previewType, job->errorText()); 0048 deleteLater(); 0049 return; 0050 } 0051 QImage image; 0052 image.loadFromData(std::move(m_buffer)); 0053 0054 if (m_previewType == EntryInternal::PreviewSmall1 || m_previewType == EntryInternal::PreviewSmall2 || m_previewType == EntryInternal::PreviewSmall3) { 0055 if (image.width() > PreviewWidth || image.height() > PreviewHeight) { 0056 // if the preview is really big, first scale fast to a smaller size, then smooth to desired size 0057 if (image.width() > 4 * PreviewWidth || image.height() > 4 * PreviewHeight) { 0058 image = image.scaled(2 * PreviewWidth, 2 * PreviewHeight, Qt::KeepAspectRatio, Qt::FastTransformation); 0059 } 0060 image = image.scaled(PreviewWidth, PreviewHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); 0061 } else if (image.width() <= PreviewWidth / 2 && image.height() <= PreviewHeight / 2) { 0062 // upscale tiny previews to double size 0063 image = image.scaled(2 * image.width(), 2 * image.height()); 0064 } 0065 } 0066 0067 m_entry.setPreviewImage(image, m_previewType); 0068 Q_EMIT signalPreviewLoaded(m_entry, m_previewType); 0069 deleteLater(); 0070 } 0071 0072 #include "moc_imageloader_p.cpp"