File indexing completed on 2024-04-28 16:44:04

0001 /*
0002  *   SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "ScreenshotsModel.h"
0008 #include "libdiscover_debug.h"
0009 #include "utils.h"
0010 #include <resources/AbstractResource.h>
0011 // #include <QAbstractItemModelTester>
0012 
0013 ScreenshotsModel::ScreenshotsModel(QObject *parent)
0014     : QAbstractListModel(parent)
0015     , m_resource(nullptr)
0016 {
0017 }
0018 
0019 QHash<int, QByteArray> ScreenshotsModel::roleNames() const
0020 {
0021     QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
0022     roles.insert(ThumbnailUrl, "small_image_url");
0023     roles.insert(ScreenshotUrl, "large_image_url");
0024     roles.insert(IsAnimatedRole, "isAnimated");
0025     return roles;
0026 }
0027 
0028 void ScreenshotsModel::setResource(AbstractResource *res)
0029 {
0030     if (res == m_resource)
0031         return;
0032 
0033     if (m_resource) {
0034         disconnect(m_resource, &AbstractResource::screenshotsFetched, this, &ScreenshotsModel::screenshotsFetched);
0035     }
0036     m_resource = res;
0037     Q_EMIT resourceChanged(res);
0038 
0039     beginResetModel();
0040     m_screenshots.clear();
0041     endResetModel();
0042 
0043     if (res) {
0044         connect(m_resource, &AbstractResource::screenshotsFetched, this, &ScreenshotsModel::screenshotsFetched);
0045         res->fetchScreenshots();
0046     } else
0047         qCWarning(LIBDISCOVER_LOG) << "empty resource!";
0048 }
0049 
0050 AbstractResource *ScreenshotsModel::resource() const
0051 {
0052     return m_resource;
0053 }
0054 
0055 void ScreenshotsModel::screenshotsFetched(const Screenshots &screenshots)
0056 {
0057     if (screenshots.isEmpty())
0058         return;
0059 
0060     beginInsertRows(QModelIndex(), m_screenshots.size(), m_screenshots.size() + screenshots.size() - 1);
0061     m_screenshots += screenshots;
0062     endInsertRows();
0063     Q_EMIT countChanged();
0064 }
0065 
0066 QVariant ScreenshotsModel::data(const QModelIndex &index, int role) const
0067 {
0068     if (!index.isValid() || index.parent().isValid())
0069         return QVariant();
0070 
0071     switch (role) {
0072     case ThumbnailUrl:
0073         return m_screenshots[index.row()].thumbnail;
0074     case ScreenshotUrl:
0075         return m_screenshots[index.row()].screenshot;
0076     case IsAnimatedRole:
0077         return m_screenshots[index.row()].isAnimated;
0078     }
0079 
0080     return QVariant();
0081 }
0082 
0083 int ScreenshotsModel::rowCount(const QModelIndex &parent) const
0084 {
0085     return !parent.isValid() ? m_screenshots.count() : 0;
0086 }
0087 
0088 QUrl ScreenshotsModel::screenshotAt(int row) const
0089 {
0090     return m_screenshots[row].screenshot;
0091 }
0092 
0093 int ScreenshotsModel::count() const
0094 {
0095     return m_screenshots.count();
0096 }
0097 
0098 void ScreenshotsModel::remove(const QUrl &url)
0099 {
0100     int idxRemove = kIndexOf(m_screenshots, [url](const Screenshot &s) {
0101         return s.thumbnail == url || s.screenshot == url;
0102     });
0103     if (idxRemove >= 0) {
0104         beginRemoveRows({}, idxRemove, idxRemove);
0105         m_screenshots.removeAt(idxRemove);
0106         endRemoveRows();
0107         Q_EMIT countChanged();
0108 
0109         qDebug() << "screenshot removed" << url;
0110     }
0111 }
0112 
0113 #include "moc_ScreenshotsModel.cpp"