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 }