File indexing completed on 2024-04-28 15:28:58

0001 /*
0002     knewstuff3/ui/itemsmodel.cpp.
0003     SPDX-FileCopyrightText: 2008 Jeremy Whiting <jpwhiting@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 
0008 #include "itemsmodel.h"
0009 
0010 #include <KLocalizedString>
0011 #include <knewstuffcore_debug.h>
0012 
0013 #include "engine.h"
0014 #include "imageloader_p.h"
0015 
0016 namespace KNSCore
0017 {
0018 ItemsModel::ItemsModel(Engine *engine, QObject *parent)
0019     : QAbstractListModel(parent)
0020     , m_engine(engine)
0021 {
0022 }
0023 
0024 ItemsModel::~ItemsModel()
0025 {
0026 }
0027 
0028 int ItemsModel::rowCount(const QModelIndex & /*parent*/) const
0029 {
0030     return m_entries.count();
0031 }
0032 
0033 QVariant ItemsModel::data(const QModelIndex &index, int role) const
0034 {
0035     if (role != Qt::UserRole) {
0036         return QVariant();
0037     }
0038     EntryInternal entry = m_entries[index.row()];
0039     return QVariant::fromValue(entry);
0040 }
0041 
0042 int ItemsModel::row(const EntryInternal &entry) const
0043 {
0044     return m_entries.indexOf(entry);
0045 }
0046 
0047 void ItemsModel::slotEntriesLoaded(const KNSCore::EntryInternal::List &entries)
0048 {
0049     for (const KNSCore::EntryInternal &entry : entries) {
0050         addEntry(entry);
0051     }
0052 }
0053 
0054 void ItemsModel::addEntry(const EntryInternal &entry)
0055 {
0056     // This might be expensive, but it avoids duplicates, which is not awesome for the user
0057     if (!m_entries.contains(entry)) {
0058         QString preview = entry.previewUrl(EntryInternal::PreviewSmall1);
0059         if (!m_hasPreviewImages && !preview.isEmpty()) {
0060             m_hasPreviewImages = true;
0061             if (rowCount() > 0) {
0062                 Q_EMIT dataChanged(index(0, 0), index(rowCount() - 1, 0));
0063             }
0064         }
0065 
0066         qCDebug(KNEWSTUFFCORE) << "adding entry " << entry.name() << " to the model";
0067         beginInsertRows(QModelIndex(), m_entries.count(), m_entries.count());
0068         m_entries.append(entry);
0069         endInsertRows();
0070 
0071         if (!preview.isEmpty() && entry.previewImage(EntryInternal::PreviewSmall1).isNull()) {
0072             m_engine->loadPreview(entry, EntryInternal::PreviewSmall1);
0073         }
0074     }
0075 }
0076 
0077 void ItemsModel::removeEntry(const EntryInternal &entry)
0078 {
0079     qCDebug(KNEWSTUFFCORE) << "removing entry " << entry.name() << " from the model";
0080     int index = m_entries.indexOf(entry);
0081     if (index > -1) {
0082         beginRemoveRows(QModelIndex(), index, index);
0083         m_entries.removeAt(index);
0084         endRemoveRows();
0085     }
0086 }
0087 
0088 void ItemsModel::slotEntryChanged(const EntryInternal &entry)
0089 {
0090     int i = m_entries.indexOf(entry);
0091     QModelIndex entryIndex = index(i, 0);
0092     Q_EMIT dataChanged(entryIndex, entryIndex);
0093 }
0094 
0095 void ItemsModel::clearEntries()
0096 {
0097     beginResetModel();
0098     m_entries.clear();
0099     endResetModel();
0100 }
0101 
0102 void ItemsModel::slotEntryPreviewLoaded(const EntryInternal &entry, EntryInternal::PreviewType type)
0103 {
0104     // we only care about the first small preview in the list
0105     if (type != EntryInternal::PreviewSmall1) {
0106         return;
0107     }
0108     slotEntryChanged(entry);
0109 }
0110 
0111 bool ItemsModel::hasPreviewImages() const
0112 {
0113     return m_hasPreviewImages;
0114 }
0115 
0116 } // end KNS namespace
0117 
0118 #include "moc_itemsmodel.cpp"