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"