File indexing completed on 2024-05-12 16:23:39
0001 /** 0002 * SPDX-FileCopyrightText: 2020 Tobias Fella <fella@posteo.de> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include <QVariant> 0008 #include <QVector> 0009 0010 #include "database.h" 0011 #include "entriesmodel.h" 0012 #include "fetcher.h" 0013 0014 EntriesModel::EntriesModel(Feed *feed) 0015 : QAbstractListModel(feed) 0016 , m_feed(feed) 0017 { 0018 connect(&Fetcher::instance(), &Fetcher::feedUpdated, this, [this](const QString &url) { 0019 if (!m_feed || m_feed->url() == url) { 0020 beginResetModel(); 0021 for (auto &entry : m_entries) { 0022 delete entry; 0023 } 0024 m_entries.clear(); 0025 endResetModel(); 0026 } 0027 }); 0028 } 0029 0030 EntriesModel::~EntriesModel() 0031 { 0032 qDeleteAll(m_entries); 0033 } 0034 0035 QVariant EntriesModel::data(const QModelIndex &index, int role) const 0036 { 0037 if (role != 0) { 0038 return QVariant(); 0039 } 0040 if (m_entries[index.row()] == nullptr) { 0041 loadEntry(index.row()); 0042 } 0043 return QVariant::fromValue(m_entries[index.row()]); 0044 } 0045 0046 QHash<int, QByteArray> EntriesModel::roleNames() const 0047 { 0048 QHash<int, QByteArray> roleNames; 0049 roleNames[0] = "entry"; 0050 return roleNames; 0051 } 0052 0053 int EntriesModel::rowCount(const QModelIndex &parent) const 0054 { 0055 Q_UNUSED(parent) 0056 QSqlQuery query; 0057 if (m_feed) { 0058 query.prepare(QStringLiteral("SELECT COUNT() FROM Entries WHERE feed=:feed;")); 0059 query.bindValue(QStringLiteral(":feed"), m_feed->url()); 0060 } else { 0061 query.prepare(QStringLiteral("SELECT COUNT() FROM Entries;")); 0062 } 0063 Database::instance().execute(query); 0064 if (!query.next()) { 0065 qWarning() << "Failed to query feed count"; 0066 } 0067 return query.value(0).toInt(); 0068 } 0069 0070 void EntriesModel::loadEntry(int index) const 0071 { 0072 m_entries[index] = new Entry(m_feed, index); 0073 } 0074 0075 Feed *EntriesModel::feed() const 0076 { 0077 return m_feed; 0078 }