File indexing completed on 2024-05-12 16:59:42

0001 /*
0002     SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
0003     SPDX-FileCopyrightText: 2022 Fushan Wen <qydwhotmail@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "potdprovidermodel.h"
0009 
0010 PotdProviderModel::PotdProviderModel(QObject *parent)
0011     : QAbstractListModel(parent)
0012 {
0013     loadPluginMetaData();
0014 }
0015 
0016 int PotdProviderModel::rowCount(const QModelIndex &parent) const
0017 {
0018     if (parent.isValid()) {
0019         return 0;
0020     }
0021 
0022     return m_providers.size();
0023 }
0024 
0025 QVariant PotdProviderModel::data(const QModelIndex &index, int role) const
0026 {
0027     if (!index.isValid() || index.row() >= static_cast<int>(m_providers.size())) {
0028         return QVariant();
0029     }
0030 
0031     const KPluginMetaData &item = m_providers.at(index.row());
0032 
0033     switch (role) {
0034     case Qt::DisplayRole:
0035         return item.name();
0036     case Qt::DecorationRole:
0037         return item.iconName();
0038     case Roles::Id:
0039         return item.value(QStringLiteral("X-KDE-PlasmaPoTDProvider-Identifier"));
0040     case Roles::NotSafeForWork: {
0041         return item.value(QStringLiteral("X-KDE-PlasmaPoTDProvider-NotSafeForWork"), false);
0042     }
0043     default:
0044         return QVariant();
0045     }
0046 }
0047 
0048 QHash<int, QByteArray> PotdProviderModel::roleNames() const
0049 {
0050     return {
0051         {Qt::DisplayRole, "display"},
0052         {Qt::DecorationRole, "decoration"},
0053         {Roles::Id, "id"},
0054         {Roles::NotSafeForWork, "notSafeForWork"},
0055     };
0056 }
0057 
0058 int PotdProviderModel::indexOf(const QString &identifier)
0059 {
0060     auto it = std::find_if(m_providers.cbegin(), m_providers.cend(), [&identifier](const KPluginMetaData &metadata) {
0061         return identifier == metadata.value(QStringLiteral("X-KDE-PlasmaPoTDProvider-Identifier"));
0062     });
0063 
0064     if (it == m_providers.cend()) {
0065         return 0;
0066     }
0067 
0068     return std::distance(m_providers.cbegin(), it);
0069 }
0070 
0071 bool PotdProviderModel::isNSFW(int row)
0072 {
0073     return index(row, 0).data(Roles::NotSafeForWork).toBool();
0074 }
0075 
0076 void PotdProviderModel::loadPluginMetaData()
0077 {
0078     const QVector<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("potd"));
0079 
0080     beginResetModel();
0081 
0082     m_providers.clear();
0083     m_providers.reserve(plugins.size());
0084 
0085     std::copy_if(plugins.cbegin(), plugins.cend(), std::back_inserter(m_providers), [](const KPluginMetaData &metadata) {
0086         return !metadata.value(QStringLiteral("X-KDE-PlasmaPoTDProvider-Identifier")).isEmpty();
0087     });
0088 
0089     endResetModel();
0090 }