1 /*
2  *   SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
3  *
4  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5  */
6 
7 #include "ScreenshotsModel.h"
8 #include "libdiscover_debug.h"
9 #include <resources/AbstractResource.h>
10 // #include <QAbstractItemModelTester>
11 
ScreenshotsModel(QObject * parent)12 ScreenshotsModel::ScreenshotsModel(QObject *parent)
13     : QAbstractListModel(parent)
14     , m_resource(nullptr)
15 {
16 }
17 
roleNames() const18 QHash<int, QByteArray> ScreenshotsModel::roleNames() const
19 {
20     QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
21     roles.insert(ThumbnailUrl, "small_image_url");
22     roles.insert(ScreenshotUrl, "large_image_url");
23     return roles;
24 }
25 
setResource(AbstractResource * res)26 void ScreenshotsModel::setResource(AbstractResource *res)
27 {
28     if (res == m_resource)
29         return;
30 
31     if (m_resource) {
32         disconnect(m_resource, &AbstractResource::screenshotsFetched, this, &ScreenshotsModel::screenshotsFetched);
33     }
34     m_resource = res;
35     Q_EMIT resourceChanged(res);
36 
37     if (res) {
38         connect(m_resource, &AbstractResource::screenshotsFetched, this, &ScreenshotsModel::screenshotsFetched);
39         res->fetchScreenshots();
40     } else
41         qCWarning(LIBDISCOVER_LOG) << "empty resource!";
42 }
43 
resource() const44 AbstractResource *ScreenshotsModel::resource() const
45 {
46     return m_resource;
47 }
48 
screenshotsFetched(const QList<QUrl> & thumbnails,const QList<QUrl> & screenshots)49 void ScreenshotsModel::screenshotsFetched(const QList<QUrl> &thumbnails, const QList<QUrl> &screenshots)
50 {
51     Q_ASSERT(thumbnails.count() == screenshots.count());
52     if (thumbnails.isEmpty())
53         return;
54 
55     beginInsertRows(QModelIndex(), m_thumbnails.size(), m_thumbnails.size() + thumbnails.size() - 1);
56     m_thumbnails += thumbnails;
57     m_screenshots += screenshots;
58     endInsertRows();
59     Q_EMIT countChanged();
60 }
61 
data(const QModelIndex & index,int role) const62 QVariant ScreenshotsModel::data(const QModelIndex &index, int role) const
63 {
64     if (!index.isValid() || index.parent().isValid())
65         return QVariant();
66 
67     switch (role) {
68     case ThumbnailUrl:
69         return m_thumbnails[index.row()];
70     case ScreenshotUrl:
71         return m_screenshots[index.row()];
72     }
73 
74     return QVariant();
75 }
76 
rowCount(const QModelIndex & parent) const77 int ScreenshotsModel::rowCount(const QModelIndex &parent) const
78 {
79     return !parent.isValid() ? m_screenshots.count() : 0;
80 }
81 
screenshotAt(int row) const82 QUrl ScreenshotsModel::screenshotAt(int row) const
83 {
84     return m_screenshots[row];
85 }
86 
count() const87 int ScreenshotsModel::count() const
88 {
89     return m_screenshots.count();
90 }
91 
remove(const QUrl & url)92 void ScreenshotsModel::remove(const QUrl &url)
93 {
94     int idxRemove = m_thumbnails.indexOf(url);
95     if (idxRemove >= 0) {
96         beginRemoveRows({}, idxRemove, idxRemove);
97         m_thumbnails.removeAt(idxRemove);
98         m_screenshots.removeAt(idxRemove);
99         endRemoveRows();
100         Q_EMIT countChanged();
101 
102         qDebug() << "screenshot removed" << url;
103     }
104 }
105