File indexing completed on 2024-05-05 05:28:25

0001 /*
0002 
0003     SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "modulesmodel.h"
0009 
0010 #include <QQuickItem>
0011 #include <QSet>
0012 
0013 #include <KJsonUtils>
0014 #include <KPluginFactory>
0015 #include <KRuntimePlatform>
0016 
0017 #include <QDebug>
0018 
0019 ModulesModel::ModulesModel(QObject *parent)
0020     : QAbstractListModel(parent)
0021 {
0022     qDebug() << "Current platform is " << KRuntimePlatform::runtimePlatform();
0023     const auto kcms = KPluginMetaData::findPlugins("kcms")
0024         << KPluginMetaData::findPlugins("plasma/kcms") << KPluginMetaData::findPlugins("plasma/kcms/systemsettings");
0025     for (const KPluginMetaData &pluginMetaData : kcms) {
0026         bool isCurrentPlatform = false;
0027         if (KRuntimePlatform::runtimePlatform().isEmpty()) {
0028             isCurrentPlatform = true;
0029         } else {
0030             const auto platforms = KRuntimePlatform::runtimePlatform();
0031             for (const QString &platform : platforms) {
0032                 if (pluginMetaData.formFactors().contains(platform)) {
0033                     qDebug() << "Platform for " << pluginMetaData.name() << " is " << pluginMetaData.formFactors();
0034                     isCurrentPlatform = true;
0035                 }
0036             }
0037         }
0038         if (isCurrentPlatform) {
0039             Data d;
0040             d.plugin = pluginMetaData;
0041             m_plugins.append(d);
0042         }
0043     }
0044     std::sort(m_plugins.begin(), m_plugins.end(), std::less<Data>());
0045 }
0046 
0047 QVariant ModulesModel::data(const QModelIndex &index, int role) const
0048 {
0049     if (!index.isValid() || index.row() < 0 || index.row() >= rowCount()) {
0050         return {};
0051     }
0052 
0053     // NOTE: as the kcm is lazy loading, this needs to not be const
0054     // a cleaner alternative, would be a ConfigModule *loadKcm(pluginId) method, which also wouldn't risk erroneous kcm instantiation when it shouldn't
0055     Data &d = const_cast<ModulesModel *>(this)->m_plugins[index.row()];
0056 
0057     switch (role) {
0058     case NameRole:
0059         return d.plugin.name();
0060     case DescriptionRole:
0061         return d.plugin.description();
0062     case IconNameRole:
0063         return d.plugin.iconName();
0064     case IdRole:
0065         return d.plugin.pluginId();
0066     case KeywordsRole: {
0067         QStringList keywords;
0068         QJsonObject raw = d.plugin.rawData();
0069         // always include English keywords to make searching for words with accents easier
0070         keywords << raw.value(QLatin1String("X-KDE-Keywords")).toString().split(QLatin1String(","));
0071         keywords << KJsonUtils::readTranslatedString(raw, QStringLiteral("X-KDE-Keywords")).split(QLatin1String(","));
0072         return keywords;
0073     }
0074     case KcmRole: {
0075         if (!d.kcm) {
0076             d.kcm = KQuickConfigModuleLoader::loadModule(d.plugin, const_cast<ModulesModel *>(this)).plugin;
0077         }
0078 
0079         return QVariant::fromValue(d.kcm.data());
0080     }
0081     }
0082 
0083     return {};
0084 }
0085 
0086 int ModulesModel::rowCount(const QModelIndex &parent) const
0087 {
0088     return parent.isValid() ? 0 : m_plugins.size();
0089 }
0090 
0091 QHash<int, QByteArray> ModulesModel::roleNames() const
0092 {
0093     return {
0094         {NameRole, "name"},
0095         {DescriptionRole, "description"},
0096         {IconNameRole, "iconName"},
0097         {IdRole, "id"},
0098         {KcmRole, "kcm"},
0099     };
0100 }