File indexing completed on 2024-05-05 17:32:16
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 }